Release gate: a tag passes with the PostgreSQL, security audit and stylesheet jobs red #419
Labels
No labels
accessibility
authentication
breaking change
bug
documentation
enhancement
interface
internationalisation
observability
performance
security
tier
1
tier
2
tier
3
tier/4
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Postulo/postulo#419
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?
Found on 2026-09-29 in a read-only review of postulo at
95348908d, comparing the release gate's required jobs inscripts/release_tools.pywith the jobs in.forgejo/workflows/ci.yml. Related to #233 (closed), which added the gate and proposed requiring onlytest*andbrowser, at a time when the PostgreSQL job did not exist; this issue adds the three jobs the list was never revisited for. Also related to #219 (closed), which added the PostgreSQL job, and #319 (closed), which renamed the jobs and noted that a job split out of the test legs should be required too.Checked again on 2026-10-01 against
mainat0a5cad587: still present. The code is now at.forgejo/workflows/ci.yml:264-335(security) and.forgejo/workflows/ci.yml:337-375(styles), and the paragraph about the gate atCONTRIBUTING.md:349-353; the other locations are unchanged.The release gate refuses a tag unless named CI jobs passed on its commit, and it names only the unit-test legs and the browser job. Three other jobs check things a release ships and are not required: Database tests on PostgreSQL, Security audit and Stylesheet, icons and scripts current. A tag whose commit failed any of them is released, and its image built, as if CI were green.
Where:
REQUIRED_JOBSinscripts/release_tools.py:114-120holds^CI / Unit testsand^CI / Browser testsonly; its comment (:109-113) explains why the dev image job is excluded and says nothing of the others.ci_problems(:123-143) reads nothing else..forgejo/workflows/release.yml:59and.forgejo/workflows/image.yml:67.postgres(.forgejo/workflows/ci.yml:148-262, the real backup and restore at:234-262),security(:264-326: pip-audit, npm audit, zizmor) andstyles(:328-366).tests/test_release_tools.py:242-251: theGREENfixture holds a green Security audit and no PostgreSQL or stylesheet context, so no test shows what happens when any of the three is red or missing.CONTRIBUTING.md:347-351and the comment at.forgejo/workflows/release.yml:52-54describe the gate as "any test leg or the browser job".What happens:
core/backup.py(pg_dump/pg_restore). The PostgreSQL job is the only place either runs for real, so it goes red while the SQLite legs and the browser stay green. The maintainer tags.release_tools.py check --cireports nothing,release.ymlpublishes the sdist and the wheel,image.ymlpasses the same check and pushes the image, and PostgreSQL operators upgrade into the failure #219 was opened for.static/css/app.css, icons or vendored scripts are stale. The wheel and the image ship the committed files, so the release carries assets that do not match their sources.Why it matters:
docker/compose.postgres.ymland the wiki's Installing Postulo page offer PostgreSQL as a deployment, and backup and restore are how an operator keeps their users' data.SECURITY.md:36says dependencies are "audited against known vulnerabilities in CI on every run". These jobs fail because of what the commit ships, not because of the runner, which is the reason the comment gives for excluding the dev image job; the one check meant to stop such a release does not consult them.Fix: add to
REQUIRED_JOBS:("the PostgreSQL job", re.compile(r"^CI / Database tests on PostgreSQL"));("the stylesheet check", re.compile(r"^CI / Stylesheet"));("the security audit", re.compile(r"^CI / Security audit")), decided deliberately. Requiring it means a newly published advisory holds a release until it is dealt with, which matchesSECURITY.md. If it stays optional (an advisory with no fix available should not block a release), say why in the comment aboveREQUIRED_JOBSinstead of leaving the gap unexplained.Update that comment, the one at
.forgejo/workflows/release.yml:52-54andCONTRIBUTING.md:347-351to name the required jobs.Done when
tests/test_release_tools.py: with every unit leg and the browser green andCI / Database tests on PostgreSQL (push)recorded asfailure,ci_problemsnames it; with that context missing,ci_problemsreports that no status was found for it. The same two cases hold forCI / Stylesheet, icons and scripts current (push), and forCI / Security audit (push)if the audit is required. All fail today.GREENholds every newly required context, andtest_no_ci_at_all_is_refused_rather_than_waved_throughcounts the new entries.REQUIRED_JOBSsays why.CONTRIBUTING.mdnames the jobs a release must have passed.Landed on main with a green Forgejo CI run. Its entry in the CHANGELOG's Unreleased section ends in (#419).