Branch Structure
Master Branch
All new development occurs on the master branch:- Receives all new features and improvements
- Most unstable, cutting-edge code
- Maps to the edge release channel
- Minor version incremented after each stabilization branch is forged
Stabilization Branches
vX.Y branches are stabilization branches:- Created from master approximately every 13 weeks
- Receive only bug fixes (cherry-picked from master)
- Named with major and minor version only (e.g.,
v2.0,v2.1) - The latest stabilization branch maps to beta channel
- The second-latest maps to stable channel
Release Tags
vX.Y.Z tags mark specific releases:- Created from stabilization branches
- Trigger automated release builds and publishing to crates.io
- Include full semantic version (e.g.,
v2.0.3) - Created as needed by the stabilization branch owner
Release Channels
Channels help users automatically update to the appropriate version:| Channel | Branch | Stability | Use Case |
|---|---|---|---|
| edge | master | Least stable | Development, testing new features |
| beta | Latest vX.Y | More stable | Pre-production testing |
| stable | Second vX.Y | Most stable | Production validators |
Creating a Release Branch
Prerequisites
Check for deprecated symbols
For major releases, verify all deprecated symbols eligible for removal have been removed. The policy is to deprecate for at least one full minor version before removal.
Create and Push Branch
Update Master Version
After creating the branch, increment the master version:Update Changelog
Create a PR updating CHANGELOG.md in master:- Advance channel links with the newly created branch becoming beta
- Add a new
X.Y.0-Unreleasedsection for the new master version - Remove
Unreleasedannotation from the section that became beta
Miscellaneous Cleanup
Pin stable dependencies
On the newly promoted stable branch:
- Pin
splTokenCliVersioninscripts/spl-token-cli-version.sh - Pin
cargoBuildSbfVersionandcargoTestSbfVersioninscripts/cargo-build-sbf-version.sh
Update new branch
On the new branch:
- Remove channel links from CHANGELOG.md
- Remove “unreleased” wording
- Update CODEOWNERS to
* @anza-xyz/backport-reviewers
Update tooling
- Update mergify.yml with backport actions for new branch
- Add GitHub backport label for new branch
- Remove obsolete branch labels
Creating a Release
Create Release Tag
Open GitHub Releases
Go to GitHub Releases and click “Draft new release”.
Set tag name
The tag must exactly match the
version field in /Cargo.toml prefixed by v.Example: If Cargo.toml has version = "2.1.3", the tag is v2.1.3.Set target branch
Ensure the target branch matches your release branch.Example: For v2.1.0, target branch must be
v2.1.Write release notes
- For the first release on a branch (e.g., v2.1.0), use this template
- For patch releases, review commits since the previous release and add details
Save as draft
Click “Save Draft” and verify:
- Release notes look correct
- Tag name is correct
- Target branch is correct
- “This is a pre-release” is checked
Verify Release Automation
After publishing, verify build artifacts:Check Buildkite
The
agave-secondary pipeline creates Linux and macOS artifacts:- Visit Buildkite agave-secondary
- Look for a job under your tag name
Check GitHub Actions
Windows artifacts are built by GitHub Actions:
- Visit GitHub Actions
- Look for a workflow under your tag name
Uncheck pre-release
Once all assets are present, edit the release and uncheck “This is a pre-release”.
Check crates.io
Verify agave-validator on crates.io has the updated version.This can take 2-3 hours. If it fails, retry the “publish crate” job in the Buildkite pipeline.
Post-Release Steps
Bump patch version
An automated action creates a PR to increment the patch version on the release branch (e.g., 2.1.0 → 2.1.1).
As of 2024-03-26, this action may fail. If so, manually run the version bump script and revert any incorrect hashbrown and proc-macro2 version updates.
Version Numbering
Agave follows Semantic Versioning:- Major (X.0.0): Breaking changes, major features
- Minor (X.Y.0): New features, backward-compatible
- Patch (X.Y.Z): Bug fixes, backward-compatible
Prerelease Notation
Agave supports semver prerelease notation in gossip:- alpha: 0.X.Y-alpha.Z
- beta: 0.X.Y-beta.Z
- rc: 0.X.Y-rc.Z
- stable: 0.X.Y
Version struct.
Backporting Changes
Bug fixes follow this workflow:Merge to master first
All bug fixes must land on master first to ensure they’re present in future releases.
The exception to merge-to-master-first is when a bug fix for vX.Y doesn’t apply to master or vX.Y-1.
Deploying to Clusters
After releasing:- testnet.solana.com - Test the release here first
- devnet.solana.com - Deploy stable releases only
- mainnet-beta.solana.com - Deploy stable releases only
Next Steps
- Review contributing guidelines for code standards
- Learn about building from source
- Understand testing requirements