From 9d133bda6544caab82fef587af920081f460b484 Mon Sep 17 00:00:00 2001 From: Steve Tsala Date: Mon, 24 Aug 2026 07:31:55 -0400 Subject: [PATCH] fix(ci): unblock test-e2e by upgrading Playwright past the yauzl hang MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `pnpm exec playwright install --with-deps` has been hanging until the 6h GitHub Actions limit kills the job, so `test-e2e` has not completed on any PR since 2026-05-12. The hang is not in the system dependency install: apt finishes normally, then the job stalls right after the browser archive download reaches 100%, during extraction. The cause is a yauzl regression (thejoshwolfe/yauzl#168) where the `for await` over `openReadStream` never completes on Node 24.16.0+ and Node 26.x — see microsoft/playwright#40724, which was filed against Playwright 1.59.1 on Node 26, exactly this configuration. Playwright vendored the fix in 1.60.0; this repo has been pinned to 1.59.1 since 2026-04-01. The e2e job runs `node-version: latest`, which started resolving to Node 26 when 26.0.0 shipped on 2026-05-05 — the last green test-e2e run was 2026-05-05, and the first 6h hang was 2026-05-12. Renovate had already queued the 1.62.1 bump, but it is rate-limited in the dependency dashboard (#2173), and its devDependency automerge waits on a CI run that can no longer go green — so the update that fixes this is blocked by the problem it fixes. Also add `timeout-minutes` to the job: without it a future hang costs 6h of runner time per run, and in-progress job logs cannot be read via the API, which makes such a hang needlessly hard to diagnose. Co-Authored-By: Claude Opus 5 (1M context) --- .github/workflows/ci.yml | 3 +++ package.json | 2 +- pnpm-lock.yaml | 38 +++++++++++++++++++------------------- 3 files changed, 23 insertions(+), 20 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 014c1f885..7f19b0d58 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,6 +39,9 @@ jobs: - run: pnpm test test-e2e: runs-on: ubuntu-latest + # Browser installation has hung indefinitely before (microsoft/playwright#40724). + # Without a timeout, a hung job burns the full 6h runner limit before being killed. + timeout-minutes: 20 steps: - uses: actions/checkout@v6 - uses: actions/setup-node@v6 diff --git a/package.json b/package.json index aa1921aba..d7e79f90f 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "@biomejs/biome": "2.4.14", "@changesets/changelog-github": "0.7.0", "@changesets/cli": "2.31.0", - "@playwright/test": "1.59.1", + "@playwright/test": "1.62.1", "@size-limit/preset-small-lib": "12.1.0", "@types/node": "25.6.0", "prettier": "3.8.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3d3b87bc5..cb3be3a61 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,8 +33,8 @@ importers: specifier: 2.31.0 version: 2.31.0(@types/node@25.6.0) '@playwright/test': - specifier: 1.59.1 - version: 1.59.1 + specifier: 1.62.1 + version: 1.62.1 '@size-limit/preset-small-lib': specifier: 12.1.0 version: 12.1.0(size-limit@12.1.0(jiti@2.6.1)) @@ -116,7 +116,7 @@ importers: dependencies: next: specifier: ^15.5.12 - version: 15.5.12(@playwright/test@1.59.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 15.5.12(@playwright/test@1.62.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) openapi-fetch: specifier: workspace:^ version: link:../.. @@ -1562,9 +1562,9 @@ packages: '@paralleldrive/cuid2@2.3.1': resolution: {integrity: sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==} - '@playwright/test@1.59.1': - resolution: {integrity: sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==} - engines: {node: '>=18'} + '@playwright/test@1.62.1': + resolution: {integrity: sha512-DTcUc8qii+cpHvtOwggMtBRMjKZHXYWdw8syRYu2vtzuq4Wxphqq4NfCs5Zt44L6mA8rfDfj+PHnxFc/FeK6mQ==} + engines: {node: '>=20'} hasBin: true '@polka/url@1.0.0-next.29': @@ -3573,14 +3573,14 @@ packages: pkg-types@2.3.0: resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} - playwright-core@1.59.1: - resolution: {integrity: sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==} - engines: {node: '>=18'} + playwright-core@1.62.1: + resolution: {integrity: sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==} + engines: {node: '>=20'} hasBin: true - playwright@1.59.1: - resolution: {integrity: sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==} - engines: {node: '>=18'} + playwright@1.62.1: + resolution: {integrity: sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==} + engines: {node: '>=20'} hasBin: true pluralize@8.0.0: @@ -5648,9 +5648,9 @@ snapshots: dependencies: '@noble/hashes': 1.8.0 - '@playwright/test@1.59.1': + '@playwright/test@1.62.1': dependencies: - playwright: 1.59.1 + playwright: 1.62.1 '@polka/url@1.0.0-next.29': {} @@ -7585,7 +7585,7 @@ snapshots: neo-async@2.6.2: {} - next@15.5.12(@playwright/test@1.59.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@15.5.12(@playwright/test@1.62.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 15.5.12 '@swc/helpers': 0.5.15 @@ -7603,7 +7603,7 @@ snapshots: '@next/swc-linux-x64-musl': 15.5.12 '@next/swc-win32-arm64-msvc': 15.5.12 '@next/swc-win32-x64-msvc': 15.5.12 - '@playwright/test': 1.59.1 + '@playwright/test': 1.62.1 sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' @@ -7757,11 +7757,11 @@ snapshots: exsolve: 1.0.8 pathe: 2.0.3 - playwright-core@1.59.1: {} + playwright-core@1.62.1: {} - playwright@1.59.1: + playwright@1.62.1: dependencies: - playwright-core: 1.59.1 + playwright-core: 1.62.1 optionalDependencies: fsevents: 2.3.2