This document outlines the release process for the Babylon node (babylond)
Babylon follows semantic versioning, but with the following deviations to account for state-machine and API breaking changes.
- State-machine breaking changes will result in an increase of the major version X (X.y.z).
- Emergency releases & API breaking changes will result in an increase of the minor version Y (x.Y.z | x > 0).
- All other changes will result in an increase of the patch version Z (x.y.Z | x > 0).
A change is considered to be state-machine breaking if it requires a coordinated upgrade for the network to preserve state compatibility Note that when bumping the dependencies of Cosmos SDK and IBC, we will only treat patch releases as non state-machine breaking.
A change is considered to be API breaking if it modifies the provided API. This includes events, queries, CLI interfaces.
A major release is an increment of the first number (eg: v9.1.0 → v10.0.0).
Note: Generally, PRs should target either main or a long-lived feature
branch (see CONTRIBUTING.md).
- Once the team feels that
mainis feature complete, we create arelease/vY.xbranch (going forward known as release branch), whereYis the version number, with the minor and patch part substituted tox(eg: 11.x).- PRs targeting directly a release branch can be merged only when exceptional circumstances arise.
- In the release branch
- Create a PR that adds new version section in the
CHANGELOG.md, matching the released version e.g for branchrelease/vY.x, section will be calledvY.0.0
- Create a PR that adds new version section in the
- We freeze the release branch from receiving any new features and focus on
releasing a release candidate.
- Finish audits and reviews.
- Add more tests.
- Fix bugs as they are discovered.
- After the team feels that the release branch works fine, we cut a release
candidate.
- Create a new annotated git tag for a release candidate in the release branch (follow the Tagging Procedure).
- The release verification on devnet must pass.
- When bugs are found, create a PR for
main, and backport fixes to the release branch. - Before tagging the release, create and merge PR to the release branch that:
- Moves all changelog entries form
Unreleasedsection of the changelog to the newly created sectionvY.0
- Moves all changelog entries form
- Create new release candidate tags after bugs are fixed.
- After the team feels the release candidate is ready, create a full release:
- Note: The final release MUST have the same commit hash as the latest corresponding release candidate.
- Create a new annotated git tag in the release branch (follow the Tagging Procedure)
- After the final release is made e.g
vY.0.0, backport changelog changes to themainbranch- checkout a new branch from the main branch:
username/backport_changelog - bring the new section from
release/vY.xbranch to theCHANGELOG.mdfile onmainbranch - open PR against the
mainbranch
- checkout a new branch from the main branch:
For major releases (e.g., release/v3.x, release/v4.x):
Create the release branch from main:
git checkout main
git pull
git checkout -b release/v4.x
git pushFor minor releases (e.g., release/v4.2.x when release/v4.1.x exists):
Create the release branch from the previous minor release branch:
git checkout release/v4.1.x
git pull
git checkout -b release/v4.2.x
git pushBefore cutting a release (e.g., v2.0.0-rc.0), the
following steps are necessary:
- move to the release branch, e.g.,
release/v2.xgit checkout release/v2.x
- create new tag (follow the Tagging Procedure)
Important: Always create tags from your local machine since all
release tags should be signed and annotated. Using Github UI will create a
lightweight tag, so it's possible that babylond version returns a commit
hash, instead of a tag. This is important because most operators build from
source, and having incorrect information when you run make install && babylond version raises confusion.
The following steps are the default for tagging a specific branch commit using
git on your local machine. Usually, release branches are labeled release/v*:
Ensure you have checked out the commit you wish to tag and then do (assuming
you want to release version v2.0.0-rc.0 ):
git pull --tags
git tag -s -a v2.0.0-rc.0 -m "Version v2.0.0-rc.0"With every tag, the Github action will use the goreleaser tool to create a
release, including artifacts and their checksums.
A major release is an increment of the major number (eg: v9.X.X → v10.X.X).
A minor release is an increment of the minor number (eg: v9.0.X → v9.1.X).
A patch release is an increment of the patch number (eg: v10.0.0 → v10.0.1).
A major release will only be done via a governance gated upgrade. It can contain state breaking changes, and will
also generally include new features, major changes to existing features, and/or large updates to key dependency
packages such as CometBFT or the Cosmos SDK.
A minor release may be executed via a governance gated upgrade, or via a coordinated upgrade on a predefined block
height. It will contain breaking changes that require a coordinated upgrade, but the scope of these changes is
limited to essential updates such as fixes for security vulnerabilities.
Each vulnerability which requires a state breaking upgrade will be evaluated individually by the maintainers of the software and the maintainers will determine on whether to include the changes into a minor release.
A patch release will be created for changes that are strictly not state breaking. The latest patch release for a
given release version is generally the recommended release, however, validator updates can be rolled out
asynchronously without risking the state of a network running the software.
The intention of the Release Policy is to ensure that the latest Babylond release is maintained with the following categories of fixes:
- Tooling improvements (including code formatting, linting, static analysis and updates to testing frameworks)
- Performance enhancements for running archival and syncing nodes
- Test and benchmarking suites, ensuring that fixes are sound and there are no performance regressions
- Library updates including point releases for core libraries such as IBC-Go, Cosmos SDK, CometBFT and other dependencies
- General maintenance improvements, that are deemed necessary by the stewarding team, that help align different releases and reduce the workload on the stewarding team
- Security fixes
Updates to the release branch should come from main by backporting PRs
(usually done by automatic cherry-pick followed by PRs to the release branch).
The backports must be marked using backport-to-release/vY.x label in PR for main.
It is the PR author's responsibility to fix merge conflicts, update changelog entries, and
ensure CI passes. If a PR originates from an external contributor, a member of the stewarding team assumes
responsibility to perform this process instead of the original author.
After the release branch has all commits required for the next patch release:
- Update the changelog
- Create a new annotated git tag in the release branch (follow the Tagging Procedure).
- Once the release process completes, back port changelog updates to
mainbranch