From b70380d9b93ff475e4a74c75592581d6613af766 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 23 Sep 2026 16:59:51 +0200 Subject: [PATCH 1/2] CI - give macOS runners a resolvable hostname macOS GitHub runners boot with a `.local` hostname that the runner itself cannot resolve, so any process looking up its own hostname stalls about 35s while mDNS gives up (actions/runner-images#14568). Python's http.server hits this in HTTPServer.server_bind via socket.getfqdn(), before it starts listening: measured 35s for 127.0.0.1 and 70s for the dual-stack default, past Playwright's 60s webServer timeout. That is why the nightly macOS Playwright leg has failed on every run. An /etc/hosts entry alone does not help because `.local` names go to mDNS; renaming to a plain HostName with a matching hosts entry is the workaround reported upstream (0.04s lookups). --- .github/workflows/test-smokes.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/test-smokes.yml b/.github/workflows/test-smokes.yml index 6793247b12..2596ca9e61 100644 --- a/.github/workflows/test-smokes.yml +++ b/.github/workflows/test-smokes.yml @@ -97,6 +97,15 @@ jobs: # Empty keeps the standard checkout behavior. ref: ${{ inputs.ref }} + # macOS runners boot with an unresolvable `.local` hostname, so any process + # resolving its own hostname stalls ~35s (actions/runner-images#14568). + - name: Set a resolvable hostname (macOS) + if: runner.os == 'macOS' + shell: bash + run: | + sudo scutil --set HostName gha-runner + echo "127.0.0.1 gha-runner" | sudo tee -a /etc/hosts + - name: Fix temp dir to use runner one (windows) if: runner.os == 'Windows' run: | From 9c72084fdebedaa49a81b1ad1f082bd79540f3a0 Mon Sep 17 00:00:00 2001 From: Christophe Dervieux Date: Wed, 23 Sep 2026 17:00:08 +0200 Subject: [PATCH 2/2] Bind Playwright's static server to 127.0.0.1 with a longer timeout With no --bind, http.server resolves the dual-stack wildcard address and does its getfqdn() reverse lookup on it, which measured twice as slow as 127.0.0.1 on macOS runners. Binding to 127.0.0.1 matches the url Playwright already probes and keeps the server off other interfaces. The 120s timeout keeps the leg from failing outright if a runner image regresses on hostname resolution again. --- tests/integration/playwright/playwright.config.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/integration/playwright/playwright.config.ts b/tests/integration/playwright/playwright.config.ts index 07ec7198e6..76b3b2b128 100644 --- a/tests/integration/playwright/playwright.config.ts +++ b/tests/integration/playwright/playwright.config.ts @@ -97,10 +97,12 @@ export default defineConfig({ webServer: [ { // HTTP server for rendered HTML files - command: 'uv run python -m http.server 8080', + command: 'uv run python -m http.server 8080 --bind 127.0.0.1', url: 'http://127.0.0.1:8080', reuseExistingServer: !isCI, cwd: '../../docs/playwright', + // http.server does a reverse DNS lookup before listening, slow on some hosts + timeout: 120000, stderr: 'ignore', // Suppress verbose HTTP request logs }, {