Only publish a release from a green main commit. Stable releases follow
semantic versioning and use matching metadata in five places:
package.json:MAJOR.MINOR.PATCHapps/api/src/main.tsandapps/api/src/generate-openapi.ts:MAJOR.MINOR.PATCHRELEASE_NOTES.md:# OpenClockwork vMAJOR.MINOR.PATCH.env.prod.example:OPENCLOCKWORK_VERSION=MAJOR.MINOR.PATCH- Git tag:
vMAJOR.MINOR.PATCH
- Choose the next semantic version according to the compatibility impact.
- Update
package.json,RELEASE_NOTES.md,.env.prod.example, and any additional version examples. - Curate highlights, upgrade notes, database migrations, breaking changes, Docker image names, and known issues.
- Ensure every included pull request has a release-note entry or is explicitly
marked
None. - Run
RELEASE_TAG=vMAJOR.MINOR.PATCH pnpm release:verify-tagand the full CI suite.
After the release pull request is merged and main is green, create an
annotated tag on the exact merge commit and push it:
git switch main
git pull --ff-only
git tag -a v1.1.1 -m "OpenClockwork v1.1.1"
git push origin v1.1.1The release workflow verifies the tag and notes, runs Nx and API end-to-end
tests, publishes the API and web images to GHCR, and finally creates a GitHub
Release. GitHub's generated changelog is appended to the curated notes using
the categories in .github/release.yml.
For the first publication of each GHCR package, verify its visibility is Public in the GitHub package settings. Public container images can then be pulled anonymously by self-hosted installations.
docker pull ghcr.io/patrickschiller/openclockwork-api:1.1.1
docker pull ghcr.io/patrickschiller/openclockwork-web:1.1.1Confirm that the GitHub Release is marked latest, contains the curated upgrade notes, links to the tag, and lists both image tags. Then perform the documented upgrade smoke test against a backed-up non-production installation.
Release tags and published images are immutable. Correct a faulty release with a new patch version instead of moving or overwriting its tag.