fix(cli): pin arm64 render Chromium to Playwright headless-shell (#2039) (#2040)

The arm64 render image had no pinned browser: chrome-for-testing publishes
no linux-arm64 build, so Dockerfile.render fell back to Debian bookworm's
rolling `chromium` package. Its current arm64 build (150.0.7871.46) SIGTRAPs
at startup (exit 133), breaking `render --docker` 100% on Apple Silicon.

Install a pinned, non-Debian chrome-headless-shell from Playwright on arm64
(Google's build, not Debian's repackage). The wrapper wires whichever binary
landed into PRODUCER_HEADLESS_SHELL_PATH and now fails the build loudly if
neither is present, instead of silently using the broken Debian chromium.
Bonus: arm64 gains BeginFrame deterministic capture it previously lacked.
amd64 path is unchanged.

Verified on Apple Silicon: same arm64 image, Debian chromium 150 -> exit 133,
Playwright arm64 headless-shell (Chromium 149) -> exit 0.
This commit is contained in:
Miguel Ángel
2026-07-07 21:07:19 -04:00
committed by GitHub
parent 5b9b71df25
commit cebce603df
3 changed files with 42 additions and 36 deletions
+3 -3
View File
@@ -22,9 +22,9 @@ export interface DockerRunArgsInput {
* resolves to the host architecture via `resolveDockerPlatform()`. Pinning
* to `linux/amd64` on an arm64 host (the legacy default) forces qemu
* emulation of chrome-headless-shell, which segfaults or stalls on Apple
* Silicon — see issue #1193. Native `linux/arm64` falls back to the
* system chromium baked into the image at the cost of byte-for-byte
* parity with amd64 renders.
* Silicon — see issue #1193. Native `linux/arm64` uses Playwright's pinned
* arm64 chrome-headless-shell baked into the image at the cost of
* byte-for-byte parity with amd64 renders.
*/
platform?: string;
options: DockerRenderOptions;