CI: start the browser job first, check the tree once, and bound every job #712
Labels
No labels
accessibility
authentication
breaking change
bug
documentation
enhancement
interface
internationalisation
observability
performance
security
tier
1
tier
2
tier
3
tier/4
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Postulo/postulo#712
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Measured from Forgejo's task API and job logs, runs 561–710 (24 Sep – 4 Oct 2026): wall time per push about 52–55 min, up from about 15; the browser suite grew from 149 to 645 tests in five days and runs serially (29 min); the runner takes two jobs at a time, in the order the workflow file lists them, so the browser job starts 19–22 min after the push; and Forgejo cancels the older push run when a newer push lands, which stopped 18 of 56 browser jobs before they gave a verdict.
What is slow
ci.ymllists the jobs test (three legs), postgres, security, styles, browser. With two slots that puts the longest job last: in run 706 it started at 15:11, nineteen minutes after the push, and finished at 15:44.makemigrations --check,messages.py extract --check,check,stats --check, andcheck --deploy+collectstaticwith the production settings.faulthandler_timeout, so a hung test shows nothing until the runner's limit ends the job.Proposal
browserfirst in the file, so it takes a slot at t=0; then the unit job, a newchecksjob,postgres,security. Noneeds:between them, which would serialise them.checksruns the interpreter-independent steps once, and takes over thestylesjob's steps (both ask whether the committed tree is current).messages.py compile(test_select_options.py:373reads a compiled catalogue), the ESCO download and pytest.timeout-minuteson each job;faulthandler_timeout = 120in[tool.pytest.ini_options];--durations=25on both pytest commands.Done when
Probed on a throwaway branch
ci-probe(runs 715 and 716, deleted afterwards). The runner is forgejo-runner v6.4.0 against Forgejo 15:if:that is false fails its job ("Early termination"), with or withoutneeds:;needs:works when the dependent job'sifis true, across runners (ubuntu-latest → docker);timeout-minutesis ignored (a 1-minute job ran 2 m 30 s); step-leveltimeout-minutesworks ("context deadline exceeded" at 1 m 0 s);githubcontext:fromJSON(github.ref == … && '[…]' || '[…]'), byref,ref_nameorevent_name, always took the last branch.Upgrading the runner may fix the first and third; that is a host change.
So the time limits landed on the test steps, not the jobs (
e0dc97fd1).