ci(foundation): Forgejo development CI and GitHub tag-driven release pipeline (issue #97) #98
No reviewers
Labels
No labels
accessibility
bug
documentation
duplicate
enhancement
good first issue
help wanted
invalid
P1
P2
P3
question
wontfix
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Creatidy/scarcity-router!98
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "ci/release-foundation"
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?
Implements #97 (one commit from current
develop, targetingdevelop; left open for human review — do not merge by automation, no release is performed).What lands
Forgejo development CI —
.forgejo/workflows/ci.yml(workflowci, jobcheck)developand every push todevelop; per-ref concurrency with cancellation.uv sync --only-dev,make check,uv run basedpyright,git diff --check) plusmake package-check— no duplicate test list maintained in the workflow.contents: readonly; Python pinned to 3.12; caching off; the only two actions (actions/checkout,astral-sh/setup-uv) pinned to full commit SHAs.checkis the frozen required-status-check contract fordevelopbranch protection.GitHub public release pipeline —
.github/workflows/release.yml(the only GitHub workflow; no duplicate PR CI)v*.*.*tags.verifyjob fails closed unless: strict SemVer tag, package version equals the tag (single source__version__inscarcity_router/__init__.py), tagged commit reachable from stablemain, and event commit == tagged commit.buildjob builds wheel + sdist from the exact tagged commit viamake package-check, generatesSHA256SUMS, and attests Sigstore build provenance (short-lived OIDC;id-token: write,attestations: write).publish-github-release(contents: write) creates the Release and attaches artifacts;publish-pypi(environmentpypi,id-token: write) publishes via PyPI Trusted Publishing — no long-lived token exists or is introduced.Tooling —
tools/package_check.py0.1.0/catalog 2/policy 6. The old hardcodes were stale (catalog is v3 per D-038, policy v8) and undetectable because nothing ran the check in CI; a leftover hardcoded path prefix in the sdist allowlist is removed. No runtime behavior changes.Documentation
docs/release-engineering.md: Forgejo/GitHub authority split, development CI, frozen CI trust model, runner boundary, branch-protection setting, release/versioning invariants, pipeline mechanics, artifact inventory with explicit implemented now / configured externally / future contract / not yet supported statuses, installation contract (uv tool install/pipxafter first PyPI publication; no custom Linux repos), owner-action checklist, and how #95 consumes the foundation.docs/decisions.md; CI trust-boundary bullet added todocs/security.md; README quick-start/doc-map/development updates; roadmap notes #97 precedes module implementation.Owner actions documented (not claimed configured)
ubuntu-latestlabel meeting the documented isolation boundary (ephemeral per job; no Docker socket/host mounts/privileged containers/private-network reachability; no secrets in PR jobs).developbranch protection requiring status checkcheck(plus PR-only merges, no force pushes).creatidy, reposcarcity-router, workflowrelease.yml, environmentpypi) and a protected GitHubpypienvironment. Until configured,publish-pypifails closed by design.Validation performed
uv sync --only-dev,make check(1045 tests OK),uv run basedpyright(0/0/0),git diff --check— all clean.uv buildproduces wheel + sdist;make package-checkfully green through the same mechanism CI uses (isolateduv tool install, console scripts, packaged resources, MCP discovery, loopback REST healthz).main, non-SemVer tag) refuses correctly.actionlintv1.7.12 clean.__version__set to0.2.0buildsscarcity_router-0.2.0artifacts and passes the identical smoke check.Nothing is published, tagged, released or promoted by this PR.