This document covers the full release process: local dry-run, CI smoke test, and cutting the real release.
Before releasing, bump the version in all three places consistently:
| File | Field |
|---|---|
Cargo.toml |
[workspace.package] version |
crates/ros-z-msgs/python/pyproject.toml |
version |
crates/ros-z-py/pyproject.toml |
version |
The ros-z-py wheel depends on ros-z-msgs-py>=<version> — update that lower bound too when bumping.
Build the Python wheels locally to catch obvious issues before touching CI:
# Build jazzy + humble wheels into crates/ros-z-py/dist/
./scripts/build-python-wheels.nu
# Build and immediately install into a local venv to verify import
./scripts/build-python-wheels.nu --install jazzy
# Single distro only
./scripts/build-python-wheels.nu jazzyThe script produces the same wheel filenames as CI (e.g. ros_z_py-0.2.0-0jazzy-cp311-abi3-linux_x86_64.whl).
Before tagging a real version, verify the entire CI release pipeline works end-to-end using a throwaway tag:
./scripts/test-release-workflow.nuThis pushes v0.0.0-smoke-test, waits for all CI jobs to pass (builds, smoke tests, release creation), then reports the result. The script requires gh CLI authenticated to the repo.
# Push only — skip the polling wait
./scripts/test-release-workflow.nu --no-wait
# Clean up the smoke-test tag and draft release afterward
./scripts/test-release-workflow.nu --cleanupThe CI pipeline exercises:
- All wheel builds (jazzy + humble × x86_64 Linux, aarch64 Linux, aarch64 macOS)
- All binary builds (
ros-z-bridge,ros-z-console) - All Go library builds (
libros_zstatic + shared) - Python smoke test: install into venv,
import ros_z_py - Binary smoke test:
--help+ 3-second runtime check (no crash) - Go smoke test: CGO compilation against the downloaded
.a - Install-from-release-URL test:
pip installfrom the actual GitHub Release artifacts
Do not proceed to Step 3 until this is fully green.
git tag v0.x.y
git push origin v0.x.yThis triggers .github/workflows/release.yml which:
- Builds all wheels, binaries, and Go libraries in parallel
- Runs smoke tests (same as Step 2)
- Generates a changelog from conventional commits via
git-cliff - Creates a GitHub Release with all artifacts attached
The release is live once the Create GitHub Release job completes (~15–20 min total).
Changelog entries are generated automatically from conventional commit messages. Only feat and fix commits appear by default; chore, ci, style, and build are filtered out. See cliff.toml for the full configuration.
To preview the changelog before releasing:
git cliff --latest --strip header