ci: run browser jobs in official Playwright container#20
Merged
Conversation
`pnpm dlx playwright install --with-deps chromium` hangs indefinitely after the browser download reaches 100% on the Blacksmith runners (the download stream never finalizes), so every job that installs browsers — CI `test` and the four browser E2E examples — runs forever until manually cancelled. Retries/timeouts don't help because the hang is deterministic. Run those jobs inside `mcr.microsoft.com/playwright:v1.59.1-noble`, whose browsers (chromium v1217) are pre-baked and match the pinned playwright 1.59.1, removing the `playwright install` download entirely. Non-browser E2E examples stay on the bare runner so their bun/deno toolchains are untouched. Add timeout-minutes as a safety net. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Contributor
Preview releaseLatest commit: No packages have been released. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
The
testjob (CI) and the four browser E2E examples (spa-vite-dynamic,spa-vite-plugin,ssr-react-router,ssr-tanstack-start) hang indefinitely, blocking #18 and #19.The hang is in
mise run playwright:install→pnpm dlx playwright@1.59.1 install --with-deps chromium: the browser download reaches100% of 170.4 MiBand then never finalizes (never prints… downloaded to …). Since the jobs had notimeout-minutes, they ran until manually cancelled — hence every check showsCANCELLED, notFAILURE.It is deterministic, not flaky — in #18's patched run it hung identically on 3 consecutive
timeout-killed retries. That's why retry/cache/timeout patches can't fix it: retrying a deterministic hang just hangs again, and the cache only populates after a successful install that never happens. It reproduces on the Blacksmithblacksmith-4vcpu-ubuntu-2404runners; the last greenmainrun (#17, 2026-05-21) downloaded fine in non-TTY mode in ~3s, while the failing runs render an interactive progress bar and stall at 100%.Not caused by either PR's code: #19 doesn't touch CI/toolchain at all and hangs the same way.
Fix
Run the browser jobs inside
mcr.microsoft.com/playwright:v1.59.1-noble, whose browsers (chromium v1217) are pre-baked and match the repo-wide pinnedplaywright@1.59.1. This removes theplaywright installdownload entirely.ci.yml—testjob runs in the container; dropped theplaywright:installstep (lib vitest browser tests use the baked browser viaPLAYWRIGHT_BROWSERS_PATH=/ms-playwright).e2e.yml— container applied conditionally only tomatrix.browserentries (container: ${{ matrix.browser && '…' || '' }}, empty ⇒ no container); non-browser examples stay on the bare runner so their bun/deno toolchains are untouched. Dropped theplaywright:installstep.timeout-minutesto both jobs as a safety net (so any future hang fails fast instead of running for hours).mise.toml(theplaywright:installtask stays for local dev) or to any package code.Unblocks
maininherits this.main.🤖 Generated with Claude Code