Skip to content

Commit 84232d8

Browse files
authored
ci(web-static): gate puppeteer navigate on bounded server health-poll (#842)
CI test-harness robustness: wait-for-port health-poll before puppeteer navigate; distinguishable INFRA-vs-regression failure. Fixes the Web-static verify flake false-redding coin-side PRs. CI-only (tests/visual/run.sh).
1 parent ca38c15 commit 84232d8

1 file changed

Lines changed: 35 additions & 4 deletions

File tree

  • web-static/sharechain-explorer/tests/visual

web-static/sharechain-explorer/tests/visual/run.sh

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,14 @@ cd "$(dirname "$0")"
77

88
PORT="${PORT:-18082}"
99
THRESHOLD="${THRESHOLD:-0.025}"
10+
# Bounded health-poll budget before puppeteer is allowed to navigate.
11+
# The mock server can bind slowly on a CPU-starved self-hosted runner
12+
# (VM905), so a too-short wait races the server start and puppeteer hits
13+
# a dead port (net::ERR_CONNECTION_REFUSED, job 89644021788) — an infra
14+
# flake wrongly surfaced as a page/pixel assertion failure. 60s covers
15+
# cold-start jitter without masking a genuinely-hung server.
16+
READY_TIMEOUT="${READY_TIMEOUT:-60}"
17+
HEALTH_URL="http://127.0.0.1:${PORT}/sharechain/tip"
1018

1119
mkdir -p out
1220

@@ -17,11 +25,34 @@ echo "[2/4] starting mock server on :$PORT"
1725
node mock-server.mjs "$PORT" >out/mock-server.log 2>&1 &
1826
SERVER_PID=$!
1927
trap 'kill $SERVER_PID 2>/dev/null || true' EXIT
20-
# Wait for server to bind.
21-
for i in {1..30}; do
22-
if curl -sf "http://127.0.0.1:$PORT/sharechain/tip" >/dev/null; then break; fi
23-
sleep 0.2
28+
29+
# Health-poll until the server answers, bounded by READY_TIMEOUT, and
30+
# GATE the navigate on the result. If the port never comes up we fail
31+
# loudly with a distinguishable infra message (not a page assertion) so
32+
# a real regression is never confused with a server-start race. Also
33+
# bail early if the server process died (e.g. port already in use).
34+
echo "[2b] waiting up to ${READY_TIMEOUT}s for mock server at ${HEALTH_URL}"
35+
start=$SECONDS
36+
deadline=$((start + READY_TIMEOUT))
37+
ready=0
38+
while [ "$SECONDS" -lt "$deadline" ]; do
39+
if ! kill -0 "$SERVER_PID" 2>/dev/null; then
40+
echo "::error::INFRA (not a page regression): mock server pid $SERVER_PID exited before binding :$PORT" >&2
41+
break
42+
fi
43+
if curl -sf "$HEALTH_URL" >/dev/null 2>&1; then
44+
ready=1
45+
echo "mock server ready after $((SECONDS - start))s"
46+
break
47+
fi
48+
sleep 0.5
2449
done
50+
if [ "$ready" -ne 1 ]; then
51+
echo "::error::INFRA (not a page regression): static mock server never became ready on 127.0.0.1:${PORT} within ${READY_TIMEOUT}s — puppeteer navigation skipped so a server-start race is not reported as a page-assertion failure." >&2
52+
echo "---- tail of out/mock-server.log ----" >&2
53+
tail -n 40 out/mock-server.log >&2 || true
54+
exit 3
55+
fi
2556

2657
echo "[3/4] capturing screenshots"
2758
node capture.mjs "$PORT"

0 commit comments

Comments
 (0)