Skip to content

ci: bound every CI job with timeout-minutes - #17

Merged
rubenvdlinde merged 1 commit into
developmentfrom
ci/bound-job-timeouts
Aug 3, 2026
Merged

ci: bound every CI job with timeout-minutes#17
rubenvdlinde merged 1 commit into
developmentfrom
ci/bound-job-timeouts

Conversation

@rubenvdlinde

Copy link
Copy Markdown
Contributor

What

Adds timeout-minutes to all 7 CI jobs. Every job previously ran unbounded, so a hung runner (network stall, wedged docker build, a step waiting on input) burns the full 6-hour GitHub default before the run fails.

Values — measured, not guessed

Sized from observed fleet-wide durations across the ExApp sidecar wrappers (successful + failed executions; skipped runs excluded).

File Job Set Observed
pull-request-lint-check.yaml lint-check 15 n=176, median 0.6 min, max 1.4 min
pull-request-from-branch-check.yaml check-branch 10 n=123, max 0.1 min
push-development-to-beta.yaml create-pr 20 n=152, max 5.6 min
beta-release.yaml release-management 45 n=26, max 0.7 min
unstable-release.yaml release-management 45 n=26, max 0.7 min
release-workflow.yaml release-management 45 n=26, max 0.7 min
build-exapp.yaml build 30 no observed runs (docker build)

The release jobs are bounded at 45 rather than near their observed max because a spurious release failure is expensive, and to match the shared release jobs elsewhere in the fleet.

Bounds are deliberately loose. A timeout that fires under normal runner contention is worse than no timeout at all: it converts a slow run into a phantom defect that someone then has to investigate.

Verification

  • Each touched file re-parsed with yaml.safe_load; the job set is byte-for-byte unchanged from the base branch.
  • Each job asserted to carry exactly the value in the table (positive control), and the same probe run against the base SHA still reports None (negative control) — so the probe distinguishes bounded from unbounded rather than emitting a constant.
  • 7 of 7 jobs bounded in this repo.
  • Diff is workflow files only, additions only (2 added lines per file, 0 removed).
  • Edits made by hand, not by any scripted rewrite.

All 7 CI jobs ran unbounded, so a hung runner could burn the full
6-hour GitHub default before failing. Each job now carries a
timeout-minutes sibling of runs-on, sized from observed fleet-wide
durations (successful + failed executions, skipped excluded):

- lint-check (15):        n=176, median 0.6 min, max 1.4 min
- check-branch (10):      n=123, max 0.1 min
- create-pr (20):         n=152, max 5.6 min
- release-management (45): n=26, max 0.7 min - bounded loosely
  because a spurious release failure is expensive
- build (30):             no observed runs; docker build

Bounds are deliberately loose: a timeout that fires under normal
runner contention turns a slow run into a phantom defect.
@rubenvdlinde
rubenvdlinde merged commit 43b3037 into development Aug 3, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant