Hexeract uses a three-layer combo to ship new versions to crates.io. Whatever surface you choose, the underlying flow is identical: bump versions, graduate CHANGELOG, pre-flight checks, open a release prep PR, then push a tag that fires the publish workflow.
Use this when you want to bump from your browser, or when you do not have a local Rust toolchain handy.
- Open https://github.com/nubster-opensources/hexeract/actions/workflows/bump.yml.
- Click Run workflow.
- Pick the level input:
patch:0.1.0→0.1.1(bug fixes)minor:0.1.0→0.2.0(breaking changes allowed in 0.x per SEMVER_POLICY.md)major:1.2.3→2.0.0(breaking changes in 1.x+)- explicit
x.y.z: e.g.0.3.0
- The workflow runs
scripts/release.shin CI and opens a release prep PR. - Review the PR, merge it, then follow Tagging.
Use this when you want full control over the pre-flight (run tests against your local Docker, tweak CHANGELOG manually, etc.).
./scripts/release.sh patch # or minor / major / 0.3.0Requirements (must be installed on your machine):
bash,git,python3,ghcargoand thecargo-releasesubcommand pinned to the latest version compatible with our MSRV (cargo-release 1.1+requires Rust 1.91+, so we stay on the 0.25 series):cargo install --locked cargo-release@0.25.20
The script:
- Refuses to run if you are not on
mainor if the working tree is dirty. - Pulls
origin/main. - Computes the target version from the bump level.
- Creates
release/v<TARGET>-prepbranch. - Graduates
CHANGELOG.md: moves[Unreleased]body under a new[<TARGET>] - <DATE>section, refreshes the link refs. - Runs
cargo release <LEVEL> --workspace --execute --no-confirmwhich bumps everyCargo.tomlversion field (path-deps included) in a single consolidated commit. - Runs
cargo fmt --check,clippystrict, full test suite. - Pushes the branch and opens a PR via
gh.
For one-off bumps where you do not need the CHANGELOG graduation or the PR opening:
cargo release patch --workspace --execute --no-confirmThis is what scripts/release.sh calls under the hood. You will need to graduate the CHANGELOG manually and open the PR yourself.
After the release prep PR is merged into main, push the tag manually:
git checkout main
git pull origin main
git tag -a v<TARGET> -m "v<TARGET>"
git push origin v<TARGET>The tag push triggers .github/workflows/release.yml which:
- Publishes the twelve workspace crates to crates.io in dependency order (
hexeract-core->hexeract-outbox->hexeract-outbox-sql->hexeract-bus->hexeract-bus-rabbitmq->hexeract-mediator->hexeract-middleware->hexeract-macros->hexeract-scheduler->hexeract-scheduler-sql->hexeract-cli->hexeractfacade), with 30 s sleeps between each to let the crates.io index propagate. - Creates a release entry on the repository whose notes are extracted from the
[<TARGET>]section ofCHANGELOG.md.
Tagging is deliberately a manual step so the human reviewing the PR is also the one who triggers the publish, with full awareness of what is about to leave the workshop.
- It does not publish to crates.io. The tag does, via
release.yml. - It does not create the release entry. The tag does.
- It does not edit your
[Unreleased]items. Whatever you wrote there is preserved verbatim under the new[<TARGET>]section. - It does not skip pre-flight checks. If
cargo fmtorclippyor the test suite fails, the bump aborts.
error: must be on main: switch back to main, then retry.error: working tree must be clean: commit or stash your local changes.error: branch release/vX.Y.Z-prep already exists locally: a previous bump for the same version is still around. Delete it (git branch -D release/vX.Y.Z-prep) or pick a different target.- Pre-flight failure (fmt / clippy / test): fix the failure on
mainfirst via a normal PR, then retry the bump. gh pr createfails: probably an auth issue. Verifygh auth status. In CI theGITHUB_TOKENis provided automatically.- CHANGELOG section not found: the Python script expects
## [Unreleased]followed by## [somewhere later. If you renamed[Unreleased]or removed the next section, the script aborts.
release.toml lives at the repo root and configures cargo-release. The script lives at scripts/release.sh and is executable. The workflow lives at .github/workflows/bump.yml. None of these files affect runtime crates; they are purely repository tooling.