name: Blockscout on: push: branches: - master - production-arbitrum - production-core - production-eth-sepolia - production-filecoin - production-fuse - production-optimism - production-immutable - production-iota - production-lukso - production-rsk - production-sokol - production-suave - production-xdai - production-zkevm - production-zksync - staging-l2 paths-ignore: - 'CHANGELOG.md' - '**/README.md' - 'docker/*' - 'docker-compose/*' pull_request: types: [opened, synchronize, reopened, labeled] branches: - master env: MIX_ENV: test OTP_VERSION: ${{ github.ref_name == '10284/merge' && '27.1' || vars.OTP_VERSION }} ELIXIR_VERSION: ${{ github.ref_name == '10284/merge' && '1.17.3' || vars.ELIXIR_VERSION }} ACCOUNT_AUTH0_DOMAIN: "blockscoutcom.us.auth0.com" jobs: matrix-builder: name: Build matrix runs-on: ubuntu-latest outputs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - id: set-matrix run: | echo "matrix=$(node -e ' // Add/remove CI matrix chain types here const defaultChainTypes = ["default"]; const chainTypes = [ "arbitrum", "blackfort", "celo", "ethereum", "filecoin", "optimism", "polygon_zkevm", "rsk", "scroll", "shibarium", "stability", "zetachain", "zilliqa", "zksync" ]; const extraChainTypes = ["suave", "polygon_edge"]; // Chain type matrix we use in master branch const allChainTypes = [].concat(defaultChainTypes, chainTypes, extraChainTypes); const labels = ${{ github.event_name == 'pull_request' && toJson(github.event.pull_request.labels.*.name) || '[]' }}; const ciLabels = labels.filter(label => label.startsWith("ci:")); const labeledChainTypes = [].concat( defaultChainTypes.filter(chainType => ciLabels.includes("ci:" + chainType)), chainTypes.filter(chainType => ciLabels.includes("ci:all") || ciLabels.includes("ci:" + chainType)), extraChainTypes.filter(chainType => ciLabels.includes("ci:" + chainType)) ); // Chain type matrix we use in PRs to master branch const ciChainTypes = labeledChainTypes.length > 0 ? labeledChainTypes : defaultChainTypes; const matrix = { "chain-type": ${{ github.event_name == 'pull_request' && 'ciChainTypes' || 'allChainTypes' }} }; console.log(JSON.stringify(matrix)); ')" >> $GITHUB_OUTPUT build-and-cache: name: Build and Cache deps runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: erlef/setup-beam@v1 with: otp-version: ${{ env.OTP_VERSION }} elixir-version: ${{ env.ELIXIR_VERSION }} hexpm-mirrors: | https://builds.hex.pm https://cdn.jsdelivr.net/hex - name: "ELIXIR_VERSION.lock" run: echo "${ELIXIR_VERSION}" > ELIXIR_VERSION.lock - name: "OTP_VERSION.lock" run: echo "${OTP_VERSION}" > OTP_VERSION.lock - name: Restore Mix Deps Cache uses: actions/cache@v4 id: deps-cache with: path: | deps _build key: ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-deps-mixlockhash-${{ hashFiles('mix.lock') }} restore-keys: | ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-deps-mixlockhash- - name: Conditionally build Mix deps cache if: steps.deps-cache.outputs.cache-hit != 'true' run: | mix local.hex --force mix local.rebar --force mix deps.get mix deps.compile --skip-umbrella-children - name: Restore Explorer NPM Cache uses: actions/cache@v4 id: explorer-npm-cache with: path: apps/explorer/node_modules key: ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-explorer-npm-${{ hashFiles('apps/explorer/package-lock.json') }} restore-keys: | ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-explorer-npm- - name: Conditionally build Explorer NPM Cache if: steps.explorer-npm-cache.outputs.cache-hit != 'true' run: npm install working-directory: apps/explorer - name: Restore Blockscout Web NPM Cache uses: actions/cache@v4 id: blockscoutweb-npm-cache with: path: apps/block_scout_web/assets/node_modules key: ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-blockscoutweb-npm-${{ hashFiles('apps/block_scout_web/assets/package-lock.json') }} restore-keys: | ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-blockscoutweb-npm- - name: Conditionally build Blockscout Web NPM Cache if: steps.blockscoutweb-npm-cache.outputs.cache-hit != 'true' run: npm install working-directory: apps/block_scout_web/assets credo: name: Credo runs-on: ubuntu-latest needs: build-and-cache steps: - uses: actions/checkout@v4 - uses: erlef/setup-beam@v1 with: otp-version: ${{ env.OTP_VERSION }} elixir-version: ${{ env.ELIXIR_VERSION }} hexpm-mirrors: | https://builds.hex.pm https://cdn.jsdelivr.net/hex - name: Restore Mix Deps Cache uses: actions/cache/restore@v4 id: deps-cache with: path: | deps _build key: ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-deps-mixlockhash-${{ hashFiles('mix.lock') }} restore-keys: | ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-deps-mixlockhash- - run: mix credo check_formatted: name: Code formatting checks runs-on: ubuntu-latest needs: build-and-cache steps: - uses: actions/checkout@v4 - uses: erlef/setup-beam@v1 with: otp-version: ${{ env.OTP_VERSION }} elixir-version: ${{ env.ELIXIR_VERSION }} hexpm-mirrors: | https://builds.hex.pm https://cdn.jsdelivr.net/hex - name: Restore Mix Deps Cache uses: actions/cache/restore@v4 id: deps-cache with: path: | deps _build key: ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-deps-mixlockhash-${{ hashFiles('mix.lock') }} restore-keys: | ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-deps-mixlockhash- - run: mix format --check-formatted dialyzer: strategy: fail-fast: false matrix: ${{ fromJson(needs.matrix-builder.outputs.matrix) }} name: Dialyzer static analysis runs-on: ubuntu-latest needs: - build-and-cache - matrix-builder steps: - uses: actions/checkout@v4 - uses: erlef/setup-beam@v1 with: otp-version: ${{ env.OTP_VERSION }} elixir-version: ${{ env.ELIXIR_VERSION }} hexpm-mirrors: | https://builds.hex.pm https://cdn.jsdelivr.net/hex - name: Restore Mix Deps Cache uses: actions/cache/restore@v4 id: deps-cache with: path: | deps _build key: ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-deps-mixlockhash-${{ hashFiles('mix.lock') }} restore-keys: | ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-deps-mixlockhash- - name: Restore Dialyzer Cache uses: actions/cache@v4 id: dialyzer-cache with: path: priv/plts key: ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-${{ matrix.chain-type }}-dialyzer-mixlockhash-${{ hashFiles('mix.lock') }} restore-keys: | ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-${{ matrix.chain-type }}-dialyzer-mixlockhash- - name: Conditionally build Dialyzer Cache if: steps.dialyzer-cache.output.cache-hit != 'true' run: | mkdir -p priv/plts mix dialyzer --plt env: CHAIN_TYPE: ${{ matrix.chain-type != 'default' && matrix.chain-type || '' }} - name: Run Dialyzer run: mix dialyzer --halt-exit-status env: CHAIN_TYPE: ${{ matrix.chain-type != 'default' && matrix.chain-type || '' }} gettext: name: Missing translation keys check runs-on: ubuntu-latest needs: build-and-cache steps: - uses: actions/checkout@v4 - uses: erlef/setup-beam@v1 with: otp-version: ${{ env.OTP_VERSION }} elixir-version: ${{ env.ELIXIR_VERSION }} hexpm-mirrors: | https://builds.hex.pm https://cdn.jsdelivr.net/hex - name: Restore Mix Deps Cache uses: actions/cache/restore@v4 id: deps-cache with: path: | deps _build key: ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-deps-mixlockhash-${{ hashFiles('mix.lock') }} restore-keys: | ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-deps-mixlockhash- - run: | mix gettext.extract --merge | tee stdout.txt ! grep "Wrote " stdout.txt working-directory: "apps/block_scout_web" sobelow: name: Sobelow security analysis runs-on: ubuntu-latest needs: build-and-cache steps: - uses: actions/checkout@v4 - uses: erlef/setup-beam@v1 with: otp-version: ${{ env.OTP_VERSION }} elixir-version: ${{ env.ELIXIR_VERSION }} hexpm-mirrors: | https://builds.hex.pm https://cdn.jsdelivr.net/hex - name: Mix Deps Cache uses: actions/cache/restore@v4 id: deps-cache with: path: | deps _build key: ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-deps-mixlockhash-${{ hashFiles('mix.lock') }} restore-keys: | ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-deps-mixlockhash- - name: Scan explorer for vulnerabilities run: mix sobelow --config working-directory: "apps/explorer" - name: Scan block_scout_web for vulnerabilities run: mix sobelow --config working-directory: "apps/block_scout_web" cspell: name: Check spelling runs-on: ubuntu-latest needs: build-and-cache steps: - uses: actions/checkout@v4 - uses: erlef/setup-beam@v1 with: otp-version: ${{ env.OTP_VERSION }} elixir-version: ${{ env.ELIXIR_VERSION }} hexpm-mirrors: | https://builds.hex.pm https://cdn.jsdelivr.net/hex - name: Mix Deps Cache uses: actions/cache/restore@v4 id: deps-cache with: path: | deps _build key: ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-deps-mixlockhash-${{ hashFiles('mix.lock') }} restore-keys: | ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-deps-mixlockhash- - name: Restore Explorer NPM Cache uses: actions/cache@v4 id: explorer-npm-cache with: path: apps/explorer/node_modules key: ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-explorer-npm-${{ hashFiles('apps/explorer/package-lock.json') }} restore-keys: | ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-explorer-npm- - name: Restore Blockscout Web NPM Cache uses: actions/cache@v4 id: blockscoutweb-npm-cache with: path: apps/block_scout_web/assets/node_modules key: ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-blockscoutweb-npm-${{ hashFiles('apps/block_scout_web/assets/package-lock.json') }} restore-keys: | ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-blockscoutweb-npm- - name: Run cspell uses: streetsidesoftware/cspell-action@v6 with: use_cspell_files: true incremental_files_only: false eslint: name: ESLint runs-on: ubuntu-latest needs: build-and-cache steps: - uses: actions/checkout@v4 - uses: erlef/setup-beam@v1 with: otp-version: ${{ env.OTP_VERSION }} elixir-version: ${{ env.ELIXIR_VERSION }} hexpm-mirrors: | https://builds.hex.pm https://cdn.jsdelivr.net/hex - name: Mix Deps Cache uses: actions/cache/restore@v4 id: deps-cache with: path: | deps _build key: ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-deps-mixlockhash-${{ hashFiles('mix.lock') }} restore-keys: | ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-deps-mixlockhash- - name: Restore Explorer NPM Cache uses: actions/cache@v4 id: explorer-npm-cache with: path: apps/explorer/node_modules key: ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-explorer-npm-${{ hashFiles('apps/explorer/package-lock.json') }} restore-keys: | ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-explorer-npm- - name: Restore Blockscout Web NPM Cache uses: actions/cache@v4 id: blockscoutweb-npm-cache with: path: apps/block_scout_web/assets/node_modules key: ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-blockscoutweb-npm-${{ hashFiles('apps/block_scout_web/assets/package-lock.json') }} restore-keys: | ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-blockscoutweb-npm- - name: Build assets run: node node_modules/webpack/bin/webpack.js --mode development working-directory: "apps/block_scout_web/assets" - run: ./node_modules/.bin/eslint --format=junit --output-file="test/eslint/junit.xml" js/** working-directory: apps/block_scout_web/assets jest: name: JS Tests runs-on: ubuntu-latest needs: build-and-cache steps: - uses: actions/checkout@v4 - uses: erlef/setup-beam@v1 with: otp-version: ${{ env.OTP_VERSION }} elixir-version: ${{ env.ELIXIR_VERSION }} hexpm-mirrors: | https://builds.hex.pm https://cdn.jsdelivr.net/hex - name: Mix Deps Cache uses: actions/cache/restore@v4 id: deps-cache with: path: | deps _build key: ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-deps-mixlockhash-${{ hashFiles('mix.lock') }} restore-keys: | ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-deps-mixlockhash- - name: Restore Blockscout Web NPM Cache uses: actions/cache@v4 id: blockscoutweb-npm-cache with: path: apps/block_scout_web/assets/node_modules key: ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-blockscoutweb-npm-${{ hashFiles('apps/block_scout_web/assets/package-lock.json') }} restore-keys: | ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-blockscoutweb-npm- - name: Build assets run: node node_modules/webpack/bin/webpack.js --mode development working-directory: "apps/block_scout_web/assets" - run: ./node_modules/.bin/jest working-directory: apps/block_scout_web/assets test_nethermind_mox_ethereum_jsonrpc: strategy: fail-fast: false matrix: ${{ fromJson(needs.matrix-builder.outputs.matrix) }} name: EthereumJSONRPC Tests runs-on: ubuntu-latest needs: - build-and-cache - matrix-builder services: postgres: image: postgres:15 env: # Match apps/explorer/config/test.exs config :explorer, Explorer.Repo, database POSTGRES_DB: explorer_test # match PGPASSWORD for elixir image above POSTGRES_PASSWORD: postgres # match PGUSER for elixir image above POSTGRES_USER: postgres # Set health checks to wait until postgres has started options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 ports: # Maps tcp port 5432 on service container to the host - 5432:5432 steps: - uses: actions/checkout@v4 - uses: erlef/setup-beam@v1 with: otp-version: ${{ env.OTP_VERSION }} elixir-version: ${{ env.ELIXIR_VERSION }} hexpm-mirrors: | https://builds.hex.pm https://cdn.jsdelivr.net/hex - name: Mix Deps Cache uses: actions/cache/restore@v4 id: deps-cache with: path: | deps _build key: ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-deps-mixlockhash-${{ hashFiles('mix.lock') }} restore-keys: | ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-deps-mixlockhash- - run: ./bin/install_chrome_headless.sh - name: mix test --exclude no_nethermind run: | cd apps/ethereum_jsonrpc mix compile mix test --no-start --exclude no_nethermind env: # match POSTGRES_PASSWORD for postgres image below PGPASSWORD: postgres # match POSTGRES_USER for postgres image below PGUSER: postgres ETHEREUM_JSONRPC_CASE: "EthereumJSONRPC.Case.Nethermind.Mox" ETHEREUM_JSONRPC_WEB_SOCKET_CASE: "EthereumJSONRPC.WebSocket.Case.Mox" CHAIN_TYPE: ${{ matrix.chain-type != 'default' && matrix.chain-type || '' }} test_nethermind_mox_explorer: strategy: fail-fast: false matrix: ${{ fromJson(needs.matrix-builder.outputs.matrix) }} name: Explorer Tests runs-on: ubuntu-latest needs: - build-and-cache - matrix-builder services: postgres: image: postgres:15 env: # Match apps/explorer/config/test.exs config :explorer, Explorer.Repo, database POSTGRES_DB: explorer_test # match PGPASSWORD for elixir image above POSTGRES_PASSWORD: postgres # match PGUSER for elixir image above POSTGRES_USER: postgres # Set health checks to wait until postgres has started options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 ports: # Maps tcp port 5432 on service container to the host - 5432:5432 steps: - uses: actions/checkout@v4 - uses: erlef/setup-beam@v1 with: otp-version: ${{ env.OTP_VERSION }} elixir-version: ${{ env.ELIXIR_VERSION }} hexpm-mirrors: | https://builds.hex.pm https://cdn.jsdelivr.net/hex - name: Mix Deps Cache uses: actions/cache/restore@v4 id: deps-cache with: path: | deps _build key: ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-deps-mixlockhash-${{ hashFiles('mix.lock') }} restore-keys: | ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-deps-mixlockhash- - name: Restore Explorer NPM Cache uses: actions/cache@v4 id: explorer-npm-cache with: path: apps/explorer/node_modules key: ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-explorer-npm-${{ hashFiles('apps/explorer/package-lock.json') }} restore-keys: | ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-explorer-npm - run: ./bin/install_chrome_headless.sh - name: mix test --exclude no_nethermind run: | mix ecto.create --quiet mix ecto.migrate cd apps/explorer mix compile mix test --no-start --exclude no_nethermind env: # match POSTGRES_PASSWORD for postgres image below PGPASSWORD: postgres # match POSTGRES_USER for postgres image below PGUSER: postgres ETHEREUM_JSONRPC_CASE: "EthereumJSONRPC.Case.Nethermind.Mox" ETHEREUM_JSONRPC_WEB_SOCKET_CASE: "EthereumJSONRPC.WebSocket.Case.Mox" CHAIN_TYPE: ${{ matrix.chain-type != 'default' && matrix.chain-type || '' }} WETH_TOKEN_TRANSFERS_FILTERING_ENABLED: "true" test_nethermind_mox_indexer: strategy: fail-fast: false matrix: ${{ fromJson(needs.matrix-builder.outputs.matrix) }} name: Indexer Tests runs-on: ubuntu-latest needs: - build-and-cache - matrix-builder services: postgres: image: postgres:15 env: # Match apps/explorer/config/test.exs config :explorer, Explorer.Repo, database POSTGRES_DB: explorer_test # match PGPASSWORD for elixir image above POSTGRES_PASSWORD: postgres # match PGUSER for elixir image above POSTGRES_USER: postgres # Set health checks to wait until postgres has started options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 ports: # Maps tcp port 5432 on service container to the host - 5432:5432 steps: - uses: actions/checkout@v4 - uses: erlef/setup-beam@v1 with: otp-version: ${{ env.OTP_VERSION }} elixir-version: ${{ env.ELIXIR_VERSION }} hexpm-mirrors: | https://builds.hex.pm https://cdn.jsdelivr.net/hex - name: Mix Deps Cache uses: actions/cache/restore@v4 id: deps-cache with: path: | deps _build key: ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-deps-mixlockhash-${{ hashFiles('mix.lock') }} restore-keys: | ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-deps-mixlockhash- - run: ./bin/install_chrome_headless.sh - name: mix test --exclude no_nethermind run: | mix ecto.create --quiet mix ecto.migrate cd apps/indexer mix compile mix test --no-start --exclude no_nethermind env: # match POSTGRES_PASSWORD for postgres image below PGPASSWORD: postgres # match POSTGRES_USER for postgres image below PGUSER: postgres ETHEREUM_JSONRPC_CASE: "EthereumJSONRPC.Case.Nethermind.Mox" ETHEREUM_JSONRPC_WEB_SOCKET_CASE: "EthereumJSONRPC.WebSocket.Case.Mox" CHAIN_TYPE: ${{ matrix.chain-type != 'default' && matrix.chain-type || '' }} WETH_TOKEN_TRANSFERS_FILTERING_ENABLED: "true" test_nethermind_mox_block_scout_web: strategy: fail-fast: false matrix: ${{ fromJson(needs.matrix-builder.outputs.matrix) }} name: Blockscout Web Tests runs-on: ubuntu-latest needs: - build-and-cache - matrix-builder services: redis-db: image: "redis:alpine" ports: - 6379:6379 postgres: image: postgres:15 env: # Match apps/explorer/config/test.exs config :explorer, Explorer.Repo, database POSTGRES_DB: explorer_test # match PGPASSWORD for elixir image above POSTGRES_PASSWORD: postgres # match PGUSER for elixir image above POSTGRES_USER: postgres # Set health checks to wait until postgres has started options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 ports: # Maps tcp port 5432 on service container to the host - 5432:5432 steps: - uses: actions/checkout@v4 - uses: erlef/setup-beam@v1 with: otp-version: ${{ env.OTP_VERSION }} elixir-version: ${{ env.ELIXIR_VERSION }} hexpm-mirrors: | https://builds.hex.pm https://cdn.jsdelivr.net/hex - name: Mix Deps Cache uses: actions/cache/restore@v4 id: deps-cache with: path: | deps _build key: ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-deps-mixlockhash-${{ hashFiles('mix.lock') }} restore-keys: | ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-deps-mixlockhash- - name: Restore Explorer NPM Cache uses: actions/cache@v4 id: explorer-npm-cache with: path: apps/explorer/node_modules key: ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-explorer-npm-${{ hashFiles('apps/explorer/package-lock.json') }} restore-keys: | ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-explorer-npm- - name: Restore Blockscout Web NPM Cache uses: actions/cache@v4 id: blockscoutweb-npm-cache with: path: apps/block_scout_web/assets/node_modules key: ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-blockscoutweb-npm-${{ hashFiles('apps/block_scout_web/assets/package-lock.json') }} restore-keys: | ${{ runner.os }}-${{ env.ELIXIR_VERSION }}-${{ env.OTP_VERSION }}-${{ env.MIX_ENV }}-blockscoutweb-npm- - name: Build assets run: node node_modules/webpack/bin/webpack.js --mode development working-directory: "apps/block_scout_web/assets" - run: ./bin/install_chrome_headless.sh - name: mix test --exclude no_nethermind run: | mix ecto.create --quiet mix ecto.migrate cd apps/block_scout_web mix compile mix test --no-start --exclude no_nethermind env: # match POSTGRES_PASSWORD for postgres image below PGPASSWORD: postgres # match POSTGRES_USER for postgres image below PGUSER: postgres ETHEREUM_JSONRPC_CASE: "EthereumJSONRPC.Case.Nethermind.Mox" ETHEREUM_JSONRPC_WEB_SOCKET_CASE: "EthereumJSONRPC.WebSocket.Case.Mox" CHAIN_ID: "10200" API_RATE_LIMIT_DISABLED: "true" API_GRAPHQL_RATE_LIMIT_DISABLED: "true" ADMIN_PANEL_ENABLED: "true" ACCOUNT_ENABLED: "true" ACCOUNT_REDIS_URL: "redis://localhost:6379" SOURCIFY_INTEGRATION_ENABLED: "true" CHAIN_TYPE: ${{ matrix.chain-type != 'default' && matrix.chain-type || '' }} WETH_TOKEN_TRANSFERS_FILTERING_ENABLED: "true"