From ea4d284cc9f697c19f43f38be92ef757c9ff59f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Sat, 8 Aug 2026 04:45:04 +0200 Subject: [PATCH] ci: carry the report per shard and point the guard at the running job The determinism guard reads the job that runs the browser, which is now the shard matrix rather than the gate that only carries the required check name. The report artifact is named per shard so the two uploads cannot clobber each other. --- .github/workflows/e2e.yml | 2 +- scripts/__tests__/ci-determinism.test.ts | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 1eab3326e..6bc757ed4 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -105,7 +105,7 @@ jobs: if: always() uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: - name: playwright-report + name: playwright-report-shard-${{ matrix.shard }} path: playwright-report/ retention-days: 7 if-no-files-found: ignore diff --git a/scripts/__tests__/ci-determinism.test.ts b/scripts/__tests__/ci-determinism.test.ts index 1a8cfac66..34bac3b29 100644 --- a/scripts/__tests__/ci-determinism.test.ts +++ b/scripts/__tests__/ci-determinism.test.ts @@ -77,14 +77,19 @@ describe("Playwright CI determinism", () => { const workflow = parse( readRepoFile(".github/workflows/e2e.yml"), ) as Workflow; - const upload = workflow.jobs.e2e?.steps?.find((step) => + // The suite runs as a shard matrix since the single job outgrew its + // timeout; the running job is `shard`, while `e2e` is the gate that + // carries the required check name and runs no browser. The report + // therefore lives on the shard job, named per shard so the two + // artifacts cannot clobber each other. + const upload = workflow.jobs.shard?.steps?.find((step) => step.uses?.startsWith("actions/upload-artifact@"), ); expect(upload).toBeDefined(); expect(upload?.if).toBe("always()"); expect(upload?.with).toMatchObject({ - name: "playwright-report", + name: "playwright-report-shard-${{ matrix.shard }}", path: "playwright-report/", "retention-days": 7, "if-no-files-found": "ignore", @@ -95,7 +100,7 @@ describe("Playwright CI determinism", () => { const workflow = parse( readRepoFile(".github/workflows/e2e.yml"), ) as Workflow; - const env = workflow.jobs.e2e?.env; + const env = workflow.jobs.shard?.env; expect(env?.API_TOKEN_HMAC_KEY).toMatch(/^[0-9a-f]{64}$/); expect(env?.SESSION_COOKIE_SECURE).toBe("false");