CI: run the unit suite on Python 3.14 per push, and on every supported Python weekly, on release branches and by hand #713
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#713
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.
Each unit leg takes about 12 minutes of one of the two slots. In the measured window the three legs failed only together, and only on real faults (catalogue checks,
test_avatars,test_referrals): no failure was specific to an interpreter.Decision (user, 2026-10-04)
mainand a pull request run the unit suite on 3.14 only, which is also the leg that measures coverage.[0-9]*) and on a manual run (workflow_dispatch, a new trigger).CONTRIBUTING.mdgains a step: run CI onmainby hand, which runs every Python, and wait for it to pass before tagging.The cost accepted: something that breaks only on 3.12 or 3.13 can sit on
mainuntil the next weekly run or release.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 older Pythons run in a workflow of their own,
every-python.yml(weekly, release branches, by hand), holdingci.yml's job word for word, which a test keeps equal; the release gate asks for a passed leg on every classifier Python from either workflow (6f8e46018).