diff --git a/.github/scripts/tests/test_validate_testnet_bens.py b/.github/scripts/tests/test_validate_testnet_bens.py index bcb4fea8d4c..87761a30951 100644 --- a/.github/scripts/tests/test_validate_testnet_bens.py +++ b/.github/scripts/tests/test_validate_testnet_bens.py @@ -54,10 +54,6 @@ def test_bens_database_password_is_not_hardcoded(self): def test_bens_uses_canonical_testnet_rpcs(self): public_rpc = "https://test.doschain.com/" - internal_rpc = ( - "http://10.148.0.7:9650/ext/bc/" - "JASJZyVTWR7aviy4eY5yE8AVfdXtH33c1AinvzhLcVBARhcm9/rpc" - ) template = json.loads( (ROOT / "docker-compose" / "bens" / "config.template.json").read_text( encoding="utf-8" @@ -72,11 +68,11 @@ def test_bens_uses_canonical_testnet_rpcs(self): retry_script = RPC_RETRY_SCRIPT.read_text(encoding="utf-8") self.assertEqual( - internal_rpc, + public_rpc, template["subgraphs_reader"]["networks"]["3939"]["rpc_url"], ) - self.assertIn(f"ethereum: dos-testnet:{internal_rpc}", compose) - self.assertNotIn("ethereum: dos-testnet:https://test.doschain.com/", compose) + self.assertIn(f"ethereum: dos-testnet:{public_rpc}", compose) + self.assertNotIn("ethereum: dos-testnet:http://10.148.0.7:9650/", compose) bytecode_gate = workflow.split('contract_code="$(\n', 1)[1].split( 'if [ "${contract_code}"', 1 )[0] @@ -154,6 +150,36 @@ def test_account_abstraction_uses_the_canonical_blockscout_database(self): ) self.assertNotIn("pg_dump -U postgres -Fc blockscout", testnet_deploy) + def test_push_deploys_only_affected_environment(self): + workflow = ( + ROOT / ".github" / "workflows" / "deploy-config.yml" + ).read_text(encoding="utf-8") + changes_job = workflow.split(" changes:", 1)[1].split( + "\n deploy-mainnet:", 1 + )[0] + mainnet_job = workflow.split(" deploy-mainnet:", 1)[1].split( + "\n deploy-testnet:", 1 + )[0] + testnet_job = workflow.split(" deploy-testnet:", 1)[1].split( + "\n deploy-beta:", 1 + )[0] + + self.assertIn("needs: changes", mainnet_job) + self.assertIn("needs.changes.outputs.mainnet == 'true'", mainnet_job) + self.assertIn("needs: changes", testnet_job) + self.assertIn("needs.changes.outputs.testnet == 'true'", testnet_job) + self.assertIn("fetch-depth: 0", changes_job) + self.assertIn("${{ github.event.before }}", changes_job) + self.assertIn('git hash-object -t tree /dev/null', changes_job) + self.assertIn('git diff --name-only "${diff_base}" "${GITHUB_SHA}"', changes_job) + self.assertIn("docker-compose/docker-compose-mainnet.yml", changes_job) + self.assertIn("docker-compose/docker-compose-testnet.yml", changes_job) + self.assertIn("docker-compose/bens/config.template.json", changes_job) + self.assertIn("DOS_NAMES_MAINNET_SUBGRAPH_REF", changes_job) + self.assertIn("DOS_NAMES_TESTNET_SUBGRAPH_REF", changes_job) + self.assertIn("mainnet=true", changes_job) + self.assertIn("testnet=true", changes_job) + def test_deployment_builds_and_verifies_immutable_account_abstraction_sources( self, ): @@ -521,7 +547,7 @@ def test_deployment_fetches_an_immutable_dos_names_revision(self): self.assertRegex( workflow, - r"DOS_NAMES_SUBGRAPH_REF: [0-9a-f]{40}", + r"DOS_NAMES_TESTNET_SUBGRAPH_REF: [0-9a-f]{40}", ) self.assertIn( "https://github.com/DOS/DOS-Names-Contracts.git", diff --git a/.github/workflows/dependency-build.yml b/.github/workflows/dependency-build.yml index 623f26b4884..ab11ad6cfe1 100644 --- a/.github/workflows/dependency-build.yml +++ b/.github/workflows/dependency-build.yml @@ -53,7 +53,7 @@ env: ELIXIR_VERSION: "1.19.4" MIX_ENV: prod DOS_NAMES_REPOSITORY: https://github.com/DOS/DOS-Names-Contracts.git - DOS_NAMES_SUBGRAPH_REF: 6224395661280a739c20ebd8a420913a0dd7fd6e + DOS_NAMES_SUBGRAPH_REF: 130d42ae22881896cab89e33c3c3c096b9b8e989 AA_SOURCE_REPOSITORY: https://github.com/eth-infinitism/account-abstraction.git AA_SOURCE_REF: 4cbc06072cdc19fd60f285c5997f4f7f57a588de diff --git a/.github/workflows/deploy-config.yml b/.github/workflows/deploy-config.yml index 0f7958a7fda..e2378d79c3b 100644 --- a/.github/workflows/deploy-config.yml +++ b/.github/workflows/deploy-config.yml @@ -64,14 +64,73 @@ env: GCP_TESTNET_ZONE: asia-southeast1-a GCP_TESTNET_INSTANCE: dos-testnet-r0 DOS_NAMES_REPOSITORY: https://github.com/DOS/DOS-Names-Contracts.git - DOS_NAMES_SUBGRAPH_REF: 6224395661280a739c20ebd8a420913a0dd7fd6e + DOS_NAMES_MAINNET_SUBGRAPH_REF: 6224395661280a739c20ebd8a420913a0dd7fd6e + DOS_NAMES_TESTNET_SUBGRAPH_REF: 130d42ae22881896cab89e33c3c3c096b9b8e989 jobs: + changes: + if: github.ref == 'refs/heads/main' + runs-on: ubuntu-latest + outputs: + mainnet: ${{ steps.targets.outputs.mainnet }} + testnet: ${{ steps.targets.outputs.testnet }} + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + fetch-depth: 0 + + - id: targets + shell: bash + run: | + set -euo pipefail + mainnet=false + testnet=false + + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then + case "${{ inputs.environment }}" in + mainnet) mainnet=true ;; + testnet) testnet=true ;; + esac + else + before="${{ github.event.before }}" + if [[ "${before}" =~ ^0+$ ]]; then + diff_base="$(git hash-object -t tree /dev/null)" + else + diff_base="${before}" + fi + changed_files="$(git diff --name-only "${diff_base}" "${GITHUB_SHA}")" + + printf '%s\n' "${changed_files}" + while IFS= read -r file; do + case "${file}" in + docker-compose/docker-compose-mainnet.yml|docker-compose/docker-compose-gcp-edge.yml|docker-compose/docker-compose-gcp-edge.override.yml|docker-compose/Caddyfile-gcp-mainnet|docker-compose/Caddyfile-gcp-edge|docker-compose/bens/config.mainnet.template.json|docker-compose/configs/interchain-indexer-chains.json|docker-compose/configs/interchain-indexer-bridges.json|docker-compose/envs/common-blockscout-mainnet.env|docker-compose/envs/common-frontend-scan.env|scripts/render-mainnet-bens.py|.github/scripts/extract-mainnet-aa-verification-inputs.mjs|.github/scripts/mainnet-aa-solc/*|.github/scripts/mainnet-bens-runtime.sh|.github/scripts/mainnet-bens-ui.spec.mjs|.github/scripts/mainnet-aa-source-ui.spec.mjs|.github/scripts/prepare-mainnet-aa-verification.sh|.github/scripts/verify-mainnet-aa-bytecode.mjs|.github/scripts/verify-mainnet-aa-sources.sh) + mainnet=true + ;; + docker-compose/docker-compose-testnet.yml|docker-compose/Caddyfile-gcp-testnet|docker-compose/bens/config.template.json|docker-compose/envs/common-blockscout-testnet.env|docker-compose/envs/common-frontend-testnet.env|scripts/render-testnet-bens.py|scripts/validate-testnet-bens.py|.github/scripts/extract-aa-verification-inputs.mjs|.github/scripts/testnet-bens-ui.spec.mjs|.github/scripts/verify-testnet-aa-sources.sh) + testnet=true + ;; + docker-compose/bens/*|docker-compose/envs/common-blockscout.env|docker-compose/envs/common-frontend.env|docker-compose/envs/common-smart-contract-verifier.env|docker-compose/envs/common-visualizer.env|scripts/validate-blockscout-env-parity.py) + mainnet=true + testnet=true + ;; + esac + done <<< "${changed_files}" + + workflow_diff="$(git diff --unified=0 "${diff_base}" "${GITHUB_SHA}" -- .github/workflows/deploy-config.yml)" + if grep -Eq '^[+-] DOS_NAMES_MAINNET_SUBGRAPH_REF:' <<< "${workflow_diff}"; then + mainnet=true + fi + if grep -Eq '^[+-] DOS_NAMES_TESTNET_SUBGRAPH_REF:' <<< "${workflow_diff}"; then + testnet=true + fi + fi + + echo "mainnet=${mainnet}" >> "${GITHUB_OUTPUT}" + echo "testnet=${testnet}" >> "${GITHUB_OUTPUT}" + deploy-mainnet: - if: > - github.ref == 'refs/heads/main' && - (github.event_name == 'push' || - (github.event_name == 'workflow_dispatch' && inputs.environment == 'mainnet')) + needs: changes + if: needs.changes.outputs.mainnet == 'true' runs-on: ubuntu-latest environment: mainnet env: @@ -154,9 +213,9 @@ jobs: git -C "${checkout}" fetch --filter=blob:none origin \ refs/heads/dos:refs/remotes/origin/dos git -C "${checkout}" merge-base --is-ancestor \ - "${DOS_NAMES_SUBGRAPH_REF}" refs/remotes/origin/dos - git -C "${checkout}" checkout --detach -q "${DOS_NAMES_SUBGRAPH_REF}" - [ "$(git -C "${checkout}" rev-parse HEAD)" = "${DOS_NAMES_SUBGRAPH_REF}" ] + "${DOS_NAMES_MAINNET_SUBGRAPH_REF}" refs/remotes/origin/dos + git -C "${checkout}" checkout --detach -q "${DOS_NAMES_MAINNET_SUBGRAPH_REF}" + [ "$(git -C "${checkout}" rev-parse HEAD)" = "${DOS_NAMES_MAINNET_SUBGRAPH_REF}" ] test -f "${checkout}/subgraph/dos-names/subgraph.template.yaml" test -f "${checkout}/contracts/deployments/dos-mainnet-7979.json" cp -a "${checkout}/subgraph/dos-names" docker-compose/bens/subgraph @@ -756,11 +815,8 @@ jobs: --reporter=line deploy-testnet: - if: > - github.ref == 'refs/heads/main' && - (github.event_name == 'push' || - (github.event_name == 'workflow_dispatch' && inputs.environment == 'testnet') - ) + needs: changes + if: needs.changes.outputs.testnet == 'true' runs-on: ubuntu-latest environment: testnet env: @@ -825,9 +881,9 @@ jobs: git -C "${checkout}" fetch --filter=blob:none origin \ refs/heads/dos:refs/remotes/origin/dos git -C "${checkout}" merge-base --is-ancestor \ - "${DOS_NAMES_SUBGRAPH_REF}" refs/remotes/origin/dos - git -C "${checkout}" checkout --detach -q "${DOS_NAMES_SUBGRAPH_REF}" - [ "$(git -C "${checkout}" rev-parse HEAD)" = "${DOS_NAMES_SUBGRAPH_REF}" ] + "${DOS_NAMES_TESTNET_SUBGRAPH_REF}" refs/remotes/origin/dos + git -C "${checkout}" checkout --detach -q "${DOS_NAMES_TESTNET_SUBGRAPH_REF}" + [ "$(git -C "${checkout}" rev-parse HEAD)" = "${DOS_NAMES_TESTNET_SUBGRAPH_REF}" ] test -f "${checkout}/subgraph/dos-names/subgraph.template.yaml" test -f "${checkout}/contracts/deployments/dos-testnet-3939.json" cp -a "${checkout}/subgraph/dos-names" docker-compose/bens/subgraph diff --git a/docker-compose/bens/config.template.json b/docker-compose/bens/config.template.json index 1496f347ed7..f97335299a7 100644 --- a/docker-compose/bens/config.template.json +++ b/docker-compose/bens/config.template.json @@ -8,7 +8,7 @@ "url": "http://backend:4000" }, "use_protocols": ["dos-names"], - "rpc_url": "http://10.148.0.7:9650/ext/bc/JASJZyVTWR7aviy4eY5yE8AVfdXtH33c1AinvzhLcVBARhcm9/rpc" + "rpc_url": "https://test.doschain.com/" } }, "protocols": { diff --git a/docker-compose/docker-compose-testnet.yml b/docker-compose/docker-compose-testnet.yml index ca80674a364..7757493df76 100644 --- a/docker-compose/docker-compose-testnet.yml +++ b/docker-compose/docker-compose-testnet.yml @@ -91,7 +91,7 @@ services: postgres_user: graph-node postgres_db: graph-node ipfs: bens-ipfs:5001 - ethereum: dos-testnet:http://10.148.0.7:9650/ext/bc/JASJZyVTWR7aviy4eY5yE8AVfdXtH33c1AinvzhLcVBARhcm9/rpc + ethereum: dos-testnet:https://test.doschain.com/ GRAPH_LOG: info bens: diff --git a/scripts/validate-testnet-bens.py b/scripts/validate-testnet-bens.py index 4ba30f5a8a1..a8b4fc282a1 100644 --- a/scripts/validate-testnet-bens.py +++ b/scripts/validate-testnet-bens.py @@ -21,10 +21,7 @@ SUBGRAPH_DEPLOY_SCRIPT = ROOT / "docker-compose" / "bens" / "deploy-subgraph.sh" CANONICAL_TESTNET_BLOCKCHAIN = "JASJZyVTWR7aviy4eY5yE8AVfdXtH33c1AinvzhLcVBARhcm9" RETIRED_TESTNET_BLOCKCHAIN = "2EhCz8u48mSCUzxEEGsqY7d1PnqUKkc2B1zkTQaJxbT99wshkJ" -CANONICAL_TESTNET_INTERNAL_RPC = ( - "http://10.148.0.7:9650/ext/bc/" - f"{CANONICAL_TESTNET_BLOCKCHAIN}/rpc" -) +CANONICAL_TESTNET_BENS_RPC = "https://test.doschain.com/" CANONICAL_BLOCKSCOUT_DB = "blockscout_jasj_20260809" @@ -88,8 +85,8 @@ def validate() -> list[str]: ) if caddy.count('X-DOS-RPC-Origin "dos-testnet-r0-JASJZyVT"') != 2: errors.append("Caddy must identify both canonical Testnet RPC routes") - if f"ethereum: dos-testnet:{CANONICAL_TESTNET_INTERNAL_RPC}" not in compose: - errors.append("Graph Node must bootstrap from the canonical internal Testnet RPC") + if f"ethereum: dos-testnet:{CANONICAL_TESTNET_BENS_RPC}" not in compose: + errors.append("Graph Node must bootstrap from the canonical public Testnet RPC") canonical_database_url = ( f"postgresql://postgres:@db:5432/{CANONICAL_BLOCKSCOUT_DB}" @@ -190,10 +187,10 @@ def validate() -> list[str]: errors.append("ENSv2 token IDs must not use the ENSv1 native NFT mapping") if networks.get("3939", {}).get("use_protocols") != ["dos-names"]: errors.append("BENS network 3939 must enable only dos-names") - if networks.get("3939", {}).get("rpc_url") != CANONICAL_TESTNET_INTERNAL_RPC: - errors.append("BENS must use the canonical internal Testnet RPC") + if networks.get("3939", {}).get("rpc_url") != CANONICAL_TESTNET_BENS_RPC: + errors.append("BENS must use the canonical public Testnet RPC") - ref_match = re.search(r"DOS_NAMES_SUBGRAPH_REF: ([0-9a-f]{40})", workflow) + ref_match = re.search(r"DOS_NAMES_TESTNET_SUBGRAPH_REF: ([0-9a-f]{40})", workflow) if ref_match is None: errors.append("The deployment workflow must pin a full DOS Names commit") if "https://github.com/DOS/DOS-Names-Contracts.git" not in workflow: