From 3770d9a213631e7da9388ffb322f40bab6058053 Mon Sep 17 00:00:00 2001 From: Jordan Simonovski Date: Thu, 16 Jul 2026 14:44:22 +1000 Subject: [PATCH 1/5] test(e2e): raise Playwright workers to 4 on CI (with E2E_WORKERS override) --- packages/app/playwright.config.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/app/playwright.config.ts b/packages/app/playwright.config.ts index d03d278af9..6b240324b1 100644 --- a/packages/app/playwright.config.ts +++ b/packages/app/playwright.config.ts @@ -32,8 +32,14 @@ export default defineConfig({ forbidOnly: !!process.env.CI, /* Retry on CI only */ retries: process.env.CI ? 2 : 1, - /* Use multiple workers on CI for faster execution */ - workers: process.env.CI ? 2 : undefined, + /* Use multiple workers on CI for faster execution. CI runners have 4 vCPUs; + * override with E2E_WORKERS if this over-subscribes the shared app/CH stack. */ + workers: + process.env.E2E_WORKERS !== undefined + ? Number(process.env.E2E_WORKERS) + : process.env.CI + ? 4 + : undefined, /* Reporter to use. See https://playwright.dev/docs/test-reporters */ reporter: [ ['html'], From 459c75adf5888167099da4bcffde6104d667566f Mon Sep 17 00:00:00 2001 From: Jordan Simonovski Date: Thu, 16 Jul 2026 14:47:54 +1000 Subject: [PATCH 2/5] test(e2e): harden E2E_WORKERS parsing against empty/non-numeric values --- packages/app/playwright.config.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/app/playwright.config.ts b/packages/app/playwright.config.ts index 6b240324b1..45bf51297a 100644 --- a/packages/app/playwright.config.ts +++ b/packages/app/playwright.config.ts @@ -34,12 +34,11 @@ export default defineConfig({ retries: process.env.CI ? 2 : 1, /* Use multiple workers on CI for faster execution. CI runners have 4 vCPUs; * override with E2E_WORKERS if this over-subscribes the shared app/CH stack. */ - workers: - process.env.E2E_WORKERS !== undefined - ? Number(process.env.E2E_WORKERS) - : process.env.CI - ? 4 - : undefined, + workers: (() => { + const parsed = Number.parseInt(process.env.E2E_WORKERS ?? '', 10); + if (!Number.isNaN(parsed)) return parsed; + return process.env.CI ? 4 : undefined; + })(), /* Reporter to use. See https://playwright.dev/docs/test-reporters */ reporter: [ ['html'], From 7baab6641d8405c230a8604cd060154cb6e25ddc Mon Sep 17 00:00:00 2001 From: Jordan Simonovski Date: Thu, 16 Jul 2026 15:11:41 +1000 Subject: [PATCH 3/5] ci(e2e): run shards on 8-core-playwright runners for the 4-worker bump --- .github/workflows/e2e-tests.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index 9cd34cb1fd..54a835e157 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -5,7 +5,10 @@ on: jobs: e2e-tests: name: E2E Tests - Shard ${{ matrix.shard }} - runs-on: ubuntu-24.04 + # 8-core runner so the 4 Playwright workers (see playwright.config.ts) have + # CPU headroom alongside the app + ClickHouse + MongoDB — 4 workers + # over-subscribed the 4-vCPU ubuntu-24.04 runner and caused timeouts. + runs-on: 8-core-playwright timeout-minutes: 15 permissions: contents: read From 94f4e1acc355cf604e5fb1055ee9f5cd78d073a6 Mon Sep 17 00:00:00 2001 From: Jordan Simonovski Date: Thu, 16 Jul 2026 15:20:28 +1000 Subject: [PATCH 4/5] ci(e2e): cache the Chromium binary keyed on the Playwright version --- .github/actions/e2e-setup/action.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/.github/actions/e2e-setup/action.yml b/.github/actions/e2e-setup/action.yml index c2d2c80c5b..b42b8b4236 100644 --- a/.github/actions/e2e-setup/action.yml +++ b/.github/actions/e2e-setup/action.yml @@ -42,6 +42,26 @@ runs: shell: bash run: npx nx run-many -t ci:build + # Cache the Chromium binary (~120MB) keyed on the resolved Playwright + # version, so it isn't re-downloaded every shard/run. Browser versions are + # pinned to the Playwright package version, so the version is the correct + # cache key. On a hit, `playwright install` finds the browser present and + # only installs OS deps. + - name: Resolve Playwright version + id: playwright-version + shell: bash + run: + echo "version=$(cd packages/app && node -p + "require('@playwright/test/package.json').version")" >> "$GITHUB_OUTPUT" + + - name: Cache Playwright browsers + uses: actions/cache@v4 + with: + path: ~/.cache/ms-playwright + key: + ${{ runner.os }}-playwright-${{ + steps.playwright-version.outputs.version }} + - name: Install Playwright browsers shell: bash run: cd packages/app && npx playwright install --with-deps chromium From f11a1b6dcded1039678c9923396db562e16eb0d5 Mon Sep 17 00:00:00 2001 From: Jordan Simonovski Date: Thu, 16 Jul 2026 15:54:23 +1000 Subject: [PATCH 5/5] test(e2e): tighten E2E_WORKERS to a positive integer; fix stale vCPU comment --- packages/app/playwright.config.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/app/playwright.config.ts b/packages/app/playwright.config.ts index 45bf51297a..5c571d578b 100644 --- a/packages/app/playwright.config.ts +++ b/packages/app/playwright.config.ts @@ -32,11 +32,14 @@ export default defineConfig({ forbidOnly: !!process.env.CI, /* Retry on CI only */ retries: process.env.CI ? 2 : 1, - /* Use multiple workers on CI for faster execution. CI runners have 4 vCPUs; - * override with E2E_WORKERS if this over-subscribes the shared app/CH stack. */ + /* Use multiple workers on CI for faster execution. CI e2e shards run on + * 8-core runners (see .github/workflows/e2e-tests.yml), so 4 workers leave + * headroom for the app + ClickHouse + Mongo. Override with E2E_WORKERS + * (a positive integer); anything else falls back to the default. */ workers: (() => { - const parsed = Number.parseInt(process.env.E2E_WORKERS ?? '', 10); - if (!Number.isNaN(parsed)) return parsed; + const raw = process.env.E2E_WORKERS; + const parsed = raw ? Number(raw) : NaN; + if (Number.isInteger(parsed) && parsed >= 1) return parsed; return process.env.CI ? 4 : undefined; })(), /* Reporter to use. See https://playwright.dev/docs/test-reporters */