From c2689b9aece18ccc7f88ffe2c911926bec8f2304 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Wed, 4 Nov 2026 15:15:52 +0100 Subject: [PATCH 01/10] ci: run all unit tests when CI configuration changes Co-Authored-By: OpenAI Codex --- .github/workflows/build.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9c408c806846..edc5c0736a14 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -498,11 +498,11 @@ jobs: - name: Run affected tests run: pnpm run test:pr:browser --base=${{ github.event.pull_request.base.sha }} - if: github.event_name == 'pull_request' + if: github.event_name == 'pull_request' && needs.job_get_metadata.outputs.changed_ci != 'true' - name: Run all tests run: pnpm run test:ci:browser - if: github.event_name != 'pull_request' + if: github.event_name != 'pull_request' || needs.job_get_metadata.outputs.changed_ci == 'true' job_bun_unit_tests: name: Bun (${{ matrix.bun }}) Unit Tests @@ -602,13 +602,13 @@ jobs: - name: Run affected tests run: pnpm run test:pr:node --base=${{ github.event.pull_request.base.sha }} - if: github.event_name == 'pull_request' + if: github.event_name == 'pull_request' && needs.job_get_metadata.outputs.changed_ci != 'true' env: NODE_VERSION: ${{ matrix.node }} - name: Run all tests run: pnpm run test:ci:node - if: github.event_name != 'pull_request' + if: github.event_name != 'pull_request' || needs.job_get_metadata.outputs.changed_ci == 'true' env: NODE_VERSION: ${{ matrix.node }} From f463755ff679b5608e5185951e88f00257766e67 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Wed, 4 Nov 2026 15:36:55 +0100 Subject: [PATCH 02/10] ci: trial ARM64 runners for pull requests Keep branch builds and SQL Server integration jobs on x86-64, and isolate architecture-specific caches. Co-Authored-By: OpenAI Codex --- .../actions/install-dependencies/action.yml | 5 +- .github/actions/install-playwright/action.yml | 8 ++- .github/actions/restore-cache/action.yml | 2 +- .github/workflows/build.yml | 51 ++++++++++--------- 4 files changed, 37 insertions(+), 29 deletions(-) diff --git a/.github/actions/install-dependencies/action.yml b/.github/actions/install-dependencies/action.yml index 5f51f918c34b..6e79c47a97aa 100644 --- a/.github/actions/install-dependencies/action.yml +++ b/.github/actions/install-dependencies/action.yml @@ -22,7 +22,10 @@ runs: id: cache_dependencies with: path: ${{ env.CACHED_DEPENDENCY_PATHS }} - key: ${{ steps.compute_lockfile_hash.outputs.hash }} + # Preserve warm x64 caches while keeping native dependencies separate on other architectures. + key: + ${{ steps.compute_lockfile_hash.outputs.hash }}${{ runner.arch != 'X64' && format('-{0}', runner.arch) || '' + }} - name: Install dependencies if: steps.cache_dependencies.outputs.cache-hit != 'true' diff --git a/.github/actions/install-playwright/action.yml b/.github/actions/install-playwright/action.yml index ca6c8a2d9583..8535abfb88cc 100644 --- a/.github/actions/install-playwright/action.yml +++ b/.github/actions/install-playwright/action.yml @@ -34,7 +34,9 @@ runs: path: | ~/.cache/ms-playwright # Bump the iteration when bumping runner images to use a new cache - key: playwright-${{ runner.os }}-iteration-1-${{ steps.playwright-version.outputs.version }} + key: + playwright-${{ runner.os }}-iteration-1-${{ steps.playwright-version.outputs.version }}${{ runner.arch != + 'X64' && format('-{0}', runner.arch) || '' }} # We always install all browsers, if uncached # `npx` runs outside the repo, so it can't pick up a `playwright` that a parallel `pnpm install` is still linking. @@ -65,4 +67,6 @@ runs: path: | ~/.cache/ms-playwright # Bump the iteration when bumping runner images to use a new cache - key: playwright-${{ runner.os }}-iteration-1-${{ steps.playwright-version.outputs.version }} + key: + playwright-${{ runner.os }}-iteration-1-${{ steps.playwright-version.outputs.version }}${{ runner.arch != + 'X64' && format('-{0}', runner.arch) || '' }} diff --git a/.github/actions/restore-cache/action.yml b/.github/actions/restore-cache/action.yml index daa5943f9877..372def6a0a7e 100644 --- a/.github/actions/restore-cache/action.yml +++ b/.github/actions/restore-cache/action.yml @@ -17,7 +17,7 @@ runs: uses: actions/cache/restore@v6.1.0 with: path: ${{ env.CACHED_DEPENDENCY_PATHS }} - key: ${{ inputs.dependency_cache_key }} + key: ${{ inputs.dependency_cache_key }}${{ runner.arch != 'X64' && format('-{0}', runner.arch) || '' }} - name: Restore build artifacts uses: actions/download-artifact@v7 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index edc5c0736a14..9740c02cddc4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -72,7 +72,7 @@ jobs: job_build: name: Build needs: job_get_metadata - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} timeout-minutes: 15 if: | needs.job_get_metadata.outputs.changed_any_code == 'true' || @@ -128,7 +128,7 @@ jobs: path: | .nx/cache .nx/workspace-data - key: ${{ env.NX_CACHE_KEY }} + key: ${{ env.NX_CACHE_KEY }}-${{ runner.arch }} - name: Upload build artifacts uses: actions/upload-artifact@v7 @@ -199,7 +199,7 @@ jobs: 'aws-serverless') || contains(needs.job_build.outputs.e2e-matrix-2, 'aws-serverless') || github.event_name != 'pull_request' timeout-minutes: 10 - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) uses: actions/checkout@v7 @@ -215,7 +215,7 @@ jobs: path: | .nx/cache .nx/workspace-data - key: ${{ env.NX_CACHE_KEY }} + key: ${{ env.NX_CACHE_KEY }}-${{ runner.arch }} - name: Restore caches uses: ./.github/actions/restore-cache @@ -238,7 +238,7 @@ jobs: name: Build bundles needs: [job_get_metadata, job_build] timeout-minutes: 10 - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) uses: actions/checkout@v7 @@ -254,7 +254,7 @@ jobs: path: | .nx/cache .nx/workspace-data - key: ${{ env.NX_CACHE_KEY }} + key: ${{ env.NX_CACHE_KEY }}-${{ runner.arch }} - name: Restore caches uses: ./.github/actions/restore-cache @@ -292,7 +292,7 @@ jobs: name: Size Check needs: [job_get_metadata, job_build, job_build_bundles] timeout-minutes: 15 - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} if: github.event_name == 'pull_request' || needs.job_get_metadata.outputs.is_base_branch == 'true' || needs.job_get_metadata.outputs.is_release == 'true' @@ -327,7 +327,7 @@ jobs: # inter-package dependencies resolve cleanly. needs: [job_get_metadata, job_build] timeout-minutes: 10 - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) uses: actions/checkout@v7 @@ -369,7 +369,7 @@ jobs: needs: [job_get_metadata] # `pnpm dedupe --check` fetches metadata for every package from npm, so this job can take 8+ min on PRs. timeout-minutes: 20 - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} if: | needs.job_get_metadata.outputs.changed_deps == 'true' || needs.job_get_metadata.outputs.is_base_branch == 'true' || @@ -400,7 +400,7 @@ jobs: name: Check file formatting needs: [job_get_metadata] timeout-minutes: 10 - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) uses: actions/checkout@v7 @@ -475,7 +475,7 @@ jobs: name: Browser Unit Tests needs: [job_get_metadata, job_build] timeout-minutes: 10 - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} steps: - name: Check out base commit (${{ github.event.pull_request.base.sha }}) uses: actions/checkout@v7 @@ -509,7 +509,7 @@ jobs: needs: [job_get_metadata, job_build] if: needs.job_build.outputs.changed_bun == 'true' || github.event_name != 'pull_request' timeout-minutes: 10 - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} strategy: fail-fast: false matrix: @@ -541,7 +541,7 @@ jobs: needs: [job_get_metadata, job_build] if: needs.job_build.outputs.changed_deno == 'true' || github.event_name != 'pull_request' timeout-minutes: 10 - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) uses: actions/checkout@v7 @@ -569,7 +569,7 @@ jobs: name: Node (${{ matrix.node }}) Unit Tests needs: [job_get_metadata, job_build] timeout-minutes: 10 - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} # Node 27 is an alpha: its ABI and APIs can change, so its failures must not fail the required checks. continue-on-error: ${{ matrix.node == '^27.0.0-0' }} strategy: @@ -618,7 +618,7 @@ jobs: matrix.project) || ''}}${{ matrix.shard && format(' ({0}/{1})', matrix.shard, matrix.shards) || ''}} Tests needs: [job_get_metadata, job_build, job_build_bundles] if: needs.job_build.outputs.changed_browser_integration == 'true' || github.event_name != 'pull_request' - runs-on: ubuntu-24.04-large-js + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04-large-js' }} timeout-minutes: 25 strategy: fail-fast: false @@ -716,7 +716,7 @@ jobs: name: PW ${{ matrix.bundle }} Tests needs: [job_get_metadata, job_build, job_build_bundles] if: needs.job_build.outputs.changed_browser_integration == 'true' || github.event_name != 'pull_request' - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} timeout-minutes: 15 strategy: fail-fast: false @@ -776,6 +776,7 @@ jobs: name: Node (${{ matrix.node }}) Integration Tests (${{ matrix.shard }}/3) needs: [job_get_metadata, job_build] if: needs.job_build.outputs.changed_node_integration == 'true' || github.event_name != 'pull_request' + # The tedious suite uses a SQL Server container that requires x86-64. runs-on: ubuntu-24.04 timeout-minutes: 20 # Node 27 is an alpha: its ABI and APIs can change, so its failures must not fail the required checks. @@ -826,7 +827,7 @@ jobs: name: Cloudflare Integration Tests (${{ matrix.shard }}/2) needs: [job_get_metadata, job_build] if: needs.job_build.outputs.changed_cloudflare_integration == 'true' || github.event_name != 'pull_request' - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} timeout-minutes: 15 strategy: fail-fast: false @@ -868,7 +869,7 @@ jobs: if: needs.job_get_metadata.outputs.is_release != 'true' && (needs.job_build.outputs.changed_cloudflare_integration == 'true' || github.event_name != 'pull_request') - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} timeout-minutes: 15 strategy: fail-fast: false @@ -881,7 +882,7 @@ jobs: name: Bundler Plugin Integration Tests (Node ${{ matrix.node }}) needs: [job_get_metadata, job_build] if: needs.job_build.outputs.changed_bundler_plugin_integration == 'true' || github.event_name != 'pull_request' - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} timeout-minutes: 15 # Node 27 is an alpha: its ABI and APIs can change, so its failures must not fail the required checks. continue-on-error: ${{ matrix.node == '^27.0.0-0' }} @@ -911,7 +912,7 @@ jobs: name: Bun (${{ matrix.bun }}) Integration Tests (${{ matrix.shard }}/2) needs: [job_get_metadata, job_build] if: needs.job_build.outputs.changed_bun_integration == 'true' || github.event_name != 'pull_request' - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} timeout-minutes: 15 strategy: fail-fast: false @@ -945,7 +946,7 @@ jobs: name: Deno Integration Tests (${{ matrix.shard }}/2) needs: [job_get_metadata, job_build] if: needs.job_build.outputs.changed_deno_integration == 'true' || github.event_name != 'pull_request' - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} timeout-minutes: 15 strategy: fail-fast: false @@ -990,7 +991,7 @@ jobs: always() && needs.job_build.result == 'success' needs: [job_get_metadata, job_build] - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} timeout-minutes: 15 steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) @@ -1007,7 +1008,7 @@ jobs: path: | .nx/cache .nx/workspace-data - key: ${{ env.NX_CACHE_KEY }} + key: ${{ env.NX_CACHE_KEY }}-${{ runner.arch }} - name: Restore caches uses: ./.github/actions/restore-cache @@ -1049,7 +1050,7 @@ jobs: always() && needs.job_build_tarballs.result == 'success' && needs.job_build.outputs.e2e-matrix-1 != '{"include":[]}' needs: [job_get_metadata, job_build, job_build_layer, job_build_tarballs] - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} timeout-minutes: 15 # We just use a dummy DSN here, only send to the tunnel anyhow env: &e2e-env @@ -1121,7 +1122,7 @@ jobs: always() && needs.job_build_tarballs.result == 'success' && needs.job_build.outputs.e2e-matrix-2 != '{"include":[]}' needs: [job_get_metadata, job_build, job_build_layer, job_build_tarballs] - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} timeout-minutes: 15 env: *e2e-env strategy: From 9c18083d6bca7a98eb2b1fecbda845c0b0d663d1 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Wed, 4 Nov 2026 16:46:07 +0100 Subject: [PATCH 03/10] ci: keep shared SQL Server integration suites on x86 Co-Authored-By: OpenAI Codex --- .github/workflows/build.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9740c02cddc4..5829cb04fc4a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -912,7 +912,8 @@ jobs: name: Bun (${{ matrix.bun }}) Integration Tests (${{ matrix.shard }}/2) needs: [job_get_metadata, job_build] if: needs.job_build.outputs.changed_bun_integration == 'true' || github.event_name != 'pull_request' - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + # Shared Node suites include the x86-only SQL Server container. + runs-on: ubuntu-24.04 timeout-minutes: 15 strategy: fail-fast: false @@ -946,7 +947,8 @@ jobs: name: Deno Integration Tests (${{ matrix.shard }}/2) needs: [job_get_metadata, job_build] if: needs.job_build.outputs.changed_deno_integration == 'true' || github.event_name != 'pull_request' - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + # Shared Node suites include the x86-only SQL Server container. + runs-on: ubuntu-24.04 timeout-minutes: 15 strategy: fail-fast: false From f2a543e3d20437c9148b96ff46d6f03b6f182504 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Thu, 5 Nov 2026 08:38:17 +0100 Subject: [PATCH 04/10] ci: restore x86 baseline for a repeat benchmark Co-Authored-By: OpenAI Codex --- .../actions/install-dependencies/action.yml | 5 +- .github/actions/install-playwright/action.yml | 8 +-- .github/actions/restore-cache/action.yml | 2 +- .github/workflows/build.yml | 49 +++++++++---------- 4 files changed, 27 insertions(+), 37 deletions(-) diff --git a/.github/actions/install-dependencies/action.yml b/.github/actions/install-dependencies/action.yml index 6e79c47a97aa..5f51f918c34b 100644 --- a/.github/actions/install-dependencies/action.yml +++ b/.github/actions/install-dependencies/action.yml @@ -22,10 +22,7 @@ runs: id: cache_dependencies with: path: ${{ env.CACHED_DEPENDENCY_PATHS }} - # Preserve warm x64 caches while keeping native dependencies separate on other architectures. - key: - ${{ steps.compute_lockfile_hash.outputs.hash }}${{ runner.arch != 'X64' && format('-{0}', runner.arch) || '' - }} + key: ${{ steps.compute_lockfile_hash.outputs.hash }} - name: Install dependencies if: steps.cache_dependencies.outputs.cache-hit != 'true' diff --git a/.github/actions/install-playwright/action.yml b/.github/actions/install-playwright/action.yml index 8535abfb88cc..ca6c8a2d9583 100644 --- a/.github/actions/install-playwright/action.yml +++ b/.github/actions/install-playwright/action.yml @@ -34,9 +34,7 @@ runs: path: | ~/.cache/ms-playwright # Bump the iteration when bumping runner images to use a new cache - key: - playwright-${{ runner.os }}-iteration-1-${{ steps.playwright-version.outputs.version }}${{ runner.arch != - 'X64' && format('-{0}', runner.arch) || '' }} + key: playwright-${{ runner.os }}-iteration-1-${{ steps.playwright-version.outputs.version }} # We always install all browsers, if uncached # `npx` runs outside the repo, so it can't pick up a `playwright` that a parallel `pnpm install` is still linking. @@ -67,6 +65,4 @@ runs: path: | ~/.cache/ms-playwright # Bump the iteration when bumping runner images to use a new cache - key: - playwright-${{ runner.os }}-iteration-1-${{ steps.playwright-version.outputs.version }}${{ runner.arch != - 'X64' && format('-{0}', runner.arch) || '' }} + key: playwright-${{ runner.os }}-iteration-1-${{ steps.playwright-version.outputs.version }} diff --git a/.github/actions/restore-cache/action.yml b/.github/actions/restore-cache/action.yml index 372def6a0a7e..daa5943f9877 100644 --- a/.github/actions/restore-cache/action.yml +++ b/.github/actions/restore-cache/action.yml @@ -17,7 +17,7 @@ runs: uses: actions/cache/restore@v6.1.0 with: path: ${{ env.CACHED_DEPENDENCY_PATHS }} - key: ${{ inputs.dependency_cache_key }}${{ runner.arch != 'X64' && format('-{0}', runner.arch) || '' }} + key: ${{ inputs.dependency_cache_key }} - name: Restore build artifacts uses: actions/download-artifact@v7 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5829cb04fc4a..edc5c0736a14 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -72,7 +72,7 @@ jobs: job_build: name: Build needs: job_get_metadata - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04 timeout-minutes: 15 if: | needs.job_get_metadata.outputs.changed_any_code == 'true' || @@ -128,7 +128,7 @@ jobs: path: | .nx/cache .nx/workspace-data - key: ${{ env.NX_CACHE_KEY }}-${{ runner.arch }} + key: ${{ env.NX_CACHE_KEY }} - name: Upload build artifacts uses: actions/upload-artifact@v7 @@ -199,7 +199,7 @@ jobs: 'aws-serverless') || contains(needs.job_build.outputs.e2e-matrix-2, 'aws-serverless') || github.event_name != 'pull_request' timeout-minutes: 10 - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04 steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) uses: actions/checkout@v7 @@ -215,7 +215,7 @@ jobs: path: | .nx/cache .nx/workspace-data - key: ${{ env.NX_CACHE_KEY }}-${{ runner.arch }} + key: ${{ env.NX_CACHE_KEY }} - name: Restore caches uses: ./.github/actions/restore-cache @@ -238,7 +238,7 @@ jobs: name: Build bundles needs: [job_get_metadata, job_build] timeout-minutes: 10 - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04 steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) uses: actions/checkout@v7 @@ -254,7 +254,7 @@ jobs: path: | .nx/cache .nx/workspace-data - key: ${{ env.NX_CACHE_KEY }}-${{ runner.arch }} + key: ${{ env.NX_CACHE_KEY }} - name: Restore caches uses: ./.github/actions/restore-cache @@ -292,7 +292,7 @@ jobs: name: Size Check needs: [job_get_metadata, job_build, job_build_bundles] timeout-minutes: 15 - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04 if: github.event_name == 'pull_request' || needs.job_get_metadata.outputs.is_base_branch == 'true' || needs.job_get_metadata.outputs.is_release == 'true' @@ -327,7 +327,7 @@ jobs: # inter-package dependencies resolve cleanly. needs: [job_get_metadata, job_build] timeout-minutes: 10 - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04 steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) uses: actions/checkout@v7 @@ -369,7 +369,7 @@ jobs: needs: [job_get_metadata] # `pnpm dedupe --check` fetches metadata for every package from npm, so this job can take 8+ min on PRs. timeout-minutes: 20 - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04 if: | needs.job_get_metadata.outputs.changed_deps == 'true' || needs.job_get_metadata.outputs.is_base_branch == 'true' || @@ -400,7 +400,7 @@ jobs: name: Check file formatting needs: [job_get_metadata] timeout-minutes: 10 - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04 steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) uses: actions/checkout@v7 @@ -475,7 +475,7 @@ jobs: name: Browser Unit Tests needs: [job_get_metadata, job_build] timeout-minutes: 10 - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04 steps: - name: Check out base commit (${{ github.event.pull_request.base.sha }}) uses: actions/checkout@v7 @@ -509,7 +509,7 @@ jobs: needs: [job_get_metadata, job_build] if: needs.job_build.outputs.changed_bun == 'true' || github.event_name != 'pull_request' timeout-minutes: 10 - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04 strategy: fail-fast: false matrix: @@ -541,7 +541,7 @@ jobs: needs: [job_get_metadata, job_build] if: needs.job_build.outputs.changed_deno == 'true' || github.event_name != 'pull_request' timeout-minutes: 10 - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04 steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) uses: actions/checkout@v7 @@ -569,7 +569,7 @@ jobs: name: Node (${{ matrix.node }}) Unit Tests needs: [job_get_metadata, job_build] timeout-minutes: 10 - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04 # Node 27 is an alpha: its ABI and APIs can change, so its failures must not fail the required checks. continue-on-error: ${{ matrix.node == '^27.0.0-0' }} strategy: @@ -618,7 +618,7 @@ jobs: matrix.project) || ''}}${{ matrix.shard && format(' ({0}/{1})', matrix.shard, matrix.shards) || ''}} Tests needs: [job_get_metadata, job_build, job_build_bundles] if: needs.job_build.outputs.changed_browser_integration == 'true' || github.event_name != 'pull_request' - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04-large-js' }} + runs-on: ubuntu-24.04-large-js timeout-minutes: 25 strategy: fail-fast: false @@ -716,7 +716,7 @@ jobs: name: PW ${{ matrix.bundle }} Tests needs: [job_get_metadata, job_build, job_build_bundles] if: needs.job_build.outputs.changed_browser_integration == 'true' || github.event_name != 'pull_request' - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04 timeout-minutes: 15 strategy: fail-fast: false @@ -776,7 +776,6 @@ jobs: name: Node (${{ matrix.node }}) Integration Tests (${{ matrix.shard }}/3) needs: [job_get_metadata, job_build] if: needs.job_build.outputs.changed_node_integration == 'true' || github.event_name != 'pull_request' - # The tedious suite uses a SQL Server container that requires x86-64. runs-on: ubuntu-24.04 timeout-minutes: 20 # Node 27 is an alpha: its ABI and APIs can change, so its failures must not fail the required checks. @@ -827,7 +826,7 @@ jobs: name: Cloudflare Integration Tests (${{ matrix.shard }}/2) needs: [job_get_metadata, job_build] if: needs.job_build.outputs.changed_cloudflare_integration == 'true' || github.event_name != 'pull_request' - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04 timeout-minutes: 15 strategy: fail-fast: false @@ -869,7 +868,7 @@ jobs: if: needs.job_get_metadata.outputs.is_release != 'true' && (needs.job_build.outputs.changed_cloudflare_integration == 'true' || github.event_name != 'pull_request') - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04 timeout-minutes: 15 strategy: fail-fast: false @@ -882,7 +881,7 @@ jobs: name: Bundler Plugin Integration Tests (Node ${{ matrix.node }}) needs: [job_get_metadata, job_build] if: needs.job_build.outputs.changed_bundler_plugin_integration == 'true' || github.event_name != 'pull_request' - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04 timeout-minutes: 15 # Node 27 is an alpha: its ABI and APIs can change, so its failures must not fail the required checks. continue-on-error: ${{ matrix.node == '^27.0.0-0' }} @@ -912,7 +911,6 @@ jobs: name: Bun (${{ matrix.bun }}) Integration Tests (${{ matrix.shard }}/2) needs: [job_get_metadata, job_build] if: needs.job_build.outputs.changed_bun_integration == 'true' || github.event_name != 'pull_request' - # Shared Node suites include the x86-only SQL Server container. runs-on: ubuntu-24.04 timeout-minutes: 15 strategy: @@ -947,7 +945,6 @@ jobs: name: Deno Integration Tests (${{ matrix.shard }}/2) needs: [job_get_metadata, job_build] if: needs.job_build.outputs.changed_deno_integration == 'true' || github.event_name != 'pull_request' - # Shared Node suites include the x86-only SQL Server container. runs-on: ubuntu-24.04 timeout-minutes: 15 strategy: @@ -993,7 +990,7 @@ jobs: always() && needs.job_build.result == 'success' needs: [job_get_metadata, job_build] - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04 timeout-minutes: 15 steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) @@ -1010,7 +1007,7 @@ jobs: path: | .nx/cache .nx/workspace-data - key: ${{ env.NX_CACHE_KEY }}-${{ runner.arch }} + key: ${{ env.NX_CACHE_KEY }} - name: Restore caches uses: ./.github/actions/restore-cache @@ -1052,7 +1049,7 @@ jobs: always() && needs.job_build_tarballs.result == 'success' && needs.job_build.outputs.e2e-matrix-1 != '{"include":[]}' needs: [job_get_metadata, job_build, job_build_layer, job_build_tarballs] - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04 timeout-minutes: 15 # We just use a dummy DSN here, only send to the tunnel anyhow env: &e2e-env @@ -1124,7 +1121,7 @@ jobs: always() && needs.job_build_tarballs.result == 'success' && needs.job_build.outputs.e2e-matrix-2 != '{"include":[]}' needs: [job_get_metadata, job_build, job_build_layer, job_build_tarballs] - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04 timeout-minutes: 15 env: *e2e-env strategy: From 5648af5c68f62769afde3522809b82130d0127a1 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Thu, 5 Nov 2026 08:50:01 +0100 Subject: [PATCH 05/10] ci: repeat ARM64 runner benchmark Co-Authored-By: OpenAI Codex --- .../actions/install-dependencies/action.yml | 5 +- .github/actions/install-playwright/action.yml | 8 ++- .github/actions/restore-cache/action.yml | 2 +- .github/workflows/build.yml | 49 ++++++++++--------- 4 files changed, 37 insertions(+), 27 deletions(-) diff --git a/.github/actions/install-dependencies/action.yml b/.github/actions/install-dependencies/action.yml index 5f51f918c34b..6e79c47a97aa 100644 --- a/.github/actions/install-dependencies/action.yml +++ b/.github/actions/install-dependencies/action.yml @@ -22,7 +22,10 @@ runs: id: cache_dependencies with: path: ${{ env.CACHED_DEPENDENCY_PATHS }} - key: ${{ steps.compute_lockfile_hash.outputs.hash }} + # Preserve warm x64 caches while keeping native dependencies separate on other architectures. + key: + ${{ steps.compute_lockfile_hash.outputs.hash }}${{ runner.arch != 'X64' && format('-{0}', runner.arch) || '' + }} - name: Install dependencies if: steps.cache_dependencies.outputs.cache-hit != 'true' diff --git a/.github/actions/install-playwright/action.yml b/.github/actions/install-playwright/action.yml index ca6c8a2d9583..8535abfb88cc 100644 --- a/.github/actions/install-playwright/action.yml +++ b/.github/actions/install-playwright/action.yml @@ -34,7 +34,9 @@ runs: path: | ~/.cache/ms-playwright # Bump the iteration when bumping runner images to use a new cache - key: playwright-${{ runner.os }}-iteration-1-${{ steps.playwright-version.outputs.version }} + key: + playwright-${{ runner.os }}-iteration-1-${{ steps.playwright-version.outputs.version }}${{ runner.arch != + 'X64' && format('-{0}', runner.arch) || '' }} # We always install all browsers, if uncached # `npx` runs outside the repo, so it can't pick up a `playwright` that a parallel `pnpm install` is still linking. @@ -65,4 +67,6 @@ runs: path: | ~/.cache/ms-playwright # Bump the iteration when bumping runner images to use a new cache - key: playwright-${{ runner.os }}-iteration-1-${{ steps.playwright-version.outputs.version }} + key: + playwright-${{ runner.os }}-iteration-1-${{ steps.playwright-version.outputs.version }}${{ runner.arch != + 'X64' && format('-{0}', runner.arch) || '' }} diff --git a/.github/actions/restore-cache/action.yml b/.github/actions/restore-cache/action.yml index daa5943f9877..372def6a0a7e 100644 --- a/.github/actions/restore-cache/action.yml +++ b/.github/actions/restore-cache/action.yml @@ -17,7 +17,7 @@ runs: uses: actions/cache/restore@v6.1.0 with: path: ${{ env.CACHED_DEPENDENCY_PATHS }} - key: ${{ inputs.dependency_cache_key }} + key: ${{ inputs.dependency_cache_key }}${{ runner.arch != 'X64' && format('-{0}', runner.arch) || '' }} - name: Restore build artifacts uses: actions/download-artifact@v7 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index edc5c0736a14..5829cb04fc4a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -72,7 +72,7 @@ jobs: job_build: name: Build needs: job_get_metadata - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} timeout-minutes: 15 if: | needs.job_get_metadata.outputs.changed_any_code == 'true' || @@ -128,7 +128,7 @@ jobs: path: | .nx/cache .nx/workspace-data - key: ${{ env.NX_CACHE_KEY }} + key: ${{ env.NX_CACHE_KEY }}-${{ runner.arch }} - name: Upload build artifacts uses: actions/upload-artifact@v7 @@ -199,7 +199,7 @@ jobs: 'aws-serverless') || contains(needs.job_build.outputs.e2e-matrix-2, 'aws-serverless') || github.event_name != 'pull_request' timeout-minutes: 10 - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) uses: actions/checkout@v7 @@ -215,7 +215,7 @@ jobs: path: | .nx/cache .nx/workspace-data - key: ${{ env.NX_CACHE_KEY }} + key: ${{ env.NX_CACHE_KEY }}-${{ runner.arch }} - name: Restore caches uses: ./.github/actions/restore-cache @@ -238,7 +238,7 @@ jobs: name: Build bundles needs: [job_get_metadata, job_build] timeout-minutes: 10 - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) uses: actions/checkout@v7 @@ -254,7 +254,7 @@ jobs: path: | .nx/cache .nx/workspace-data - key: ${{ env.NX_CACHE_KEY }} + key: ${{ env.NX_CACHE_KEY }}-${{ runner.arch }} - name: Restore caches uses: ./.github/actions/restore-cache @@ -292,7 +292,7 @@ jobs: name: Size Check needs: [job_get_metadata, job_build, job_build_bundles] timeout-minutes: 15 - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} if: github.event_name == 'pull_request' || needs.job_get_metadata.outputs.is_base_branch == 'true' || needs.job_get_metadata.outputs.is_release == 'true' @@ -327,7 +327,7 @@ jobs: # inter-package dependencies resolve cleanly. needs: [job_get_metadata, job_build] timeout-minutes: 10 - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) uses: actions/checkout@v7 @@ -369,7 +369,7 @@ jobs: needs: [job_get_metadata] # `pnpm dedupe --check` fetches metadata for every package from npm, so this job can take 8+ min on PRs. timeout-minutes: 20 - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} if: | needs.job_get_metadata.outputs.changed_deps == 'true' || needs.job_get_metadata.outputs.is_base_branch == 'true' || @@ -400,7 +400,7 @@ jobs: name: Check file formatting needs: [job_get_metadata] timeout-minutes: 10 - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) uses: actions/checkout@v7 @@ -475,7 +475,7 @@ jobs: name: Browser Unit Tests needs: [job_get_metadata, job_build] timeout-minutes: 10 - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} steps: - name: Check out base commit (${{ github.event.pull_request.base.sha }}) uses: actions/checkout@v7 @@ -509,7 +509,7 @@ jobs: needs: [job_get_metadata, job_build] if: needs.job_build.outputs.changed_bun == 'true' || github.event_name != 'pull_request' timeout-minutes: 10 - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} strategy: fail-fast: false matrix: @@ -541,7 +541,7 @@ jobs: needs: [job_get_metadata, job_build] if: needs.job_build.outputs.changed_deno == 'true' || github.event_name != 'pull_request' timeout-minutes: 10 - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) uses: actions/checkout@v7 @@ -569,7 +569,7 @@ jobs: name: Node (${{ matrix.node }}) Unit Tests needs: [job_get_metadata, job_build] timeout-minutes: 10 - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} # Node 27 is an alpha: its ABI and APIs can change, so its failures must not fail the required checks. continue-on-error: ${{ matrix.node == '^27.0.0-0' }} strategy: @@ -618,7 +618,7 @@ jobs: matrix.project) || ''}}${{ matrix.shard && format(' ({0}/{1})', matrix.shard, matrix.shards) || ''}} Tests needs: [job_get_metadata, job_build, job_build_bundles] if: needs.job_build.outputs.changed_browser_integration == 'true' || github.event_name != 'pull_request' - runs-on: ubuntu-24.04-large-js + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04-large-js' }} timeout-minutes: 25 strategy: fail-fast: false @@ -716,7 +716,7 @@ jobs: name: PW ${{ matrix.bundle }} Tests needs: [job_get_metadata, job_build, job_build_bundles] if: needs.job_build.outputs.changed_browser_integration == 'true' || github.event_name != 'pull_request' - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} timeout-minutes: 15 strategy: fail-fast: false @@ -776,6 +776,7 @@ jobs: name: Node (${{ matrix.node }}) Integration Tests (${{ matrix.shard }}/3) needs: [job_get_metadata, job_build] if: needs.job_build.outputs.changed_node_integration == 'true' || github.event_name != 'pull_request' + # The tedious suite uses a SQL Server container that requires x86-64. runs-on: ubuntu-24.04 timeout-minutes: 20 # Node 27 is an alpha: its ABI and APIs can change, so its failures must not fail the required checks. @@ -826,7 +827,7 @@ jobs: name: Cloudflare Integration Tests (${{ matrix.shard }}/2) needs: [job_get_metadata, job_build] if: needs.job_build.outputs.changed_cloudflare_integration == 'true' || github.event_name != 'pull_request' - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} timeout-minutes: 15 strategy: fail-fast: false @@ -868,7 +869,7 @@ jobs: if: needs.job_get_metadata.outputs.is_release != 'true' && (needs.job_build.outputs.changed_cloudflare_integration == 'true' || github.event_name != 'pull_request') - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} timeout-minutes: 15 strategy: fail-fast: false @@ -881,7 +882,7 @@ jobs: name: Bundler Plugin Integration Tests (Node ${{ matrix.node }}) needs: [job_get_metadata, job_build] if: needs.job_build.outputs.changed_bundler_plugin_integration == 'true' || github.event_name != 'pull_request' - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} timeout-minutes: 15 # Node 27 is an alpha: its ABI and APIs can change, so its failures must not fail the required checks. continue-on-error: ${{ matrix.node == '^27.0.0-0' }} @@ -911,6 +912,7 @@ jobs: name: Bun (${{ matrix.bun }}) Integration Tests (${{ matrix.shard }}/2) needs: [job_get_metadata, job_build] if: needs.job_build.outputs.changed_bun_integration == 'true' || github.event_name != 'pull_request' + # Shared Node suites include the x86-only SQL Server container. runs-on: ubuntu-24.04 timeout-minutes: 15 strategy: @@ -945,6 +947,7 @@ jobs: name: Deno Integration Tests (${{ matrix.shard }}/2) needs: [job_get_metadata, job_build] if: needs.job_build.outputs.changed_deno_integration == 'true' || github.event_name != 'pull_request' + # Shared Node suites include the x86-only SQL Server container. runs-on: ubuntu-24.04 timeout-minutes: 15 strategy: @@ -990,7 +993,7 @@ jobs: always() && needs.job_build.result == 'success' needs: [job_get_metadata, job_build] - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} timeout-minutes: 15 steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) @@ -1007,7 +1010,7 @@ jobs: path: | .nx/cache .nx/workspace-data - key: ${{ env.NX_CACHE_KEY }} + key: ${{ env.NX_CACHE_KEY }}-${{ runner.arch }} - name: Restore caches uses: ./.github/actions/restore-cache @@ -1049,7 +1052,7 @@ jobs: always() && needs.job_build_tarballs.result == 'success' && needs.job_build.outputs.e2e-matrix-1 != '{"include":[]}' needs: [job_get_metadata, job_build, job_build_layer, job_build_tarballs] - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} timeout-minutes: 15 # We just use a dummy DSN here, only send to the tunnel anyhow env: &e2e-env @@ -1121,7 +1124,7 @@ jobs: always() && needs.job_build_tarballs.result == 'success' && needs.job_build.outputs.e2e-matrix-2 != '{"include":[]}' needs: [job_get_metadata, job_build, job_build_layer, job_build_tarballs] - runs-on: ubuntu-24.04 + runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} timeout-minutes: 15 env: *e2e-env strategy: From d88fff71ff51eb7aee5ec02177b508003b512a1d Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Thu, 5 Nov 2026 09:27:32 +0100 Subject: [PATCH 06/10] ci: retain ARM runners for benchmark improvements Co-Authored-By: OpenAI Codex --- .github/workflows/build.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5829cb04fc4a..bf1256f6e432 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -199,7 +199,7 @@ jobs: 'aws-serverless') || contains(needs.job_build.outputs.e2e-matrix-2, 'aws-serverless') || github.event_name != 'pull_request' timeout-minutes: 10 - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04 steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) uses: actions/checkout@v7 @@ -369,7 +369,7 @@ jobs: needs: [job_get_metadata] # `pnpm dedupe --check` fetches metadata for every package from npm, so this job can take 8+ min on PRs. timeout-minutes: 20 - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04 if: | needs.job_get_metadata.outputs.changed_deps == 'true' || needs.job_get_metadata.outputs.is_base_branch == 'true' || @@ -400,7 +400,7 @@ jobs: name: Check file formatting needs: [job_get_metadata] timeout-minutes: 10 - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04 steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) uses: actions/checkout@v7 @@ -475,7 +475,7 @@ jobs: name: Browser Unit Tests needs: [job_get_metadata, job_build] timeout-minutes: 10 - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04 steps: - name: Check out base commit (${{ github.event.pull_request.base.sha }}) uses: actions/checkout@v7 @@ -618,7 +618,7 @@ jobs: matrix.project) || ''}}${{ matrix.shard && format(' ({0}/{1})', matrix.shard, matrix.shards) || ''}} Tests needs: [job_get_metadata, job_build, job_build_bundles] if: needs.job_build.outputs.changed_browser_integration == 'true' || github.event_name != 'pull_request' - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04-large-js' }} + runs-on: ubuntu-24.04-large-js timeout-minutes: 25 strategy: fail-fast: false @@ -716,7 +716,7 @@ jobs: name: PW ${{ matrix.bundle }} Tests needs: [job_get_metadata, job_build, job_build_bundles] if: needs.job_build.outputs.changed_browser_integration == 'true' || github.event_name != 'pull_request' - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04 timeout-minutes: 15 strategy: fail-fast: false @@ -827,7 +827,7 @@ jobs: name: Cloudflare Integration Tests (${{ matrix.shard }}/2) needs: [job_get_metadata, job_build] if: needs.job_build.outputs.changed_cloudflare_integration == 'true' || github.event_name != 'pull_request' - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04 timeout-minutes: 15 strategy: fail-fast: false @@ -1052,7 +1052,7 @@ jobs: always() && needs.job_build_tarballs.result == 'success' && needs.job_build.outputs.e2e-matrix-1 != '{"include":[]}' needs: [job_get_metadata, job_build, job_build_layer, job_build_tarballs] - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04 timeout-minutes: 15 # We just use a dummy DSN here, only send to the tunnel anyhow env: &e2e-env @@ -1124,7 +1124,7 @@ jobs: always() && needs.job_build_tarballs.result == 'success' && needs.job_build.outputs.e2e-matrix-2 != '{"include":[]}' needs: [job_get_metadata, job_build, job_build_layer, job_build_tarballs] - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04 timeout-minutes: 15 env: *e2e-env strategy: From 1d68a0abde4c135ca53eb9bfcfa93f594d057d7e Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Thu, 5 Nov 2026 13:39:59 +0100 Subject: [PATCH 07/10] ci: use hybrid runners for branch and release builds Co-Authored-By: OpenAI Codex --- .github/workflows/build.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bf1256f6e432..93921f57ee52 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -72,7 +72,7 @@ jobs: job_build: name: Build needs: job_get_metadata - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04-arm timeout-minutes: 15 if: | needs.job_get_metadata.outputs.changed_any_code == 'true' || @@ -238,7 +238,7 @@ jobs: name: Build bundles needs: [job_get_metadata, job_build] timeout-minutes: 10 - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04-arm steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) uses: actions/checkout@v7 @@ -292,7 +292,7 @@ jobs: name: Size Check needs: [job_get_metadata, job_build, job_build_bundles] timeout-minutes: 15 - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04-arm if: github.event_name == 'pull_request' || needs.job_get_metadata.outputs.is_base_branch == 'true' || needs.job_get_metadata.outputs.is_release == 'true' @@ -327,7 +327,7 @@ jobs: # inter-package dependencies resolve cleanly. needs: [job_get_metadata, job_build] timeout-minutes: 10 - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04-arm steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) uses: actions/checkout@v7 @@ -509,7 +509,7 @@ jobs: needs: [job_get_metadata, job_build] if: needs.job_build.outputs.changed_bun == 'true' || github.event_name != 'pull_request' timeout-minutes: 10 - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04-arm strategy: fail-fast: false matrix: @@ -541,7 +541,7 @@ jobs: needs: [job_get_metadata, job_build] if: needs.job_build.outputs.changed_deno == 'true' || github.event_name != 'pull_request' timeout-minutes: 10 - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04-arm steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) uses: actions/checkout@v7 @@ -569,7 +569,7 @@ jobs: name: Node (${{ matrix.node }}) Unit Tests needs: [job_get_metadata, job_build] timeout-minutes: 10 - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04-arm # Node 27 is an alpha: its ABI and APIs can change, so its failures must not fail the required checks. continue-on-error: ${{ matrix.node == '^27.0.0-0' }} strategy: @@ -869,7 +869,7 @@ jobs: if: needs.job_get_metadata.outputs.is_release != 'true' && (needs.job_build.outputs.changed_cloudflare_integration == 'true' || github.event_name != 'pull_request') - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04-arm timeout-minutes: 15 strategy: fail-fast: false @@ -882,7 +882,7 @@ jobs: name: Bundler Plugin Integration Tests (Node ${{ matrix.node }}) needs: [job_get_metadata, job_build] if: needs.job_build.outputs.changed_bundler_plugin_integration == 'true' || github.event_name != 'pull_request' - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04-arm timeout-minutes: 15 # Node 27 is an alpha: its ABI and APIs can change, so its failures must not fail the required checks. continue-on-error: ${{ matrix.node == '^27.0.0-0' }} @@ -993,7 +993,7 @@ jobs: always() && needs.job_build.result == 'success' needs: [job_get_metadata, job_build] - runs-on: ${{ github.event_name == 'pull_request' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }} + runs-on: ubuntu-24.04-arm timeout-minutes: 15 steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) From d77d4faf49806cc335c67bf0df4bde11dec290b8 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Thu, 5 Nov 2026 13:42:46 +0100 Subject: [PATCH 08/10] ci: drop unused ARM Playwright cache changes Co-Authored-By: OpenAI Codex --- .github/actions/install-playwright/action.yml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/actions/install-playwright/action.yml b/.github/actions/install-playwright/action.yml index 8535abfb88cc..ca6c8a2d9583 100644 --- a/.github/actions/install-playwright/action.yml +++ b/.github/actions/install-playwright/action.yml @@ -34,9 +34,7 @@ runs: path: | ~/.cache/ms-playwright # Bump the iteration when bumping runner images to use a new cache - key: - playwright-${{ runner.os }}-iteration-1-${{ steps.playwright-version.outputs.version }}${{ runner.arch != - 'X64' && format('-{0}', runner.arch) || '' }} + key: playwright-${{ runner.os }}-iteration-1-${{ steps.playwright-version.outputs.version }} # We always install all browsers, if uncached # `npx` runs outside the repo, so it can't pick up a `playwright` that a parallel `pnpm install` is still linking. @@ -67,6 +65,4 @@ runs: path: | ~/.cache/ms-playwright # Bump the iteration when bumping runner images to use a new cache - key: - playwright-${{ runner.os }}-iteration-1-${{ steps.playwright-version.outputs.version }}${{ runner.arch != - 'X64' && format('-{0}', runner.arch) || '' }} + key: playwright-${{ runner.os }}-iteration-1-${{ steps.playwright-version.outputs.version }} From b3aaea4eee120c87d21271bfe96b1a0a8cffea01 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Thu, 5 Nov 2026 13:50:35 +0100 Subject: [PATCH 09/10] ci: remove cache key comment Co-Authored-By: OpenAI Codex --- .github/actions/install-dependencies/action.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/actions/install-dependencies/action.yml b/.github/actions/install-dependencies/action.yml index 6e79c47a97aa..052da6857343 100644 --- a/.github/actions/install-dependencies/action.yml +++ b/.github/actions/install-dependencies/action.yml @@ -22,7 +22,6 @@ runs: id: cache_dependencies with: path: ${{ env.CACHED_DEPENDENCY_PATHS }} - # Preserve warm x64 caches while keeping native dependencies separate on other architectures. key: ${{ steps.compute_lockfile_hash.outputs.hash }}${{ runner.arch != 'X64' && format('-{0}', runner.arch) || '' }} From 7465f8a2f79608fc1f96bfe9e5195ce568f0a13a Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Thu, 5 Nov 2026 13:52:35 +0100 Subject: [PATCH 10/10] ci: remove benchmark-only full unit test conditions Co-Authored-By: OpenAI Codex --- .github/workflows/build.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 93921f57ee52..847d5bf8b1d0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -498,11 +498,11 @@ jobs: - name: Run affected tests run: pnpm run test:pr:browser --base=${{ github.event.pull_request.base.sha }} - if: github.event_name == 'pull_request' && needs.job_get_metadata.outputs.changed_ci != 'true' + if: github.event_name == 'pull_request' - name: Run all tests run: pnpm run test:ci:browser - if: github.event_name != 'pull_request' || needs.job_get_metadata.outputs.changed_ci == 'true' + if: github.event_name != 'pull_request' job_bun_unit_tests: name: Bun (${{ matrix.bun }}) Unit Tests @@ -602,13 +602,13 @@ jobs: - name: Run affected tests run: pnpm run test:pr:node --base=${{ github.event.pull_request.base.sha }} - if: github.event_name == 'pull_request' && needs.job_get_metadata.outputs.changed_ci != 'true' + if: github.event_name == 'pull_request' env: NODE_VERSION: ${{ matrix.node }} - name: Run all tests run: pnpm run test:ci:node - if: github.event_name != 'pull_request' || needs.job_get_metadata.outputs.changed_ci == 'true' + if: github.event_name != 'pull_request' env: NODE_VERSION: ${{ matrix.node }}