ci: bound all 16 unbounded workflow jobs on main with timeout-minutes - #423
Conversation
The main branch carries a different, older set of workflow files than development (which now calls the shared reusable workflows in ConductionNL/.github, bounded at source). None of main's 16 jobs declared timeout-minutes, so a hung job burned a runner for GitHub's 6-hour default. These are not dead files: release-workflow.yaml has recent runs on main, and the PR-triggered jobs (php-checks matrix, frontend-quality, lint-check, both check-branch duplicates) fire on every PR into main, i.e. on every release. Bounds are derived from measured fleet-wide durations (successful and failed executions, skipped excluded) and are deliberately loose -- a timeout that fires under normal contention turns a slow run into a phantom defect. php-checks is set to 30 rather than 20: one job-level bound covers all six matrix legs, and while lint/PHPCS/PHPMD/Psalm/PHPStan run ~4 min, the PHPUnit leg has been observed at 18.9 min while succeeding. No job here calls a reusable workflow, so timeout-minutes is valid on all 16. Additions only; no step, trigger, or job was modified.
Red checks are pre-existing — proven on the base SHA7 checks are red. None are caused by this PR: the diff is additions-only and touches Control: cloned
Two of these are structural rather than incidental debt:
Merging via admin on that basis. |
What
Adds
timeout-minutesto all 16 jobs on themainbranch. Every one of them was unbounded, so a hang burned a runner for GitHub's 6-hour default.Why
mainspecificallydevelopmentnow calls the shared reusable workflows inConductionNL/.github, which are bounded at source.mainstill carries the older inline layout, and those files are live:release-workflow.yamlhas recent runs onmain.php-checksmatrix,frontend-quality,lint-check, and bothcheck-branchduplicates) fire on every PR intomain— i.e. on every release.Bounds
pull-request-lint-check.yamllint-checkpull-request-from-branch-check.yamlcheck-branchpr-check.yamlcheck-branchpush-development-to-beta.yamlcreate-prcode-quality.ymlphp-checkscode-quality.ymlfrontend-qualitydocumentation.ymldeploysync-beta.yamlsync-to-beta-releasesync-dev.yamlsync-to-development-releaserelease-stable.yamlupdate-changelogrelease-stable.yamlrelease-managementbeta-release.yamlrelease-managementunstable-release.yamlrelease-managementrelease-workflow.yamlrelease-managementrelease-beta.yamlrelease-managementrelease-unstable.yamlrelease-managementDerived from measured fleet-wide durations (successful + failed executions, skipped excluded) and deliberately loose — a timeout that fires under normal contention is worse than no timeout, because it converts a slow run into a phantom defect.
One deviation from the rollout table:
php-checksis 30, not 20A single job-level bound covers all six matrix legs, so it must clear the slowest leg. Lint/PHPCS/PHPMD/Psalm/PHPStan run ~4 min, but the PHPUnit leg has been observed at 18.9 min while succeeding. A 20 bound would leave ~6% headroom over a known-good run.
Notes
uses:reusable-workflow caller, sotimeout-minutesis valid on all 16 (auses:job that carries it makes the whole filestartup_failure). Nothing was skipped.l10n.ymldoes not exist onmain— it is adevelopment-only file. Themainjob count is therefore 16 without it.pr-check.yamlandpull-request-from-branch-check.yamlare byte-identical duplicate Branch Protection workflows; both were bounded. Deduplicating them is out of scope here.Verification
yaml.safe_load; job set asserted unchanged vsorigin/mainand each job asserted to carry its exact expected value — 16/16.origin/mainblobs reportsNonefor all 16, so the probe genuinely distinguishes bounded from unbounded..github/workflows/only. No step, trigger, or job was modified.