Release Playbook
March 5, 2026 ยท View on GitHub
This playbook documents how to cut and publish a signed UBS release. The release workflow (.github/workflows/release.yml) runs automatically on git tags that start with v (for example v5.1.0).
Prerequisites
- Maintainer with push rights to
mainand tags. MINISIGN_SECRET_KEYstored as an org/repo secret (base64 of the minisign secret key). The matching public key is published for users (seedocs/security.md).- OIDC-enabled GitHub Actions (default) for keyless Cosign signing.
- GHCR write access (uses
${GITHUB_REPOSITORY_OWNER,,}/ubs-tools).
One-time setup
- Generate minisign keys locally (run from a secure machine):
minisign -G -p minisign.pub -s minisign.key - Base64-encode
minisign.keyand store it as theMINISIGN_SECRET_KEYGitHub secret. Keep the private key offline; rotate if leaked. - Publish the public key string in
docs/security.mdand the README example env var. - Confirm OIDC trust for GitHub Actions with Sigstore (default trust policy works for keyless signing).
Release steps
- Bump version
- Update
VERSIONto the new semantic version (for example5.1.0). - Update docs/readme snippets if they mention the version.
- Update
- Commit and tag
git commit -am "chore: bump version to 5.1.0" git tag v5.1.0 git push origin main --tags - Workflow runs automatically on the pushed tag:
nix-check: runsnix flake checkfor determinism.build-artifacts: installs pinned toolchain (jq 1.7.1, ripgrep 13.0.0, uv 0.4.20), generatesSHA256SUMS, signs it with minisign, buildsubs.rbHomebrew formula, and producesdist/sbom.spdx.jsonfor the repo snapshot.oci-image: builds and pushesghcr.io/<owner>/ubs-tools:{sha,tag,latest}, signs the digest with Cosign keyless, attaches SBOM + provenance attestations, and uploads the SBOM/provenance artifacts.publish: attachesinstall.sh,ubs,SHA256SUMS,SHA256SUMS.minisig,ubs.rb, repo SBOM, and OCI SBOM/provenance to the GitHub Release for the tag.
- Validate release artifacts
- Download the release assets locally and run:
UBS_MINISIGN_PUBKEY="<public-key-line>" scripts/verify.sh --version 5.1.0 --install-args "--dry-run" - Verify OCI signature and attestations:
cosign verify $IMAGE_DIGEST cosign verify-attestation --type spdx $IMAGE_DIGEST cosign verify-attestation --type https://slsa.dev/provenance/v1 $IMAGE_DIGEST
- Download the release assets locally and run:
Key management
- Rotation: generate a new minisign keypair, update the GitHub secret, and publish the new public key. Keep the old public key listed in
docs/security.mduntil all releases signed with it are retired. - Revocation: if a key is compromised, remove it from secrets immediately, publish a revocation notice in
docs/security.md, and cut a new release signed with the new key. - Access: restrict
MINISIGN_SECRET_KEYsecret to maintainers only. Do not reuse this key for other projects.
Troubleshooting
- Missing secret: the release workflow fails early with
MINISIGN_SECRET_KEY is required for releases. - Tag/version mismatch: the workflow stops if
VERSIONin the repo does not match the pushed tag. - GHCR failures: ensure the owner name is lowercase and the
packages: writepermission is present (both handled in the workflow).