Releasing
A release is a v* tag on main. Two workflows fire on the tag push:
- Publish container images (
docker-publish.yml): builds, signs (keyless), generates an SBOM and Trivy-scansghcr.io/zyvorai/atlas(Dockerfile),atlas-ceph(Dockerfile.ceph) andatlas-io-agent(Dockerfile.io). - Release (
release.yml): GitHub Release with the matchingCHANGELOG.mdsection,atlasctlandatlas-mac-agentarchives for common platforms (macOS included), the UI bundle andSHA256SUMS.
Steps
- Branch
release/X.Y.Zfrommain. Move## [Unreleased]entries under## [X.Y.Z] — dateinCHANGELOG.md. - Bump the version in:
Cargo.toml(workspace) and the workspace members inCargo.lock,README.mdbadge,docs/DEPLOYMENT.md,docs/STATUS.md, both HelmChart.yaml(version/appVersion),crates/atlas-gateway/ui/package*.json,website/package*.json. Check withcargo metadata --locked. - Open the PR, merge it.
- Tag the merge commit (
git tag -a vX.Y.Z -m vX.Y.Z) and push the tag. - Wait for both workflows. Then bump the
atlas-io-agentimage indeploy/k8s/atlas-io-agent*.yamlin a follow-up PR; never deploy the floating:latest.
ghcr visibility
Visibility is per package, not per tag. atlas, atlas-ceph and atlas-io-agent are public, so new tags are
public as soon as they are pushed and nodes pull anonymously. A package that has never been published starts
private: set it to public once under the organisation's Packages settings.
Notes
- Runners can queue for a long time; the tag is not "released" until both workflows are green.
- Pre-pull a new image on a node before rolling a DaemonSet to it (
k3s ctr -n k8s.io images pull), because a failed pull kills the old pod first.