Release Workflow¶
This guide covers version management, release tagging, and the changelog process.
Semantic Versioning¶
We follow Semantic Versioning (SemVer) for all releases:
- MAJOR version (1.0.0 → 2.0.0) - Breaking changes
- MINOR version (1.0.0 → 1.1.0) - New features (backward compatible)
- PATCH version (1.0.0 → 1.0.1) - Bug fixes (backward compatible)
Release Workflow Diagram¶
Visual overview of the complete release process:
graph TD
A[Update CHANGELOG.md<br/>Unreleased section] --> B[Bump Version<br/>just bump part='...']
B --> C[Move Unreleased to Version<br/>in CHANGELOG.md]
C --> D[Commit Changelog<br/>docs: update changelog]
D --> E[Merge to main]
E --> F[Create Tag<br/>just tag]
F --> G[GitHub Release<br/>automatic]
Release Process¶
1. Update CHANGELOG.md¶
Before bumping the version, document your changes in CHANGELOG.md:
## [Unreleased]
### Added
- New user authentication endpoints
### Fixed
- Database connection pool timeout issue
Follow the Keep a Changelog format.
2. Bump Version¶
Increment the version number in pyproject.toml and app/__init__.py:
# For a patch release (0.1.0 → 0.1.1)
just bump
# For a minor release (0.1.0 → 0.2.0)
just bump minor
# For a major release (0.1.0 → 1.0.0)
just bump major
This command automatically:
- Updates version in
pyproject.toml - Updates
__version__inapp/__init__.py
3. Update Changelog Version¶
Move the [Unreleased] section to the new version:
## [1.2.0] - 2026-02-15
### Added
- New user authentication endpoints
### Fixed
- Database connection pool timeout issue
## [Unreleased]
(Empty - next development cycle)
Commit this change:
4. Create Release Tag¶
After merging the version bump to main, create and push a Git tag:
This command:
- Creates an annotated Git tag (e.g.,
v1.2.0) - Pushes the tag to the remote repository
- Triggers the GitHub Release workflow
5. GitHub Release¶
The GitHub Actions workflow automatically:
- Creates a GitHub Release from the tag
- Extracts release notes from
CHANGELOG.md - Attaches build artifacts (if configured)
View releases at: https://github.com/balakmran/quoin-api/releases
Conventional Commits¶
Use Conventional Commits for clear commit history:
| Type | Description | Changelog Section |
|---|---|---|
feat: |
New feature | Added |
fix: |
Bug fix | Fixed |
docs: |
Documentation changes | Changed |
style: |
Code formatting | - |
refactor: |
Code refactoring | Changed |
test: |
Test updates | - |
chore: |
Build/tooling changes | - |
Examples:
git commit -m "feat(user): add password reset endpoint"
git commit -m "fix(db): resolve connection pool timeout"
git commit -m "docs: update deployment guide"
Release Checklist¶
Before creating a release:
- All tests pass (
just check) -
CHANGELOG.mdis updated with all changes - Version is bumped (
just bump part="...") - Changes are merged to
mainbranch - Tag is created and pushed (
just tag) - GitHub Release is created automatically
- Documentation is deployed
Hotfix Releases¶
For critical bug fixes that need immediate release:
- Create hotfix branch from
main:
- Fix the bug and commit:
- Bump patch version:
-
Update changelog, commit, and merge to
main -
Create tag:
Pre-releases¶
For beta or release candidate versions:
# Manual version bump (not automated by just)
# In pyproject.toml and app/__init__.py
__version__ = "1.2.0-beta.1"
# Create pre-release tag
git tag v1.2.0-beta.1
git push origin v1.2.0-beta.1
Mark as "Pre-release" in GitHub when creating the release.
See Also¶
- Deployment Guide — Deploying releases to production
- Conventional Commits — Commit message format
- Semantic Versioning — Version numbering scheme
- justfile — Automation commands