Release Guide
This document walks through the complete release process from code freeze to published artifacts.
Release Pipeline Overview
flowchart LR
classDef step fill:#f59e0b,stroke:#b45309,color:#fff;
A["Code Freeze\non develop"]:::step --> B["Version Bump"]:::step
B --> C["QA Checks"]:::step
C --> D["Merge to main"]:::step
D --> E["Tag: v*.*.*"]:::step
E --> F["CI Auto-Deploys"]:::step
F --> G["PyPI + GHCR\n+ Docs"]:::step
Use mouse to pan and zoom
When a v*.*.* tag is pushed, CI automatically publishes:
- GitHub Release with
.whlartifacts - PyPI via OIDC Trusted Publishing (zero tokens)
- GHCR Docker Image tagged as
latestand versioned - MkDocs versioned documentation via
mike
Step-by-Step Release Checklist
1. Ensure Notebooks Are Clean
- All code changes are in
nbs/*.ipynb - Run
nbdev-exportto sync.pyfiles - Run
nbdev-cleanto strip metadata
2. Run Full QA Suite
- Linting passes
- Tests pass
- Docs build cleanly
3. Bump Version
Update the version in two places:
4. Commit and Merge
Then create a PR from develop → main and merge after review.
5. Tag and Push
This triggers CI deployment
Pushing a tag will automatically publish to PyPI, GHCR, and deploy versioned docs. Make sure the main branch is clean!
6. Post-Release
- Verify the PyPI page shows the new version
- Verify the GHCR package has the new tag
- Verify the docs site shows the versioned release
- Back-merge
mainintodevelop: