Skip to content

fix(ci): bump Playwright to ^1.60.0 to fix install hang on Node 24.16+#153

Merged
constantinius merged 1 commit into
mainfrom
constantinius/fix/ci/playwright-node24-hang
Jun 29, 2026
Merged

fix(ci): bump Playwright to ^1.60.0 to fix install hang on Node 24.16+#153
constantinius merged 1 commit into
mainfrom
constantinius/fix/ci/playwright-node24-hang

Conversation

@constantinius

@constantinius constantinius commented Jun 29, 2026

Copy link
Copy Markdown
Collaborator

Problem

Every daily CI run has been failing since ~June 15 because npx playwright install chromium hangs after the browser download reaches 100%.

Root Cause

Node 24.16.0 (now the default on ubuntu-latest runners) shipped a zlib regression (nodejs/node#63487) that breaks the extract-zip/yauzl library stack used by Playwright < 1.60.0. The download completes but extraction hangs indefinitely.

Tracked upstream: microsoft/playwright#41000, #40998, #41133

Fix

  • Bump playwright from ^1.49.1^1.60.0 — Playwright 1.60.0 replaced the extraction codepath, sidestepping the Node bug
  • Revert split install workaround — the previous fix (fix(ci): split Playwright install to prevent hang on GitHub Actions #152) split install --with-deps into two steps with timeouts, which didn't address the root cause. Reverted back to the simpler single command

Why previous fixes didn't hold

Closes TET-2575

Node 24.16.0 shipped a zlib regression (nodejs/node#63487) that breaks
the extract-zip/yauzl library stack used by Playwright < 1.60.0. The
symptom: browser download completes to 100% but extraction hangs
indefinitely, hitting the 5-minute timeout on every CI run since
~June 15.

Playwright 1.60.0 replaced the extraction codepath, fixing the
incompatibility. This is the proper fix vs the previous workarounds
(splitting install steps, adding timeouts) which didn't address the
root cause.

Also reverts the split install-deps/install steps back to the simpler
single 'install --with-deps' command since that workaround is no
longer needed.

Refs: microsoft/playwright#41000, microsoft/playwright#40998
- name: Install Playwright browsers
run: npx playwright install chromium
timeout-minutes: 5
run: npx playwright install --with-deps chromium

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: The playwright install command is missing environment variables (DEBIAN_FRONTEND, NEEDRESTART_MODE) needed to prevent interactive prompts, which can cause CI jobs to hang.
Severity: HIGH

Suggested Fix

Prepend the npx playwright install command with the necessary environment variables to prevent interactive prompts. For example: env DEBIAN_FRONTEND=noninteractive NEEDRESTART_MODE=a npx playwright install --with-deps chromium.

Prompt for AI Agent
Review the code at the location below. A potential bug has been identified by an AI
agent. Verify if this is a real issue. If it is, propose a fix; if not, explain why it's
not valid.

Location: .github/workflows/daily-tests.yml#L103

Potential issue: The consolidated `npx playwright install --with-deps chromium` command
removes the `DEBIAN_FRONTEND: noninteractive` and `NEEDRESTART_MODE: a` environment
variables. These variables were previously set to prevent interactive prompts from
`apt-get` and `needrestart` on Ubuntu runners, which can cause CI jobs to hang
indefinitely. While the PR fixes a separate hang issue related to file extraction in
Playwright, removing these environment variables re-introduces a risk of hangs during
the dependency installation step. This pattern is repeated in multiple workflow files.

Also affects:

  • .github/workflows/pr-tests.yml:96~96
  • .github/workflows/pr-tests.yml:197~197

Did we get this right? 👍 / 👎 to inform future reviews.

@github-actions

Copy link
Copy Markdown

🟡 AI SDK Integration Test Results

Status: 562 tests failing (no regressions)

Summary

Metric main PR Change
Total Tests 847 847
Passed 149 149
Failed 562 562

Test Matrix

Agent Tests

SDK Basic Agent Test Conversation ID Agent Test Long Input Agent Test Tool Call Agent Test Tool Error Agent Test Vision Agent Test
cloudflare/langgraph anthropicopenai anthropicopenai anthropicopenai anthropicopenai anthropicopenai anthropicopenai
cloudflare/vercel blk, class, anthropicblk, class, openaiblk, function, anthropicblk, function, openaistr, class, anthropicstr, class, openaistr, function, anthropicstr, function, openai blk, class, anthropicblk, class, openaiblk, function, anthropicblk, function, openaistr, class, anthropicstr, class, openaistr, function, anthropicstr, function, openai blk, class, anthropicblk, class, openaiblk, function, anthropicblk, function, openaistr, class, anthropicstr, class, openaistr, function, anthropicstr, function, openai blk, class, anthropicblk, class, openaiblk, function, anthropicblk, function, openaistr, class, anthropicstr, class, openaistr, function, anthropicstr, function, openai blk, class, anthropicblk, class, openaiblk, function, anthropicblk, function, openaistr, class, anthropicstr, class, openaistr, function, anthropicstr, function, openai blk, class, anthropicblk, class, openaiblk, function, anthropicblk, function, openaistr, class, anthropicstr, class, openaistr, function, anthropicstr, function, openai
nextjs/mastra
nextjs/vercel blk, class, anthropicblk, class, openaiblk, function, anthropicblk, function, openaistr, class, anthropicstr, class, openaistr, function, anthropicstr, function, openai blk, class, anthropicblk, class, openaiblk, function, anthropicblk, function, openaistr, class, anthropicstr, class, openaistr, function, anthropicstr, function, openai blk, class, anthropicblk, class, openaiblk, function, anthropicblk, function, openaistr, class, anthropicstr, class, openaistr, function, anthropicstr, function, openai blk, class, anthropicblk, class, openaiblk, function, anthropicblk, function, openaistr, class, anthropicstr, class, openaistr, function, anthropicstr, function, openai blk, class, anthropicblk, class, openaiblk, function, anthropicblk, function, openaistr, class, anthropicstr, class, openaistr, function, anthropicstr, function, openai blk, class, anthropicblk, class, openaiblk, function, anthropicblk, function, openaistr, class, anthropicstr, class, openaistr, function, anthropicstr, function, openai
node/langgraph anthropicopenai anthropicopenai anthropicopenai anthropicopenai anthropicopenai anthropicopenai
node/manual
node/mastra
node/vercel blk, class, anthropicblk, class, openaiblk, function, anthropicblk, function, openaistr, class, anthropicstr, class, openaistr, function, anthropicstr, function, openai blk, class, anthropicblk, class, openaiblk, function, anthropicblk, function, openaistr, class, anthropicstr, class, openaistr, function, anthropicstr, function, openai blk, class, anthropicblk, class, openaiblk, function, anthropicblk, function, openaistr, class, anthropicstr, class, openaistr, function, anthropicstr, function, openai blk, class, anthropicblk, class, openaiblk, function, anthropicblk, function, openaistr, class, anthropicstr, class, openaistr, function, anthropicstr, function, openai blk, class, anthropicblk, class, openaiblk, function, anthropicblk, function, openaistr, class, anthropicstr, class, openaistr, function, anthropicstr, function, openai blk, class, anthropicblk, class, openaiblk, function, anthropicblk, function, openaistr, class, anthropicstr, class, openaistr, function, anthropicstr, function, openai
python/langgraph a, anthropica, openais, anthropics, openai a, anthropica, openais, anthropics, openai a, anthropica, openais, anthropics, openai a, anthropica, openais, anthropics, openai a, anthropica, openais, anthropics, openai a, anthropica, openais, anthropics, openai
python/manual as as as as as as
python/openai-agents
python/pydantic-ai a, fallbacka, single a, fallbacka, single a, fallbacka, single a, fallbacka, single a, fallbacka, single a, fallbacka, single

Embedding Tests

SDK Basic Embeddings Test
browser/google-genai
browser/langchain
browser/openai
cloudflare/google-genai
cloudflare/langchain
cloudflare/openai
cloudflare/vercel
nextjs/google-genai
nextjs/langchain
nextjs/openai
nextjs/vercel
node/google-genai
node/langchain
node/openai
node/vercel
python/google-genai a, blks, blk
python/langchain a, blks, blk
python/litellm a, blks, blk
python/manual a, blks, blk
python/openai a, blks, blk

LLM Tests

SDK Basic Error LLM Test Basic LLM Test Conversation ID LLM Test Long Input LLM Test Multi-Turn LLM Test Vision LLM Test
browser/anthropic blkstr blkstr blkstr blkstr blkstr blkstr
browser/google-genai blkstr blkstr blkstr blkstr blkstr blkstr
browser/langchain blk, anthropicblk, openaistr, anthropicstr, openai blk, anthropicblk, openaistr, anthropicstr, openai blk, anthropicblk, openaistr, anthropicstr, openai blk, anthropicblk, openaistr, anthropicstr, openai blk, anthropicblk, openaistr, anthropicstr, openai blk, anthropicblk, openaistr, anthropicstr, openai
browser/openai blk, chatblk, responsesstr, chatstr, responses blk, chatblk, responsesstr, chatstr, responses blk, chatblk, responsesstr, chatstr, responses blk, chatblk, responsesstr, chatstr, responses blk, chatblk, responsesstr, chatstr, responses blk, chatblk, responsesstr, chatstr, responses
cloudflare/anthropic blkstr blkstr blkstr blkstr blkstr blkstr
cloudflare/google-genai blkstr blkstr blkstr blkstr blkstr blkstr
cloudflare/langchain blk, anthropicblk, openaistr, anthropicstr, openai blk, anthropicblk, openaistr, anthropicstr, openai blk, anthropicblk, openaistr, anthropicstr, openai blk, anthropicblk, openaistr, anthropicstr, openai blk, anthropicblk, openaistr, anthropicstr, openai blk, anthropicblk, openaistr, anthropicstr, openai
cloudflare/openai blk, chatblk, responsesstr, chatstr, responses blk, chatblk, responsesstr, chatstr, responses blk, chatblk, responsesstr, chatstr, responses blk, chatblk, responsesstr, chatstr, responses blk, chatblk, responsesstr, chatstr, responses blk, chatblk, responsesstr, chatstr, responses
nextjs/anthropic blkstr blkstr blkstr blkstr blkstr blkstr
nextjs/google-genai blkstr blkstr blkstr blkstr blkstr blkstr
nextjs/langchain blk, anthropicblk, openaistr, anthropicstr, openai blk, anthropicblk, openaistr, anthropicstr, openai blk, anthropicblk, openaistr, anthropicstr, openai blk, anthropicblk, openaistr, anthropicstr, openai blk, anthropicblk, openaistr, anthropicstr, openai blk, anthropicblk, openaistr, anthropicstr, openai
nextjs/openai blk, chatblk, responsesstr, chatstr, responses blk, chatblk, responsesstr, chatstr, responses blk, chatblk, responsesstr, chatstr, responses blk, chatblk, responsesstr, chatstr, responses blk, chatblk, responsesstr, chatstr, responses blk, chatblk, responsesstr, chatstr, responses
node/anthropic blkstr blkstr blkstr blkstr blkstr blkstr
node/google-genai blkstr blkstr blkstr blkstr blkstr blkstr
node/langchain blk, anthropicblk, openaistr, anthropicstr, openai blk, anthropicblk, openaistr, anthropicstr, openai blk, anthropicblk, openaistr, anthropicstr, openai blk, anthropicblk, openaistr, anthropicstr, openai blk, anthropicblk, openaistr, anthropicstr, openai blk, anthropicblk, openaistr, anthropicstr, openai
node/manual
node/openai blk, chatblk, responsesstr, chatstr, responses blk, chatblk, responsesstr, chatstr, responses blk, chatblk, responsesstr, chatstr, responses blk, chatblk, responsesstr, chatstr, responses blk, chatblk, responsesstr, chatstr, responses blk, chatblk, responsesstr, chatstr, responses
python/anthropic a, blka, strs, blks, str a, blka, strs, blks, str a, blka, strs, blks, str a, blka, strs, blks, str a, blka, strs, blks, str a, blka, strs, blks, str
python/google-genai a, blka, strs, blks, str a, blka, strs, blks, str a, blka, strs, blks, str a, blka, strs, blks, str a, blka, strs, blks, str a, blka, strs, blks, str
python/langchain a, blk, anthropica, blk, openaia, str, anthropica, str, openais, blk, anthropics, blk, openais, str, anthropics, str, openai a, blk, anthropica, blk, openaia, str, anthropica, str, openais, blk, anthropics, blk, openais, str, anthropics, str, openai a, blk, anthropica, blk, openaia, str, anthropica, str, openais, blk, anthropics, blk, openais, str, anthropics, str, openai a, blk, anthropica, blk, openaia, str, anthropica, str, openais, blk, anthropics, blk, openais, str, anthropics, str, openai a, blk, anthropica, blk, openaia, str, anthropica, str, openais, blk, anthropics, blk, openais, str, anthropics, str, openai a, blk, anthropica, blk, openaia, str, anthropica, str, openais, blk, anthropics, blk, openais, str, anthropics, str, openai
python/litellm a, blk, completion, anthropica, blk, completion, openaia, blk, responses, anthropica, blk, responses, openaia, str, completion, anthropica, str, completion, openaia, str, responses, anthropica, str, responses, openais, blk, completion, anthropics, blk, completion, openais, blk, responses, anthropics, blk, responses, openais, str, completion, anthropics, str, completion, openais, str, responses, anthropics, str, responses, openai a, blk, completion, anthropica, blk, completion, openaia, blk, responses, anthropica, blk, responses, openaia, str, completion, anthropica, str, completion, openaia, str, responses, anthropica, str, responses, openais, blk, completion, anthropics, blk, completion, openais, blk, responses, anthropics, blk, responses, openais, str, completion, anthropics, str, completion, openais, str, responses, anthropics, str, responses, openai a, blk, completion, anthropica, blk, completion, openaia, blk, responses, anthropica, blk, responses, openaia, str, completion, anthropica, str, completion, openaia, str, responses, anthropica, str, responses, openais, blk, completion, anthropics, blk, completion, openais, blk, responses, anthropics, blk, responses, openais, str, completion, anthropics, str, completion, openais, str, responses, anthropics, str, responses, openai a, blk, completion, anthropica, blk, completion, openaia, blk, responses, anthropica, blk, responses, openaia, str, completion, anthropica, str, completion, openaia, str, responses, anthropica, str, responses, openais, blk, completion, anthropics, blk, completion, openais, blk, responses, anthropics, blk, responses, openais, str, completion, anthropics, str, completion, openais, str, responses, anthropics, str, responses, openai a, blk, completion, anthropica, blk, completion, openaia, blk, responses, anthropica, blk, responses, openaia, str, completion, anthropica, str, completion, openaia, str, responses, anthropica, str, responses, openais, blk, completion, anthropics, blk, completion, openais, blk, responses, anthropics, blk, responses, openais, str, completion, anthropics, str, completion, openais, str, responses, anthropics, str, responses, openai a, blk, completion, anthropica, blk, completion, openaia, blk, responses, anthropica, blk, responses, openaia, str, completion, anthropica, str, completion, openaia, str, responses, anthropica, str, responses, openais, blk, completion, anthropics, blk, completion, openais, blk, responses, anthropics, blk, responses, openais, str, completion, anthropics, str, completion, openais, str, responses, anthropics, str, responses, openai
python/manual a, blks, blk a, blks, blk a, blks, blk a, blks, blk a, blks, blk
python/openai a, blk, chata, blk, responsesa, str, chata, str, responsess, blk, chats, blk, responsess, str, chats, str, responses a, blk, chata, blk, responsesa, str, chata, str, responsess, blk, chats, blk, responsess, str, chats, str, responses a, blk, chata, blk, responsesa, str, chata, str, responsess, blk, chats, blk, responsess, str, chats, str, responses a, blk, chata, blk, responsesa, str, chata, str, responsess, blk, chats, blk, responsess, str, chats, str, responses a, blk, chata, blk, responsesa, str, chata, str, responsess, blk, chats, blk, responsess, str, chats, str, responses a, blk, chata, blk, responsesa, str, chata, str, responsess, blk, chats, blk, responsess, str, chats, str, responses

MCP Tests

SDK Basic MCP Tool Call Test MCP Multiple Tool Calls Test MCP Prompt Get Test MCP Resource Read Test MCP Tool Error Test
node/mcp sseio sseio sseio sseio sseio
python/fastmcp a, blk, ssea, blk, io a, blk, ssea, blk, io a, blk, ssea, blk, io a, blk, ssea, blk, io a, blk, ssea, blk, io
python/mcp a, blk, sse, hia, blk, sse, loa, blk, io, hia, blk, io, lo a, blk, sse, hia, blk, sse, loa, blk, io, hia, blk, io, lo a, blk, sse, hia, blk, sse, loa, blk, io, hia, blk, io, lo a, blk, sse, hia, blk, sse, loa, blk, io, hia, blk, io, lo a, blk, sse, hia, blk, sse, loa, blk, io, hia, blk, io, lo

Legend: ✅ Pass | ❌ Fail | ✅🔧 Fixed | ❌📉 Regressed | ✅🆕 New (pass) | ❌🆕 New (fail) | 🗑️ Removed | str=streaming blk=blocking a=async s=sync io=stdio sse=sse hi=highlevel lo=lowlevel


Generated by AI SDK Integration Tests

@constantinius constantinius merged commit 75aaa51 into main Jun 29, 2026
14 checks passed
@constantinius constantinius deleted the constantinius/fix/ci/playwright-node24-hang branch June 29, 2026 15:02
@linear-code

linear-code Bot commented Jun 29, 2026

Copy link
Copy Markdown

TET-2575

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