This document describes the release process for the a2a-rust workspace.
- Commit access to
main CARGO_REGISTRY_TOKENsecret configured in thecrates-ioGitHub environment- All CI checks passing on
main protocinstalled locally (required for--all-featuresbuilds that enable thegrpcfeature). Install viaapt-get install protobuf-compiler(Debian/Ubuntu),brew install protobuf(macOS), or download from the protobuf releases page
Publishing must happen in this order (each crate depends on the ones above it):
a2a-protocol-types— no workspace dependenciesa2a-protocol-client— depends ona2a-protocol-typesa2a-protocol-server— depends ona2a-protocol-typesa2a-protocol-sdk— depends on all three
# Create a release branch
git checkout -b release/vX.Y.Z main
# Update version in all 4 crate Cargo.toml files (must all match)
# crates/a2a-types/Cargo.toml
# crates/a2a-client/Cargo.toml
# crates/a2a-server/Cargo.toml
# crates/a2a-sdk/Cargo.toml
# Update CHANGELOG.md: move [Unreleased] content to [X.Y.Z] with date
# Add new empty [Unreleased] section
# Verify everything builds and passes
cargo fmt --all
cargo clippy --workspace --all-targets --all-features -- -D warnings
cargo test --workspace --all-features
RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps
# Verify packaging
cargo package --workspace --exclude echo-agent --exclude agent-team --exclude multi-lang-team --exclude rig-a2a-agent --exclude genai-a2a-agent --exclude a2a-tckgit add -A && git commit -m "chore: prepare release vX.Y.Z"
# Open PR, get review, merge to maingit checkout main && git pull
git tag -a vX.Y.Z -m "Release vX.Y.Z"
git push origin vX.Y.ZThis triggers the release workflow (.github/workflows/release.yml) which:
- Validates that all 4 crate versions match the tag and CHANGELOG entry exists
- Runs CI (fmt, clippy, test, doc, MSRV check) and security audit (cargo-deny)
- Packages all crates with SLSA build provenance attestation
- Runs a publish dry run to verify packages are publishable
- Creates a GitHub Release with notes extracted from CHANGELOG.md and attached
.crateartifacts - Publishes to crates.io in dependency order with index propagation delays (requires
crates-ioenvironment approval)
- Verify all 4 crates appear on crates.io
- Verify docs build on docs.rs
- Announce release if appropriate
This project follows Semantic Versioning.
All four workspace crates share the same version number and are always released
together. The example crates (echo-agent, agent-team, multi-lang-team,
rig-a2a-agent, genai-a2a-agent) and the a2a-tck binary are publish = false
and are never published.
If publishing fails after some crates are already published:
- Fix the issue
- Bump the patch version for all crates
- Update CHANGELOG.md
- Tag and push the new version
You cannot re-publish the same version to crates.io.
The release workflow validates that all 4 crate versions match the Git tag. If they don't match, the workflow fails immediately. Fix the versions and re-tag.