Repository navigation
Releasing
For maintainers. A release is a git tag on main; the Release workflow
builds and publishes everything else.
Aegis follows Semantic Versioning. Before 1.0, a minor version (0.2.0) can change behaviour and config, and a patch version (0.1.1) only fixes things.
Every v0.* release is published as a GitHub pre-release.
They must agree, or the release fails before anything is built:
-
versionunder[workspace.package]inCargo.toml. The binaries and the RPM take their version from here. - The first
%changelogentry inpackaging/aegis-v2.spec, which ends in- <version>-<release>. - A
## [<version>] - <date>section inCHANGELOG.md. Its text becomes the release notes.
-
On a branch, bump the version in
Cargo.tomland runcargo update -wsoCargo.lockfollows. -
Add the spec
%changelogentry, newest first. -
Move the
[Unreleased]notes inCHANGELOG.mdinto a new## [x.y.z] - YYYY-MM-DDsection. -
Open a pull request, wait for CI, and squash-merge it.
-
Dry-run the release from
main:gh workflow run release.yml --ref main
That runs every check and builds both RPMs, without publishing.
-
Tag the merge commit with an annotated tag and push it:
git switch main && git pull git tag -a v0.2.0 -m "v0.2.0" git push origin v0.2.0
On a v*.*.* tag:
-
check: confirms
Cargo.toml, the spec's%changelogand the tag agree, that the tagged commit is onmain, and thatCHANGELOG.mdhas a section for the version. It extracts that section as the release notes. - rpm: builds the x86_64 RPMs on an x86_64 runner and the aarch64 RPM on an arm64 runner, each in the Rocky 10 build container.
-
publish: writes SPDX and CycloneDX SBOMs from
Cargo.lock, thenSHA256SUMSover the RPMs and SBOMs. It attests build provenance for every file listed inSHA256SUMS, signsSHA256SUMSkeylessly with cosign, and creates a draft release with the notes, marked as a pre-release forv0.*tags.
The release carries:
aegis-v2-<version>-1.el10.x86_64.rpmaegis-v2-<version>-1.el10.aarch64.rpmaegis-v2-selinux-<version>-1.el10.noarch.rpm-
aegis-v2-v<version>.spdx.jsonandaegis-v2-v<version>.cdx.json -
SHA256SUMSandSHA256SUMS.sigstore.json
Releases are immutable once published: the files and the tag can't change after that. So the workflow stops at a draft. Download it, check the files and the signature the way installation describes, read the notes, then publish:
gh release edit v0.2.0 --draft=falsePublishing the release also runs the Wiki workflow, which copies
docs/ into the wiki
as of the new tag. The wiki is a copy: edit docs/, never the wiki,
or the next release overwrites the change.
The workflow only runs for the newest release by version, prereleases
included. A patch to an older line, published after a newer release,
leaves the wiki alone, so it never rolls back to older docs. A page
taken out of docs/ and PAGES stays on the wiki until you delete it
there by hand. python3 -I .github/wiki.py --check tests the link
rewriting; the workflow runs it before every copy.
Install the released x86_64 RPM on a freshly rebuilt test host and run the end-to-end scenarios against it. See development.
A failure in any job publishes nothing, and a bad draft can be deleted. Fix it on a branch, merge, delete the tag locally and on GitHub, and tag again:
git tag -d v0.2.0
git push origin :refs/tags/v0.2.0Tags matching v* are protected by a ruleset, so deleting one means
turning that ruleset off for the moment, in Settings → Rules →
Rulesets → protect-tags. Once a release is published, its tag can't
move at all. Fix forward with a patch release instead.
From docs/releasing.md at v0.2.3.