Repository navigation
fix(e2e): escalate to SIGKILL when the certificate probe hangs - #1792
Merged
Merged
Conversation
vastsa#1751's Electron E2E job ran 30m18s and was cancelled by the job budget with no failing step to read. The cause is this runner's only timeout: const timer = setTimeout(() => child.kill(), 60_000); SIGTERM is a request. An Electron child still initialising its renderer can ignore it, and the 'close' event this script awaits then never arrives, so the step holds the job until GitHub cancels it. The runner's own 60s budget is never enforced. Escalate: SIGTERM at 60s, SIGKILL at 65s, and report which one fired. A probe that cannot start now fails this step in about a minute with its output attached, instead of burning the job budget. Verified: normal path still passes ("provider client certificate E2E passed"); with a child that ignores SIGTERM the escalation force-kills it at ~800ms in an isolated harness, so the timeout path terminates rather than hanging.
muzimu217
force-pushed
the
fix/e2e-runner-kill-escalation
branch
from
October 21, 2026 07:03
abee78b to
434e06f
Compare
Integrate the reviewed timeout fix with the latest main before final validation.
Keep the normal Electron path unchanged while asserting that a child ignoring SIGTERM receives SIGKILL after the grace period.
Tioit-Wang
pushed a commit
that referenced
this pull request
Oct 23, 2026
…o-column-ticker Four files conflicted, all because main had already re-solved the same problems this branch carried: - `.github/workflows/ci.yml` and `scripts/e2e-provider-client-certificate.mjs` keep main's side. #1792 landed the same virtual-display fix here and then replaced the hand-rolled SIGTERM-then-SIGKILL timer with `waitForChildExitWithEscalation()`, so the branch's copy is a strictly older version of the same repair. - `docs/spec/08-meta/decisions-log.md` and its zh-CN mirror keep both sides. The branch's decision was numbered D665, which main has held since 2026-10-16 (macOS opaque window surface, amended by D666/D667) and has since grown to D670; the marketplace entry is renumbered D671 in the table and in the appended section of both mirrors, and its two `07-plugin-marketplace.md` cross-references follow. The merge also folded main's copy of the marketplace spec's monogram-glyph paragraph back to one copy: the branch carried it twice, which hid the duplicate from the three-way merge. Marketplace grid, ticker, chip, and locale changes merge cleanly and stay as they are.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this fixes
The
Trusted extensions Electron E2Ejob can hang instead of failing. On #1751 it ran 30m18s and was cancelled by the job budget with no failing step to read —conclusion: cancelled, zero failed steps.The cause is this runner's only timeout:
SIGTERMis a request. An Electron child still initialising its renderer can ignore it, and thecloseevent this script awaits then never arrives — so the runner's own 60-second budget is never enforced and the step holds the job until GitHub cancels it.Change
Escalate, and say which signal fired:
SIGTERMat 60s,SIGKILLat 65skilledBy === null, so a probe that cannot start fails this step in about a minute with its output attached instead of burning the job budgetVerification
baseline: Electron 43 net.fetch fails before HTTPthenprovider client certificate E2E passed.SIGTERM, the escalation force-kills it at ~804ms in an isolated harness, confirming the timeout no longer hangs.node --checkclean; branch is one commit on currentmain(a6f4ba121), 1 file +23/−2.Why this matters beyond one job
The same escalation exists on #1759's branch (its author hit the same hang) but that PR is still open, so
maincarries the hazard. Any Electron E2E step that hangs here costs 30 minutes of runner time and returns no diagnostic — this makes it a one-minute failure that names the signal.