Skip to content

v0.34.10

@fredericrous fredericrous tagged this 02 Jun 23:30
* ci: fix Playwright browser-install hang

The Storybook Tests job hung indefinitely in 'playwright install --with-deps chromium': the 167MB Chromium binary downloaded to 100%, then a follow-up asset stalled with no timeout, tying up the self-hosted runner for ~2h until cancelled (blocking queued Release runs). Now: per-attempt 'timeout 240' + 3 retries so a stall fails fast and retries; cache ~/.cache/ms-playwright so browsers download rarely; split the (reliable) apt-deps into its own step; add timeout-minutes to every job and concurrency cancel-in-progress so a hang can never hog the runner again.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* ci: use chromium-headless-shell to shrink download

Tests run headless, so install only the chromium-headless-shell build (1.3MB shell + ffmpeg) instead of full Chrome for Testing (167MB) — far less to pull from cdn.playwright.dev, whose download stalls on this runner's egress. Set the launch channel to 'chromium-headless-shell' so Playwright uses it. Validated locally: the headless shell launches and the suite runs.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(ui): Combobox loop/defaultValue, Button a11y

Storybook tests never ran in CI (the job always hung at the Playwright install), hiding real suite bugs. Now that the suite runs (254/254 pass locally): (1) Combobox reconcile effect fired setValue(null) every render when value was '' (e.g. a controlled table-column filter) → inline onValueChange → parent state change → re-render → 'Maximum update depth' infinite loop; guard on !value (treat '' like null). (2) defaultValue/value didn't seed the input text, so the same effect wiped the selection on mount and the input showed blank; seed internalInputValue from the initial value's label. (3) Button dropped aria-label (icon/duplicate-text buttons had no accessible-name override) — forward it. (4) A Table story used getByText('Name') which matched both the header and the SortChip option — use getAllByText.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* ci: force IPv4 for Playwright browser download

The CDN 307-redirects to storage.googleapis.com, whose IPv6 path stalls large transfers from the self-hosted runner. The CNI IPv6 PMTU bug is fixed cluster-wide (MTU 1400), but the ARC runner pod still hit it (likely hostNetwork or a node-path difference), and CI shouldn't depend on flawless IPv6 egress. NODE_OPTIONS=--dns-result-order=ipv4first makes Node's downloader prefer IPv4, which has been reliable throughout (curl -4 always completed the 116MB download).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* ci: pin Playwright CDN to IPv4 in /etc/hosts

NODE_OPTIONS=--dns-result-order=ipv4first did not stop Node's downloader from using the blackholing IPv6 path to storage.googleapis.com. Pinning cdn.playwright.dev + storage.googleapis.com to their IPv4 addresses in /etc/hosts removes IPv6 from resolution for those hosts entirely, so the browser download goes over IPv4 (reliable throughout). Runner has passwordless sudo.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* ci: prefetch Playwright browsers via curl (Node DL stalls)

Exec into the runner proved it: eth0 is MTU 1400 and curl downloads the 116MB chrome-headless-shell from GCS fine over BOTH IPv4 and IPv6 — but Node's Playwright downloader stalls at 0% regardless (not MTU, not IPv6, not a policy; Node-downloader-specific on this runner). So fetch the binaries (headless-shell + ffmpeg) with curl into Playwright's cache + write the INSTALLATION_COMPLETE/DEPENDENCIES_VALIDATED markers; the install step is then a no-op. Validated locally: curl-placed cache is accepted with no download and the browser launches.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Assets 2
Loading