Release Process¶
Releases are triggered by pushing a version tag. CI publishes to crates.io and PyPI.
Prerequisites¶
- All checks pass on
main(.github/workflows/checks.yml) Cargo.toml,pyproject.toml, andCHANGELOG.mdupdated for the new version- GitHub secrets configured:
CARGO_REGISTRY_TOKEN,PYPI_API_TOKEN
Version alignment¶
These files must agree on the version number:
| File | Field |
|---|---|
Cargo.toml |
[package] version |
pyproject.toml |
[project] version |
| Git tag | vX.Y.Z (e.g. v0.9.1) |
The release workflow verifies tag ↔ Cargo.toml ↔ pyproject.toml alignment.
Pre-release checklist¶
Before pushing a tag:
# Full CI parity (see CONTRIBUTING.md)
cargo fmt --all -- --check
cargo clippy --all-targets -- -D warnings
RUSTDOCFLAGS="-D warnings" cargo doc --no-deps --locked
cargo test --locked
maturin develop --features python --locked && pytest python/tests -v
maturin build --features python --locked
pip install -r docs/requirements.txt && mkdocs build --strict
./scripts/check-doc-versions.sh
# Publish dry runs
cargo publish --dry-run --locked
Confirm:
- [ ]
CHANGELOG.mdhas release notes for the target version - [ ]
Cargo.toml,pyproject.toml, and tag name all match - [ ]
mainis green in CI - [ ] GitHub secrets
CARGO_REGISTRY_TOKENandPYPI_API_TOKENare set - [ ] No existing
vX.Y.Ztag on the remote (check withgit ls-remote --tags origin)
Steps¶
- Update
CHANGELOG.mdwith release notes. - Bump versions in
Cargo.tomlandpyproject.toml. - Commit and push to
main. - Create and push the tag:
git tag vX.Y.Z
git push origin vX.Y.Z
- Monitor
.github/workflows/release.yml: - Runs checks
- Publishes
odcsto crates.io - Builds Python wheels (Linux, musllinux, Windows, macOS)
- Publishes
pyodcsto PyPI
Dry runs¶
cargo publish --dry-run --locked --allow-dirty
maturin build --features python --locked
Post-release¶
- Verify crates.io/crates/odcs and pypi.org/project/pyodcs
- Verify odcs.readthedocs.io built the new tag (Read the Docs webhook)
- Update ROADMAP.md milestone status if needed
Upstream ODCS sync¶
When bumping for a new upstream ODCS release, follow SPEC.md synchronization workflow:
- Review upstream changelog and JSON Schema
- Update pinned schema in
schema/odcs-v3.1.0.json(andtests/fixtures/copy if kept) - Run
./scripts/sync-upstream-examples.sh <upstream-commit>to refresh example corpus - Update
UPSTREAM_SPEC_VERSIONinsrc/lib.rs - Update conformance tests and documentation