fix(e2e): extend hub-soft-probe skip to push + staging dispatch so a broken hub cannot red the post-merge check #307

Closed
YousifShkara wants to merge 1 commit from fix/BUNYIP-305-e2e-push-hub-skip into main
Owner

The merge of PR #306 fired the push: main trigger on e2e.yml. wait-for-deploy.mjs polls ${op}/v1/version on the API host (api.a8n.systems), which has been up throughout the outage, so the gate passed immediately and the Playwright suite ran against staging while the hub (a8n.systems) was still serving the mispushed Dioxus SPA. [setup] global.setup.ts timed out for 180s waiting for form[action="/login"] input[type="email"] on a page that has no such form; [auth-ui] login.spec.ts inherited the same failure and the merge check turned red.

BUNYIP-301 + BUNYIP-303 fixed the equivalent problem on pull_request by softening reachability and gating the suite step on steps.reachability.outputs.hub_live != 'false'. That gate did not fire on push because the reachability step's if: only listed pull_request and workflow_dispatch (production); on push the step never ran, its output was unset, and the gate's fallback treated an unset output as "hub OK" (which was the intended pre-BUNYIP-305 behaviour).

Drop the reachability step's if: entirely so it runs on every trigger. Move the soft/hard split into the E2E_HUB_SOFT env expression: 'false' (hard) only on production dispatch, 'true' (soft) everywhere else (push, pull_request, staging dispatch). The E2E suite gate needs no code change; its existing != 'false' conjunction now sees hub_live set on every non-production trigger and correctly skips the suite when the hub is soft-degraded.

Rationale for softening on push too: post-merge deploy of bunyip-web is a manual just app-restart on c-01. CI cannot force the restart and cannot know when the operator will run it. Skipping the suite with a loud log line ("hub /healthz probe reported not-live; ... operator must just app-restart bunyip-web on the target host to pick up the new image") surfaces the same signal as a 3-min timeout + red run, without the punitive UX. Production dispatch KEEPS the hard check: it is meant to page loudly on a prod outage, so E2E_HUB_SOFT resolves to 'false' for that event and the reachability step exits 1 before the suite runs.

health-check.mjs needs no change; it already writes hub_live=true|false to $GITHUB_OUTPUT when the reachability step runs, and now the step runs on every non-outage-hardgate path.

Comments on the reachability step + the E2E suite step + the "Note skipped suite (hub down)" step are all updated to spell out the new event coverage. The skipped-suite log line includes an operator-facing hint about just app-restart so the next reviewer knows which manual step unblocks a red post-merge check without having to search the runbook.

#BUNYIP-305

The merge of PR #306 fired the `push: main` trigger on `e2e.yml`. `wait-for-deploy.mjs` polls `${op}/v1/version` on the API host (`api.a8n.systems`), which has been up throughout the outage, so the gate passed immediately and the Playwright suite ran against staging while the hub (`a8n.systems`) was still serving the mispushed Dioxus SPA. `[setup] global.setup.ts` timed out for 180s waiting for `form[action="/login"] input[type="email"]` on a page that has no such form; `[auth-ui] login.spec.ts` inherited the same failure and the merge check turned red. BUNYIP-301 + BUNYIP-303 fixed the equivalent problem on `pull_request` by softening reachability and gating the suite step on `steps.reachability.outputs.hub_live != 'false'`. That gate did not fire on push because the reachability step's `if:` only listed `pull_request` and `workflow_dispatch (production)`; on push the step never ran, its output was unset, and the gate's fallback treated an unset output as "hub OK" (which was the intended pre-BUNYIP-305 behaviour). Drop the reachability step's `if:` entirely so it runs on every trigger. Move the soft/hard split into the `E2E_HUB_SOFT` env expression: `'false'` (hard) only on production dispatch, `'true'` (soft) everywhere else (push, pull_request, staging dispatch). The E2E suite gate needs no code change; its existing `!= 'false'` conjunction now sees `hub_live` set on every non-production trigger and correctly skips the suite when the hub is soft-degraded. Rationale for softening on push too: post-merge deploy of bunyip-web is a manual `just app-restart` on c-01. CI cannot force the restart and cannot know when the operator will run it. Skipping the suite with a loud log line ("hub /healthz probe reported not-live; ... operator must `just app-restart` bunyip-web on the target host to pick up the new image") surfaces the same signal as a 3-min timeout + red run, without the punitive UX. Production dispatch KEEPS the hard check: it is meant to page loudly on a prod outage, so `E2E_HUB_SOFT` resolves to `'false'` for that event and the reachability step exits 1 before the suite runs. `health-check.mjs` needs no change; it already writes `hub_live=true|false` to `$GITHUB_OUTPUT` when the reachability step runs, and now the step runs on every non-outage-hardgate path. Comments on the reachability step + the E2E suite step + the "Note skipped suite (hub down)" step are all updated to spell out the new event coverage. The skipped-suite log line includes an operator-facing hint about `just app-restart` so the next reviewer knows which manual step unblocks a red post-merge check without having to search the runbook. #BUNYIP-305
fix(e2e): extend hub-soft-probe skip to push + staging dispatch so a broken hub cannot red the post-merge check
All checks were successful
Create release / Create release from merged PR (pull_request) Has been skipped
E2E / Playwright against deployment (pull_request) Successful in 1m34s
Check / fmt + clippy + build + tests (pull_request) Successful in 21m18s
73b02971db
The merge of PR #306 fired the `push: main` trigger on `e2e.yml`. `wait-for-deploy.mjs` polls `${op}/v1/version` on the API host (`api.a8n.systems`), which has been up throughout the outage, so the gate passed immediately and the Playwright suite ran against staging while the hub (`a8n.systems`) was still serving the mispushed Dioxus SPA. `[setup] global.setup.ts` timed out for 180s waiting for `form[action="/login"] input[type="email"]` on a page that has no such form; `[auth-ui] login.spec.ts` inherited the same failure and the merge check turned red.

BUNYIP-301 + BUNYIP-303 fixed the equivalent problem on `pull_request` by softening reachability and gating the suite step on `steps.reachability.outputs.hub_live != 'false'`. That gate did not fire on push because the reachability step's `if:` only listed `pull_request` and `workflow_dispatch (production)`; on push the step never ran, its output was unset, and the gate's fallback treated an unset output as "hub OK" (which was the intended pre-BUNYIP-305 behaviour).

Drop the reachability step's `if:` entirely so it runs on every trigger. Move the soft/hard split into the `E2E_HUB_SOFT` env expression: `'false'` (hard) only on production dispatch, `'true'` (soft) everywhere else (push, pull_request, staging dispatch). The E2E suite gate needs no code change; its existing `!= 'false'` conjunction now sees `hub_live` set on every non-production trigger and correctly skips the suite when the hub is soft-degraded.

Rationale for softening on push too: post-merge deploy of bunyip-web is a manual `just app-restart` on c-01. CI cannot force the restart and cannot know when the operator will run it. Skipping the suite with a loud log line ("hub /healthz probe reported not-live; ... operator must `just app-restart` bunyip-web on the target host to pick up the new image") surfaces the same signal as a 3-min timeout + red run, without the punitive UX. Production dispatch KEEPS the hard check: it is meant to page loudly on a prod outage, so `E2E_HUB_SOFT` resolves to `'false'` for that event and the reachability step exits 1 before the suite runs.

`health-check.mjs` needs no change; it already writes `hub_live=true|false` to `$GITHUB_OUTPUT` when the reachability step runs, and now the step runs on every non-outage-hardgate path.

Comments on the reachability step + the E2E suite step + the "Note skipped suite (hub down)" step are all updated to spell out the new event coverage. The skipped-suite log line includes an operator-facing hint about `just app-restart` so the next reviewer knows which manual step unblocks a red post-merge check without having to search the runbook.

#BUNYIP-305
YousifShkara closed this pull request 2026-07-01 10:15:22 +02:00
YousifShkara deleted branch fix/BUNYIP-305-e2e-push-hub-skip 2026-07-01 10:15:26 +02:00
All checks were successful
Create release / Create release from merged PR (pull_request) Has been skipped
E2E / Playwright against deployment (pull_request) Successful in 1m34s
Required
Details
Check / fmt + clippy + build + tests (pull_request) Successful in 21m18s
Required
Details

Pull request closed

Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
psa-systems/bunyip!307
No description provided.