Skip to content

fix(ci): unblock test-e2e by upgrading Playwright past the yauzl hang - #2854

Open
SteveGT96 wants to merge 1 commit into
openapi-ts:mainfrom
SteveGT96:fix/playwright-e2e-hang
Open

fix(ci): unblock test-e2e by upgrading Playwright past the yauzl hang#2854
SteveGT96 wants to merge 1 commit into
openapi-ts:mainfrom
SteveGT96:fix/playwright-e2e-hang

Conversation

@SteveGT96

Copy link
Copy Markdown

Changes

test-e2e has not completed on any PR since 2026-05-12. It hangs on pnpm exec playwright install --with-deps until GitHub kills the job at the 6-hour runner limit, so every run ends cancelled and the check never reports.

This bumps @playwright/test from 1.59.1 to 1.62.1, and adds a timeout-minutes guard to the job.

Root cause

The hang is not in the system dependency install — apt finishes normally (No services need to be restarted). The job stalls immediately after the browser archive download completes, during extraction:

16:52:29  Downloading Chrome for Testing 147.0.7727.15 (playwright chromium v1217) …
16:52:30  |■■■■■■■■…■■■■■■■■| 100% of 170.4 MiB
22:51:35  ##[error]The operation was canceled.        ← 5.98h of silence

This is the yauzl regression in thejoshwolfe/yauzl#168: the for await over openReadStream never terminates on Node 24.16.0+ and Node 26.x. See microsoft/playwright#40724 — filed against Playwright 1.59.1 on Node 26, exactly this repo's configuration — plus #41000 and #41133.

Playwright vendored the fix in 1.60.0. This repo has been pinned to 1.59.1 since 2026-04-01.

Why it started when it did

The job runs node-version: latest, which began resolving to Node 26 when 26.0.0 shipped:

Date Event
2026-04-01 @playwright/test pinned to 1.59.1
2026-05-05 19:11 last green test-e2e (run 25396835833)
2026-05-05 Node 26.0.0 releasedlatest moves to it
2026-05-11 Playwright 1.60.0 released, containing the fix
2026-05-12 first 6h hang (run 25732646823)
since every run reaching this step is killed at 6h (Node v26.3.0 in June, v26.7.0 in August)

The other jobs stay green because only test-e2e installs browsers.

Why this didn't self-heal

Renovate already queued @playwright/test → 1.62.1, but it is rate-limited in the dependency dashboard (#2173) and was never opened as a PR. And renovate.json automerges devDependency minor/patch updates only once CI passes — which it no longer can. The update that fixes this is blocked by the very problem it fixes, which is why a manual PR is needed.

On the timeout

timeout-minutes: 20 is defence in depth, not the fix. Without it a hang costs 6h of runner time per run, and since in-progress job logs aren't retrievable through the API, it also makes the next such hang much harder to diagnose — the logs above only became readable once the job was cancelled.

I scoped it to test-e2e, the only job that has demonstrably hung. Happy to extend it to the other jobs if you'd prefer them bounded too.

Considered and rejected

Pinning node-version to an LTS instead of latest: wouldn't actually fix it, since Node 24.16+ (LTS) is affected too, and it would cut CI coverage of current Node. The Playwright bump is the real fix.

How to Review

  • The behavioural claim is entirely in the version bump; packages/openapi-fetch/playwright.config.ts uses only defineConfig / devices / webServer / projects, which are unchanged across 1.59 → 1.62.
  • The real check is this PR's own test-e2e job: it should conclude in minutes instead of hanging.
  • Locally (Node 22, unaffected by the bug, so it can't reproduce the hang) playwright install extracts without stalling and the e2e suite passes on chrome and firefox; webkit only fails there on a missing host lib that --with-deps installs on CI.

Worth noting: this blocks every other open PR in the repo from showing a complete CI run, including #2853.

Checklist

  • Unit tests updated (n/a — CI and devDependency only)
  • docs/ updated (if necessary) (n/a)
  • pnpm run update:examples run (only applicable for openapi-typescript) (n/a)

`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 (openapi-ts#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) <noreply@anthropic.com>
@SteveGT96
SteveGT96 requested a review from a team as a code owner August 24, 2026 11:32
@SteveGT96
SteveGT96 requested a review from drwpow August 24, 2026 11:32
@netlify

netlify Bot commented Aug 24, 2026

Copy link
Copy Markdown

👷 Deploy request for openapi-ts pending review.

Visit the deploys page to approve it

Name Link
🔨 Latest commit 9d133bd

@changeset-bot

changeset-bot Bot commented Aug 24, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: 9d133bd

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant