Releasing

August 25, 2026 ยท View on GitHub

django-bakery uses Semantic Versioning and Keep a Changelog. The package version is derived from Git tags by setuptools-scm; do not edit a version file. Release tags use the v<version> form, such as v0.14.0, while the package version remains 0.14.0.

Release checklist

  • Review the user-facing changes in CHANGELOG.md.
  • Move the release entries from Unreleased into a dated version section.
  • Choose a major, minor, or patch version according to Semantic Versioning.
  • Run make check, make test, make docs-check, and make verify.
  • Build and inspect the distributions with make build.
  • Obtain explicit human approval for the version and release.
  • Merge the approved release pull request.
  • With explicit human approval, create the v<version> tag (for example, v0.14.0) on the merge commit to trigger the package publication workflow.
  • Confirm the expected release appears on PyPI.
  • Create the GitHub Release from the existing tag, with concise notes from the matching changelog section.
  • Confirm the documentation workflow deployed the matching site.

Agents may prepare release notes and run validation, but must not create tags, GitHub releases, documentation deployments, or package publications without explicit human approval.

Verify a tag and GitHub Release

After the release pull request merges, verify that the tag points to its merge commit before publishing:

VERSION=0.14.0
TAG="v$VERSION"
EXPECTED_COMMIT=<release-commit>
git fetch origin --tags
test "$(git rev-parse "${TAG}^{commit}")" = "$EXPECTED_COMMIT"

With approval and after the package publication succeeds, create a release from that existing tag:

gh release create "$TAG" \
  --verify-tag \
  --title "$VERSION" \
  --notes-file release-notes.md

Verify that it is public and uses the expected tag:

test "$(gh release view "$TAG" --json tagName --jq .tagName)" = "$TAG"
test "$(gh release view "$TAG" --json isDraft,isPrerelease \
  --jq '(.isDraft == false and .isPrerelease == false)')" = "true"
test "$(git rev-parse "${TAG}^{commit}")" = "$EXPECTED_COMMIT"

Use the repository's GitHub Actions configuration for the authoritative publication and documentation deployment steps. Never bypass its approval requirements with a local upload.