From c27d965df8bb370e3308c391c7e7a7b390de8d50 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Thu, 24 Sep 2026 09:07:50 +0200 Subject: [PATCH 01/10] ci: collect Node integration test timings Co-Authored-By: GPT-6 --- .github/workflows/build.yml | 9 +++++++++ dev-packages/node-integration-tests/vite.config.ts | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 45e298794f10..84ce142751ea 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -834,6 +834,15 @@ jobs: working-directory: dev-packages/node-integration-tests run: yarn test + - name: Upload test timing report + uses: actions/upload-artifact@v7 + if: ${{ !cancelled() }} + with: + name: node-integration-timings-node-${{ matrix.node }}-ts-${{ matrix.typescript || 'default' }} + path: dev-packages/node-integration-tests/vitest.junit.xml + retention-days: 7 + if-no-files-found: warn + job_cloudflare_integration_tests: name: Cloudflare Integration Tests needs: [job_get_metadata, job_build] diff --git a/dev-packages/node-integration-tests/vite.config.ts b/dev-packages/node-integration-tests/vite.config.ts index 5a8b87af8dce..94527985f216 100644 --- a/dev-packages/node-integration-tests/vite.config.ts +++ b/dev-packages/node-integration-tests/vite.config.ts @@ -25,7 +25,7 @@ export default defineConfig({ reporters: process.env.DEBUG ? [['default', { summary: false }]] : process.env.GITHUB_ACTIONS - ? ['dot', 'github-actions'] + ? ['dot', 'github-actions', ['junit', { classnameTemplate: '{filepath}' }]] : ['verbose'], }, }); From 7bf8ce36135c54f64430bb3b40b13516a5c07533 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Thu, 24 Sep 2026 10:52:23 +0200 Subject: [PATCH 02/10] ci: shard Node integration tests across two runners Co-Authored-By: GPT-6 --- .github/workflows/build.yml | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 84ce142751ea..d0a58bf63048 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -783,7 +783,7 @@ jobs: job_node_integration_tests: name: Node (${{ matrix.node }})${{ (matrix.typescript && format(' (TS {0})', matrix.typescript)) || '' }} Integration - Tests + Tests (shard ${{ matrix.shard }}/2) needs: [job_get_metadata, job_build] if: needs.job_build.outputs.changed_node_integration == 'true' || github.event_name != 'pull_request' runs-on: ubuntu-24.04 @@ -792,12 +792,17 @@ jobs: fail-fast: false matrix: node: [20.19, 22, 24, 26] + shard: [1, 2] typescript: - false include: # Only check typescript for latest version (to streamline CI) - node: 24 typescript: '5.0' + shard: 1 + - node: 24 + typescript: '5.0' + shard: 2 steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) uses: actions/checkout@v7 @@ -832,13 +837,15 @@ jobs: - name: Run integration tests working-directory: dev-packages/node-integration-tests - run: yarn test + run: yarn test --shard=${{ matrix.shard }}/2 - name: Upload test timing report uses: actions/upload-artifact@v7 if: ${{ !cancelled() }} with: - name: node-integration-timings-node-${{ matrix.node }}-ts-${{ matrix.typescript || 'default' }} + name: + node-integration-timings-node-${{ matrix.node }}-ts-${{ matrix.typescript || 'default' }}-shard-${{ + matrix.shard }} path: dev-packages/node-integration-tests/vitest.junit.xml retention-days: 7 if-no-files-found: warn From ed5b3fba21a8da1c81d5a56f9d81ddb6ad87f402 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Thu, 24 Sep 2026 13:13:53 +0200 Subject: [PATCH 03/10] ci: try three shards for Node integration tests Co-Authored-By: GPT-6 --- .github/workflows/build.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d0a58bf63048..c73b283234f4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -783,7 +783,7 @@ jobs: job_node_integration_tests: name: Node (${{ matrix.node }})${{ (matrix.typescript && format(' (TS {0})', matrix.typescript)) || '' }} Integration - Tests (shard ${{ matrix.shard }}/2) + Tests (shard ${{ matrix.shard }}/3) needs: [job_get_metadata, job_build] if: needs.job_build.outputs.changed_node_integration == 'true' || github.event_name != 'pull_request' runs-on: ubuntu-24.04 @@ -792,7 +792,7 @@ jobs: fail-fast: false matrix: node: [20.19, 22, 24, 26] - shard: [1, 2] + shard: [1, 2, 3] typescript: - false include: @@ -803,6 +803,9 @@ jobs: - node: 24 typescript: '5.0' shard: 2 + - node: 24 + typescript: '5.0' + shard: 3 steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) uses: actions/checkout@v7 @@ -837,7 +840,7 @@ jobs: - name: Run integration tests working-directory: dev-packages/node-integration-tests - run: yarn test --shard=${{ matrix.shard }}/2 + run: yarn test --shard=${{ matrix.shard }}/3 - name: Upload test timing report uses: actions/upload-artifact@v7 From c5b9cb18489b306e5e921577210fc13b43ef2234 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Thu, 24 Sep 2026 14:03:39 +0200 Subject: [PATCH 04/10] ci: parallelize browser bundle builds across three processes Co-Authored-By: GPT-6 --- packages/browser/package.json | 5 ++++- packages/browser/rollup.bundle.config.mjs | 14 +++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/packages/browser/package.json b/packages/browser/package.json index 25829399515b..99b29a9ec658 100644 --- a/packages/browser/package.json +++ b/packages/browser/package.json @@ -52,7 +52,10 @@ "scripts": { "build": "run-p build:transpile build:bundle build:types", "build:dev": "run-p build:transpile build:types", - "build:bundle": "rollup -c rollup.bundle.config.mjs", + "build:bundle": "run-p build:bundle:shard:*", + "build:bundle:shard:1": "rollup -c rollup.bundle.config.mjs --configShard=1", + "build:bundle:shard:2": "rollup -c rollup.bundle.config.mjs --configShard=2", + "build:bundle:shard:3": "rollup -c rollup.bundle.config.mjs --configShard=3", "build:transpile": "rollup -c rollup.npm.config.mjs", "build:types": "tsc -p tsconfig.types.json", "build:watch": "run-p build:transpile:watch build:bundle:watch", diff --git a/packages/browser/rollup.bundle.config.mjs b/packages/browser/rollup.bundle.config.mjs index d5bbc92dbabb..9b86cfe5e52d 100644 --- a/packages/browser/rollup.bundle.config.mjs +++ b/packages/browser/rollup.bundle.config.mjs @@ -157,4 +157,16 @@ builds.push( ...makeBundleConfigVariants(tracingReplayFeedbackLogsMetricsBaseBundleConfig), ); -export default builds; +export default ({ configShard } = {}) => { + if (configShard === undefined) { + return builds; + } + + const shard = Number(configShard); + + if (![1, 2, 3].includes(shard)) { + throw new Error('configShard must be 1, 2, or 3'); + } + + return builds.filter((_, index) => Math.floor(index / 3) % 3 === shard - 1); +}; From 1a5eff752ca11ac72e1d4e9f0679339669f79011 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Thu, 24 Sep 2026 14:32:02 +0200 Subject: [PATCH 05/10] revert: parallel browser bundle builds Restore serial browser bundling while retaining the Node integration test shards. Co-Authored-By: GPT-6 --- packages/browser/package.json | 5 +---- packages/browser/rollup.bundle.config.mjs | 14 +------------- 2 files changed, 2 insertions(+), 17 deletions(-) diff --git a/packages/browser/package.json b/packages/browser/package.json index 99b29a9ec658..25829399515b 100644 --- a/packages/browser/package.json +++ b/packages/browser/package.json @@ -52,10 +52,7 @@ "scripts": { "build": "run-p build:transpile build:bundle build:types", "build:dev": "run-p build:transpile build:types", - "build:bundle": "run-p build:bundle:shard:*", - "build:bundle:shard:1": "rollup -c rollup.bundle.config.mjs --configShard=1", - "build:bundle:shard:2": "rollup -c rollup.bundle.config.mjs --configShard=2", - "build:bundle:shard:3": "rollup -c rollup.bundle.config.mjs --configShard=3", + "build:bundle": "rollup -c rollup.bundle.config.mjs", "build:transpile": "rollup -c rollup.npm.config.mjs", "build:types": "tsc -p tsconfig.types.json", "build:watch": "run-p build:transpile:watch build:bundle:watch", diff --git a/packages/browser/rollup.bundle.config.mjs b/packages/browser/rollup.bundle.config.mjs index 9b86cfe5e52d..d5bbc92dbabb 100644 --- a/packages/browser/rollup.bundle.config.mjs +++ b/packages/browser/rollup.bundle.config.mjs @@ -157,16 +157,4 @@ builds.push( ...makeBundleConfigVariants(tracingReplayFeedbackLogsMetricsBaseBundleConfig), ); -export default ({ configShard } = {}) => { - if (configShard === undefined) { - return builds; - } - - const shard = Number(configShard); - - if (![1, 2, 3].includes(shard)) { - throw new Error('configShard must be 1, 2, or 3'); - } - - return builds.filter((_, index) => Math.floor(index / 3) % 3 === shard - 1); -}; +export default builds; From 86905948772afc5da552b92a12aa785c345da34c Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Thu, 24 Sep 2026 14:59:53 +0200 Subject: [PATCH 06/10] build: reuse debug bundle builds for minified output Generate unminified and minified debug bundles from one Rollup build, retaining a separate production build and the existing output plugin order. Co-Authored-By: GPT-6 --- dev-packages/rollup-utils/bundleHelpers.mjs | 26 +++++++++++++-------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/dev-packages/rollup-utils/bundleHelpers.mjs b/dev-packages/rollup-utils/bundleHelpers.mjs index 6ac5f6aff06d..0e039ebfca08 100644 --- a/dev-packages/rollup-utils/bundleHelpers.mjs +++ b/dev-packages/rollup-utils/bundleHelpers.mjs @@ -142,9 +142,7 @@ export function makeBaseBundleConfig(options) { * @param baseConfig The rollup config shared by the entire package * @returns An array of versions of that config */ -export function makeBundleConfigVariants(baseConfig, options = {}) { - const { variants = BUNDLE_VARIANTS } = options; - +export function makeBundleConfigVariants(baseConfig) { const includeDebuggingPlugin = makeIsDebugBuildPlugin(true); const stripDebuggingPlugin = makeIsDebugBuildPlugin(false); const terserPlugin = makeTerserPlugin(); @@ -174,14 +172,22 @@ export function makeBundleConfigVariants(baseConfig, options = {}) { }, }; - return variants.map(variant => { - if (!BUNDLE_VARIANTS.includes(variant)) { - throw new Error(`Unknown bundle variant requested: ${variant}`); - } - return deepMerge(baseConfig, variantSpecificConfigMap[variant], { + const [debug, production, minifiedDebug] = BUNDLE_VARIANTS.map(variant => + deepMerge(baseConfig, variantSpecificConfigMap[variant], { // Merge the plugin arrays and make sure the end result is in the correct order. Everything else can use the // default merge strategy. customMerge: key => (key === 'plugins' ? mergePlugins : undefined), - }); - }); + }), + ); + + const isOutputPlugin = plugin => ['terser', 'license'].includes(plugin.name); + + debug.output = [debug, minifiedDebug].map(config => ({ + ...config.output, + plugins: config.plugins.filter(isOutputPlugin), + })); + + debug.plugins = debug.plugins.filter(plugin => !isOutputPlugin(plugin)); + + return [debug, production]; } From 2aa229dfacef3691bf524e0dab6bfddcd3fe2561 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Thu, 24 Sep 2026 15:29:10 +0200 Subject: [PATCH 07/10] ci: focus experiment on test parallelism Increase browser Playwright CI workers to six. Remove Node timing reports and restore the original bundle build, retaining three shards for every Node integration configuration. Co-Authored-By: GPT-6 --- .github/workflows/build.yml | 11 -------- .../playwright.browser.config.ts | 1 + .../node-integration-tests/vite.config.ts | 2 +- dev-packages/rollup-utils/bundleHelpers.mjs | 26 +++++++------------ 4 files changed, 12 insertions(+), 28 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c73b283234f4..db94caeeac7e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -842,17 +842,6 @@ jobs: working-directory: dev-packages/node-integration-tests run: yarn test --shard=${{ matrix.shard }}/3 - - name: Upload test timing report - uses: actions/upload-artifact@v7 - if: ${{ !cancelled() }} - with: - name: - node-integration-timings-node-${{ matrix.node }}-ts-${{ matrix.typescript || 'default' }}-shard-${{ - matrix.shard }} - path: dev-packages/node-integration-tests/vitest.junit.xml - retention-days: 7 - if-no-files-found: warn - job_cloudflare_integration_tests: name: Cloudflare Integration Tests needs: [job_get_metadata, job_build] diff --git a/dev-packages/browser-integration-tests/playwright.browser.config.ts b/dev-packages/browser-integration-tests/playwright.browser.config.ts index dd48c8f54746..e10142ecc8ca 100644 --- a/dev-packages/browser-integration-tests/playwright.browser.config.ts +++ b/dev-packages/browser-integration-tests/playwright.browser.config.ts @@ -3,6 +3,7 @@ import CorePlaywrightConfig from './playwright.config'; const config: PlaywrightTestConfig = { ...CorePlaywrightConfig, + workers: process.env.CI ? 6 : CorePlaywrightConfig.workers, testDir: './suites', }; diff --git a/dev-packages/node-integration-tests/vite.config.ts b/dev-packages/node-integration-tests/vite.config.ts index 94527985f216..5a8b87af8dce 100644 --- a/dev-packages/node-integration-tests/vite.config.ts +++ b/dev-packages/node-integration-tests/vite.config.ts @@ -25,7 +25,7 @@ export default defineConfig({ reporters: process.env.DEBUG ? [['default', { summary: false }]] : process.env.GITHUB_ACTIONS - ? ['dot', 'github-actions', ['junit', { classnameTemplate: '{filepath}' }]] + ? ['dot', 'github-actions'] : ['verbose'], }, }); diff --git a/dev-packages/rollup-utils/bundleHelpers.mjs b/dev-packages/rollup-utils/bundleHelpers.mjs index 0e039ebfca08..6ac5f6aff06d 100644 --- a/dev-packages/rollup-utils/bundleHelpers.mjs +++ b/dev-packages/rollup-utils/bundleHelpers.mjs @@ -142,7 +142,9 @@ export function makeBaseBundleConfig(options) { * @param baseConfig The rollup config shared by the entire package * @returns An array of versions of that config */ -export function makeBundleConfigVariants(baseConfig) { +export function makeBundleConfigVariants(baseConfig, options = {}) { + const { variants = BUNDLE_VARIANTS } = options; + const includeDebuggingPlugin = makeIsDebugBuildPlugin(true); const stripDebuggingPlugin = makeIsDebugBuildPlugin(false); const terserPlugin = makeTerserPlugin(); @@ -172,22 +174,14 @@ export function makeBundleConfigVariants(baseConfig) { }, }; - const [debug, production, minifiedDebug] = BUNDLE_VARIANTS.map(variant => - deepMerge(baseConfig, variantSpecificConfigMap[variant], { + return variants.map(variant => { + if (!BUNDLE_VARIANTS.includes(variant)) { + throw new Error(`Unknown bundle variant requested: ${variant}`); + } + return deepMerge(baseConfig, variantSpecificConfigMap[variant], { // Merge the plugin arrays and make sure the end result is in the correct order. Everything else can use the // default merge strategy. customMerge: key => (key === 'plugins' ? mergePlugins : undefined), - }), - ); - - const isOutputPlugin = plugin => ['terser', 'license'].includes(plugin.name); - - debug.output = [debug, minifiedDebug].map(config => ({ - ...config.output, - plugins: config.plugins.filter(isOutputPlugin), - })); - - debug.plugins = debug.plugins.filter(plugin => !isOutputPlugin(plugin)); - - return [debug, production]; + }); + }); } From 7080ca93edcbaff2947ffa98bf6f6ba96cdcf7ce Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Thu, 24 Sep 2026 15:53:34 +0200 Subject: [PATCH 08/10] ci: retry browser bundle sharding with six Playwright workers Restore three Rollup processes on the existing bundle runner to measure their effect alongside the current test parallelism. Co-Authored-By: GPT-6 --- packages/browser/package.json | 5 ++++- packages/browser/rollup.bundle.config.mjs | 14 +++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/packages/browser/package.json b/packages/browser/package.json index 25829399515b..99b29a9ec658 100644 --- a/packages/browser/package.json +++ b/packages/browser/package.json @@ -52,7 +52,10 @@ "scripts": { "build": "run-p build:transpile build:bundle build:types", "build:dev": "run-p build:transpile build:types", - "build:bundle": "rollup -c rollup.bundle.config.mjs", + "build:bundle": "run-p build:bundle:shard:*", + "build:bundle:shard:1": "rollup -c rollup.bundle.config.mjs --configShard=1", + "build:bundle:shard:2": "rollup -c rollup.bundle.config.mjs --configShard=2", + "build:bundle:shard:3": "rollup -c rollup.bundle.config.mjs --configShard=3", "build:transpile": "rollup -c rollup.npm.config.mjs", "build:types": "tsc -p tsconfig.types.json", "build:watch": "run-p build:transpile:watch build:bundle:watch", diff --git a/packages/browser/rollup.bundle.config.mjs b/packages/browser/rollup.bundle.config.mjs index d5bbc92dbabb..9b86cfe5e52d 100644 --- a/packages/browser/rollup.bundle.config.mjs +++ b/packages/browser/rollup.bundle.config.mjs @@ -157,4 +157,16 @@ builds.push( ...makeBundleConfigVariants(tracingReplayFeedbackLogsMetricsBaseBundleConfig), ); -export default builds; +export default ({ configShard } = {}) => { + if (configShard === undefined) { + return builds; + } + + const shard = Number(configShard); + + if (![1, 2, 3].includes(shard)) { + throw new Error('configShard must be 1, 2, or 3'); + } + + return builds.filter((_, index) => Math.floor(index / 3) % 3 === shard - 1); +}; From cda611684f0eecb1b173c43b09c05c21db09f46e Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Thu, 24 Sep 2026 16:20:54 +0200 Subject: [PATCH 09/10] ci: try six workers across Playwright suites Restore serial browser bundling and retain three Node integration shards. Co-Authored-By: GPT-6 --- .../playwright.browser.config.ts | 1 - .../browser-integration-tests/playwright.config.ts | 4 +--- .../playwright.config.ts | 3 +-- .../ember-classic/playwright.config.ts | 2 +- .../ember-embroider/playwright.config.ts | 2 +- .../playwright.config.mjs | 1 + .../playwright.config.mjs | 1 + .../react-send-to-sentry/playwright.config.mjs | 3 +-- dev-packages/test-utils/src/playwright-config.ts | 2 +- packages/browser/package.json | 5 +---- packages/browser/rollup.bundle.config.mjs | 14 +------------- 11 files changed, 10 insertions(+), 28 deletions(-) diff --git a/dev-packages/browser-integration-tests/playwright.browser.config.ts b/dev-packages/browser-integration-tests/playwright.browser.config.ts index e10142ecc8ca..dd48c8f54746 100644 --- a/dev-packages/browser-integration-tests/playwright.browser.config.ts +++ b/dev-packages/browser-integration-tests/playwright.browser.config.ts @@ -3,7 +3,6 @@ import CorePlaywrightConfig from './playwright.config'; const config: PlaywrightTestConfig = { ...CorePlaywrightConfig, - workers: process.env.CI ? 6 : CorePlaywrightConfig.workers, testDir: './suites', }; diff --git a/dev-packages/browser-integration-tests/playwright.config.ts b/dev-packages/browser-integration-tests/playwright.config.ts index 681de57d4e59..e3429c03d842 100644 --- a/dev-packages/browser-integration-tests/playwright.config.ts +++ b/dev-packages/browser-integration-tests/playwright.config.ts @@ -5,9 +5,7 @@ const config: PlaywrightTestConfig = { retries: 0, // Run tests inside of a single file in parallel fullyParallel: true, - // Use 3 workers on CI, else use defaults (based on available CPU cores) - // Note that 3 is a random number selected to work well with our CI setup - workers: process.env.CI ? 3 : undefined, + workers: process.env.CI ? 6 : undefined, testMatch: /test.ts/, use: { diff --git a/dev-packages/e2e-tests/test-applications/cloudflare-workers-send-to-sentry/playwright.config.ts b/dev-packages/e2e-tests/test-applications/cloudflare-workers-send-to-sentry/playwright.config.ts index 0b79fb88052f..50dda89a2e73 100644 --- a/dev-packages/e2e-tests/test-applications/cloudflare-workers-send-to-sentry/playwright.config.ts +++ b/dev-packages/e2e-tests/test-applications/cloudflare-workers-send-to-sentry/playwright.config.ts @@ -10,7 +10,6 @@ export default defineConfig({ fullyParallel: true, forbidOnly: !!process.env.CI, retries: 0, - // Every test spends most of its time polling Sentry, so run them all at once. - workers: '100%', + workers: process.env.CI ? 6 : '100%', reporter: process.env.CI ? [['list'], ['junit', { outputFile: 'results.junit.xml' }]] : 'list', }); diff --git a/dev-packages/e2e-tests/test-applications/ember-classic/playwright.config.ts b/dev-packages/e2e-tests/test-applications/ember-classic/playwright.config.ts index 8d378b127c72..ec3fe09f15b6 100644 --- a/dev-packages/e2e-tests/test-applications/ember-classic/playwright.config.ts +++ b/dev-packages/e2e-tests/test-applications/ember-classic/playwright.config.ts @@ -30,7 +30,7 @@ const config: PlaywrightTestConfig = { timeout: 10000, }, fullyParallel: false, - workers: 1, + workers: process.env.CI ? 6 : 1, /* Fail the build on CI if you accidentally left test.only in the source code. */ forbidOnly: !!process.env.CI, retries: 0, diff --git a/dev-packages/e2e-tests/test-applications/ember-embroider/playwright.config.ts b/dev-packages/e2e-tests/test-applications/ember-embroider/playwright.config.ts index 8d378b127c72..ec3fe09f15b6 100644 --- a/dev-packages/e2e-tests/test-applications/ember-embroider/playwright.config.ts +++ b/dev-packages/e2e-tests/test-applications/ember-embroider/playwright.config.ts @@ -30,7 +30,7 @@ const config: PlaywrightTestConfig = { timeout: 10000, }, fullyParallel: false, - workers: 1, + workers: process.env.CI ? 6 : 1, /* Fail the build on CI if you accidentally left test.only in the source code. */ forbidOnly: !!process.env.CI, retries: 0, diff --git a/dev-packages/e2e-tests/test-applications/node-express-send-to-sentry-static/playwright.config.mjs b/dev-packages/e2e-tests/test-applications/node-express-send-to-sentry-static/playwright.config.mjs index 9401872607c3..3618dd8efe50 100644 --- a/dev-packages/e2e-tests/test-applications/node-express-send-to-sentry-static/playwright.config.mjs +++ b/dev-packages/e2e-tests/test-applications/node-express-send-to-sentry-static/playwright.config.mjs @@ -18,6 +18,7 @@ const config = { }, /* Run tests in files in parallel */ fullyParallel: true, + workers: process.env.CI ? 6 : undefined, /* Fail the build on CI if you accidentally left test.only in the source code. */ forbidOnly: !!process.env.CI, /* Retry on CI only */ diff --git a/dev-packages/e2e-tests/test-applications/node-express-send-to-sentry/playwright.config.mjs b/dev-packages/e2e-tests/test-applications/node-express-send-to-sentry/playwright.config.mjs index 9401872607c3..3618dd8efe50 100644 --- a/dev-packages/e2e-tests/test-applications/node-express-send-to-sentry/playwright.config.mjs +++ b/dev-packages/e2e-tests/test-applications/node-express-send-to-sentry/playwright.config.mjs @@ -18,6 +18,7 @@ const config = { }, /* Run tests in files in parallel */ fullyParallel: true, + workers: process.env.CI ? 6 : undefined, /* Fail the build on CI if you accidentally left test.only in the source code. */ forbidOnly: !!process.env.CI, /* Retry on CI only */ diff --git a/dev-packages/e2e-tests/test-applications/react-send-to-sentry/playwright.config.mjs b/dev-packages/e2e-tests/test-applications/react-send-to-sentry/playwright.config.mjs index e37a753b9cff..5c77c6113f06 100644 --- a/dev-packages/e2e-tests/test-applications/react-send-to-sentry/playwright.config.mjs +++ b/dev-packages/e2e-tests/test-applications/react-send-to-sentry/playwright.config.mjs @@ -20,8 +20,7 @@ const config = { forbidOnly: !!process.env.CI, /* Retry on CI only */ retries: 0, - /* Opt out of parallel tests on CI. */ - workers: 1, + workers: process.env.CI ? 6 : 1, /* Reporter to use. See https://playwright.dev/docs/test-reporters */ reporter: process.env.CI ? [['list'], ['junit', { outputFile: 'results.junit.xml' }]] : 'list', /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ diff --git a/dev-packages/test-utils/src/playwright-config.ts b/dev-packages/test-utils/src/playwright-config.ts index 596de3e52db3..c44487446e92 100644 --- a/dev-packages/test-utils/src/playwright-config.ts +++ b/dev-packages/test-utils/src/playwright-config.ts @@ -31,7 +31,6 @@ export function getPlaywrightConfig( timeout: 10000, }, fullyParallel: false, - workers: 1, /* Fail the build on CI if you accidentally left test.only in the source code. */ forbidOnly: !!process.env.CI, /* In dev mode some apps are flaky, so we allow retry there... */ @@ -96,5 +95,6 @@ export function getPlaywrightConfig( return { ...config, ...overwriteConfig, + workers: process.env.CI ? 6 : (overwriteConfig?.workers ?? 1), }; } diff --git a/packages/browser/package.json b/packages/browser/package.json index 99b29a9ec658..25829399515b 100644 --- a/packages/browser/package.json +++ b/packages/browser/package.json @@ -52,10 +52,7 @@ "scripts": { "build": "run-p build:transpile build:bundle build:types", "build:dev": "run-p build:transpile build:types", - "build:bundle": "run-p build:bundle:shard:*", - "build:bundle:shard:1": "rollup -c rollup.bundle.config.mjs --configShard=1", - "build:bundle:shard:2": "rollup -c rollup.bundle.config.mjs --configShard=2", - "build:bundle:shard:3": "rollup -c rollup.bundle.config.mjs --configShard=3", + "build:bundle": "rollup -c rollup.bundle.config.mjs", "build:transpile": "rollup -c rollup.npm.config.mjs", "build:types": "tsc -p tsconfig.types.json", "build:watch": "run-p build:transpile:watch build:bundle:watch", diff --git a/packages/browser/rollup.bundle.config.mjs b/packages/browser/rollup.bundle.config.mjs index 9b86cfe5e52d..d5bbc92dbabb 100644 --- a/packages/browser/rollup.bundle.config.mjs +++ b/packages/browser/rollup.bundle.config.mjs @@ -157,16 +157,4 @@ builds.push( ...makeBundleConfigVariants(tracingReplayFeedbackLogsMetricsBaseBundleConfig), ); -export default ({ configShard } = {}) => { - if (configShard === undefined) { - return builds; - } - - const shard = Number(configShard); - - if (![1, 2, 3].includes(shard)) { - throw new Error('configShard must be 1, 2, or 3'); - } - - return builds.filter((_, index) => Math.floor(index / 3) % 3 === shard - 1); -}; +export default builds; From 757384f7d60e319cee63e143b011fbaeb0444711 Mon Sep 17 00:00:00 2001 From: Nicolas Hrubec Date: Thu, 24 Sep 2026 16:31:26 +0200 Subject: [PATCH 10/10] ci: keep six workers only for browser Playwright Restore the previously passing configuration with three Node integration shards and original bundling. Co-Authored-By: GPT-6 --- .../browser-integration-tests/playwright.browser.config.ts | 1 + dev-packages/browser-integration-tests/playwright.config.ts | 4 +++- .../cloudflare-workers-send-to-sentry/playwright.config.ts | 3 ++- .../test-applications/ember-classic/playwright.config.ts | 2 +- .../test-applications/ember-embroider/playwright.config.ts | 2 +- .../node-express-send-to-sentry-static/playwright.config.mjs | 1 - .../node-express-send-to-sentry/playwright.config.mjs | 1 - .../react-send-to-sentry/playwright.config.mjs | 3 ++- dev-packages/test-utils/src/playwright-config.ts | 2 +- 9 files changed, 11 insertions(+), 8 deletions(-) diff --git a/dev-packages/browser-integration-tests/playwright.browser.config.ts b/dev-packages/browser-integration-tests/playwright.browser.config.ts index dd48c8f54746..e10142ecc8ca 100644 --- a/dev-packages/browser-integration-tests/playwright.browser.config.ts +++ b/dev-packages/browser-integration-tests/playwright.browser.config.ts @@ -3,6 +3,7 @@ import CorePlaywrightConfig from './playwright.config'; const config: PlaywrightTestConfig = { ...CorePlaywrightConfig, + workers: process.env.CI ? 6 : CorePlaywrightConfig.workers, testDir: './suites', }; diff --git a/dev-packages/browser-integration-tests/playwright.config.ts b/dev-packages/browser-integration-tests/playwright.config.ts index e3429c03d842..681de57d4e59 100644 --- a/dev-packages/browser-integration-tests/playwright.config.ts +++ b/dev-packages/browser-integration-tests/playwright.config.ts @@ -5,7 +5,9 @@ const config: PlaywrightTestConfig = { retries: 0, // Run tests inside of a single file in parallel fullyParallel: true, - workers: process.env.CI ? 6 : undefined, + // Use 3 workers on CI, else use defaults (based on available CPU cores) + // Note that 3 is a random number selected to work well with our CI setup + workers: process.env.CI ? 3 : undefined, testMatch: /test.ts/, use: { diff --git a/dev-packages/e2e-tests/test-applications/cloudflare-workers-send-to-sentry/playwright.config.ts b/dev-packages/e2e-tests/test-applications/cloudflare-workers-send-to-sentry/playwright.config.ts index 50dda89a2e73..0b79fb88052f 100644 --- a/dev-packages/e2e-tests/test-applications/cloudflare-workers-send-to-sentry/playwright.config.ts +++ b/dev-packages/e2e-tests/test-applications/cloudflare-workers-send-to-sentry/playwright.config.ts @@ -10,6 +10,7 @@ export default defineConfig({ fullyParallel: true, forbidOnly: !!process.env.CI, retries: 0, - workers: process.env.CI ? 6 : '100%', + // Every test spends most of its time polling Sentry, so run them all at once. + workers: '100%', reporter: process.env.CI ? [['list'], ['junit', { outputFile: 'results.junit.xml' }]] : 'list', }); diff --git a/dev-packages/e2e-tests/test-applications/ember-classic/playwright.config.ts b/dev-packages/e2e-tests/test-applications/ember-classic/playwright.config.ts index ec3fe09f15b6..8d378b127c72 100644 --- a/dev-packages/e2e-tests/test-applications/ember-classic/playwright.config.ts +++ b/dev-packages/e2e-tests/test-applications/ember-classic/playwright.config.ts @@ -30,7 +30,7 @@ const config: PlaywrightTestConfig = { timeout: 10000, }, fullyParallel: false, - workers: process.env.CI ? 6 : 1, + workers: 1, /* Fail the build on CI if you accidentally left test.only in the source code. */ forbidOnly: !!process.env.CI, retries: 0, diff --git a/dev-packages/e2e-tests/test-applications/ember-embroider/playwright.config.ts b/dev-packages/e2e-tests/test-applications/ember-embroider/playwright.config.ts index ec3fe09f15b6..8d378b127c72 100644 --- a/dev-packages/e2e-tests/test-applications/ember-embroider/playwright.config.ts +++ b/dev-packages/e2e-tests/test-applications/ember-embroider/playwright.config.ts @@ -30,7 +30,7 @@ const config: PlaywrightTestConfig = { timeout: 10000, }, fullyParallel: false, - workers: process.env.CI ? 6 : 1, + workers: 1, /* Fail the build on CI if you accidentally left test.only in the source code. */ forbidOnly: !!process.env.CI, retries: 0, diff --git a/dev-packages/e2e-tests/test-applications/node-express-send-to-sentry-static/playwright.config.mjs b/dev-packages/e2e-tests/test-applications/node-express-send-to-sentry-static/playwright.config.mjs index 3618dd8efe50..9401872607c3 100644 --- a/dev-packages/e2e-tests/test-applications/node-express-send-to-sentry-static/playwright.config.mjs +++ b/dev-packages/e2e-tests/test-applications/node-express-send-to-sentry-static/playwright.config.mjs @@ -18,7 +18,6 @@ const config = { }, /* Run tests in files in parallel */ fullyParallel: true, - workers: process.env.CI ? 6 : undefined, /* Fail the build on CI if you accidentally left test.only in the source code. */ forbidOnly: !!process.env.CI, /* Retry on CI only */ diff --git a/dev-packages/e2e-tests/test-applications/node-express-send-to-sentry/playwright.config.mjs b/dev-packages/e2e-tests/test-applications/node-express-send-to-sentry/playwright.config.mjs index 3618dd8efe50..9401872607c3 100644 --- a/dev-packages/e2e-tests/test-applications/node-express-send-to-sentry/playwright.config.mjs +++ b/dev-packages/e2e-tests/test-applications/node-express-send-to-sentry/playwright.config.mjs @@ -18,7 +18,6 @@ const config = { }, /* Run tests in files in parallel */ fullyParallel: true, - workers: process.env.CI ? 6 : undefined, /* Fail the build on CI if you accidentally left test.only in the source code. */ forbidOnly: !!process.env.CI, /* Retry on CI only */ diff --git a/dev-packages/e2e-tests/test-applications/react-send-to-sentry/playwright.config.mjs b/dev-packages/e2e-tests/test-applications/react-send-to-sentry/playwright.config.mjs index 5c77c6113f06..e37a753b9cff 100644 --- a/dev-packages/e2e-tests/test-applications/react-send-to-sentry/playwright.config.mjs +++ b/dev-packages/e2e-tests/test-applications/react-send-to-sentry/playwright.config.mjs @@ -20,7 +20,8 @@ const config = { forbidOnly: !!process.env.CI, /* Retry on CI only */ retries: 0, - workers: process.env.CI ? 6 : 1, + /* Opt out of parallel tests on CI. */ + workers: 1, /* Reporter to use. See https://playwright.dev/docs/test-reporters */ reporter: process.env.CI ? [['list'], ['junit', { outputFile: 'results.junit.xml' }]] : 'list', /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ diff --git a/dev-packages/test-utils/src/playwright-config.ts b/dev-packages/test-utils/src/playwright-config.ts index c44487446e92..596de3e52db3 100644 --- a/dev-packages/test-utils/src/playwright-config.ts +++ b/dev-packages/test-utils/src/playwright-config.ts @@ -31,6 +31,7 @@ export function getPlaywrightConfig( timeout: 10000, }, fullyParallel: false, + workers: 1, /* Fail the build on CI if you accidentally left test.only in the source code. */ forbidOnly: !!process.env.CI, /* In dev mode some apps are flaky, so we allow retry there... */ @@ -95,6 +96,5 @@ export function getPlaywrightConfig( return { ...config, ...overwriteConfig, - workers: process.env.CI ? 6 : (overwriteConfig?.workers ?? 1), }; }