Release process¶
UltraCompress follows Semantic Versioning and uses tagged GitHub releases for both the GitHub release page and the PyPI package upload (via Trusted Publishing).
This page documents the release process for maintainers.
Release cadence¶
- Patch (0.1.x): on demand for bugfixes; typically every 1-4 weeks during active development
- Minor (0.x.0): roughly every 2-3 months as new features land
- Major (x.0.0): only on a breaking change; typically every 12+ months
Pre-release checklist¶
Before tagging a release:
- All CI checks green on
main - CHANGELOG.md has a populated section for the new version
- Version bumped in
src/ultracompress_cli/__init__.py(__version__) - Version bumped in
pyproject.toml - No secrets or credentials in the diff (gitleaks pre-commit catches this)
- Manual smoke test:
pip install -e . && uc --version && uc list && uc info <local-artifact> - Documentation site builds:
mkdocs build --strict
Cutting a release¶
# 1. Make sure you're on main and up-to-date
git checkout main
git pull origin main
# 2. Verify CHANGELOG has an entry for the new version
head -30 CHANGELOG.md
# 3. Tag the release (annotated tag with message)
git tag -a v0.1.1 -m "v0.1.1 — bugfix release for issue #N"
git push origin v0.1.1
What happens automatically on the tag push¶
The release.yml GitHub Actions workflow:
- Extracts the changelog section for the new version
- Creates a GitHub Release page with that content as the release notes
The ci.yml workflow's publish job:
- Triggers on the tag (since
if: startsWith(github.ref, 'refs/tags/v')) - Builds the wheel + sdist
- Publishes to PyPI via Trusted Publishing (no token required)
Both should complete within a few minutes. Monitor the Actions tab to verify.
Verification after release¶
- Visit https://pypi.org/project/ultracompress/ — confirm new version is listed
- Visit https://github.com/sipsalabs/ultracompress/releases — confirm Release page is rendered
- Run
pip install --upgrade ultracompressin a fresh venv; confirm version matches - Run
uc --version— confirm version matches - Smoke test the published package end-to-end (
uc list,uc pull,uc info)
Rollback¶
If something is wrong with a published release:
- Don't republish to the same version — PyPI doesn't allow rewriting an already-published version.
- Yank the broken version on PyPI (Manage Project → Releases → yank). This prevents new installs from picking it up.
- Cut a new patch release with the fix.
For the GitHub release page: - If the release notes are wrong, edit them on the GitHub UI - If the tag is wrong, you can delete the tag (locally + remotely) and recreate it, BUT this only works if you haven't published to PyPI yet
# delete tag locally
git tag -d v0.1.1
# delete tag remotely
git push --delete origin v0.1.1
# (then re-tag and re-push)
Hotfix protocol¶
For a critical bug (security vulnerability, broken core functionality):
- Don't merge new features into
mainuntil the hotfix is shipped. - Branch from the latest stable tag, not from
main: - Make the minimal fix.
- Bump the patch version (v0.1.0 → v0.1.1).
- Tag from the hotfix branch (NOT from
main). - After the tag is published, fast-forward
mainfrom the hotfix branch.
Pre-release versions (alpha, beta, rc)¶
For pre-release versions, use the aN, bN, rcN suffix:
Tag-pattern in release.yml includes a prerelease: contains(tag, '-') flag (currently using - for pre-release detection; pre-release tags should use v0.2.0-alpha1 style).
Things that should never happen¶
- Releasing without a corresponding CHANGELOG entry
- Releasing with secrets in the diff
- Force-pushing to
mainafter a release - Releasing a version that's behind PyPI's published version
- Releasing on a Friday afternoon (any post-release issues land in your weekend)
Post-release follow-up¶
After every release:
- Tweet / post the release notes (concise; link to changelog)
- Update docs.sipsalabs.com if any docs need to follow
- Update relevant social profiles' bio (when version is on the bio)
- Notify active design partners + customers via their dedicated Slack/Discord channels
- Open the next milestone on GitHub for the upcoming release