Releases are manual: a maintainer decides when to cut one, there is no release bot. Cutting a release publishes a new container image to ghcr.io/robocode-dev/rumble-client (see CAP-001).
- On
main, moveCHANGELOG.md's## [Unreleased]heading to a dated version heading, e.g.## [0.2.0] - 2026-09-13, and start a fresh empty## [Unreleased]section above it. - Set the plain version in
gradle.properties(drop the-SNAPSHOTsuffix), e.g.version=0.2.0. - Commit both changes.
- Tag the commit and push the tag:
git tag v0.2.0 && git push origin v0.2.0. Pushing the tag triggers.github/workflows/publish.yml, which builds theDockerfile, pushesghcr.io/robocode-dev/rumble-client:0.2.0and:latest, then confirms the image is pullable without credentials. On the first release, this confirmation step is expected to fail: GitHub's API has no way to set a package's visibility, so a packageGITHUB_TOKENcreates starts private. When it fails, go to the package's GHCR settings (Package settings → Danger Zone → Change visibility) and set it to public — a one-time step, since GitHub packages generally cannot be made private again — then re-run the failed workflow run. Every release after that should pass without intervention. - Bump
gradle.propertiesback to the next-SNAPSHOTversion, e.g.version=0.3.0-SNAPSHOT, and commit. - Create a GitHub Release for the tag referencing the
CHANGELOG.mdentry.
Pushing a tag is the only thing that publishes an image; ordinary commits to main never do.