Tendermint uses semantic versioning with each release following
a vX.Y.Z
format. The master
branch is used for active development and thus it's
advisable not to build against it.
The latest changes are always initially merged into master
.
Releases are specified using tags and are built from long-lived "backport" branches
that are cut from master
when the release process begins.
Each release "line" (e.g. 0.34 or 0.33) has its own long-lived backport branch,
and the backport branches have names like v0.34.x
or v0.33.x
(literally, x
; it is not a placeholder in this case). Tendermint only
maintains the last two releases at a time (the oldest release is predominantly
just security patches).
As non-breaking changes land on master
, they should also be backported
to these backport branches.
We use Mergify's backport feature to automatically backport
to the needed branch. There should be a label for any backport branch that you'll be targeting.
To notify the bot to backport a pull request, mark the pull request with the label corresponding
to the correct backport branch. For example, to backport to v0.35.x, add the label S:backport-to-v0.35.x
.
Once the original pull request is merged, the bot will try to cherry-pick the pull request
to the backport branch. If the bot fails to backport, it will open a pull request.
The author of the original pull request is responsible for solving the conflicts and
merging the pull request.
If this is the first release candidate for a major release, you get to have the honor of creating the backport branch!
Note that, after creating the backport branch, you'll also need to update the
tags on master
so that go mod
is able to order the branches correctly. You
should tag master
with a "dev" tag that is "greater than" the backport
branches tags. See #6072
for more context.
In the following example, we'll assume that we're making a backport branch for the 0.35.x line.
master
git checkout -b v0.35.x
git push origin v0.35.x
After doing these steps, go back to master
and do the following:
Tag master
as the dev branch for the next major release and push it back up.
For example:
git tag -a v0.36.0-dev -m "Development base for Tendermint v0.36."
git push origin v0.36.0-dev
Create a new workflow to run e2e nightlies for the new backport branch. (See e2e-nightly-master.yml for an example.)
Add a new section to the Mergify config (.github/mergify.yml
) to enable the
backport bot to work on this branch, and add a corresponding S:backport-to-v0.35.x
label so the bot can be triggered.
Add a new section to the Dependabot config (.github/dependabot.yml
) to
enable automatic update of Go dependencies on this branch. Copy and edit one
of the existing branch configurations to set the correct target-branch
.
Before creating an official release, especially a major release, we may want to create a release candidate (RC) for our friends and partners to test out. We use git tags to create RCs, and we build them off of backport branches.
Tags for RCs should follow the "standard" release naming conventions, with -rcX
at the end
(for example, v0.35.0-rc0
).
(Note that branches and tags cannot have the same names, so it's important that these branches have distinct names from the tags/release names.)
If this is the first RC for a major release, you'll have to make a new backport branch (see above). Otherwise:
v0.35.x
).CHANGELOG_PENDING.md
into CHANGELOG.md
. Each RC should have
it's own changelog section. These will be squashed when the final candidate is released.python ./scripts/linkify_changelog.py CHANGELOG.md
to add links for
all PRsUPGRADING.md
is up-to-date and includes notes on any breaking changes
or other upgrading flows.version.go
version.go
, if necessary.
Check the changelog for breaking changes in these components.version.go
, if necessarygit tag -a v0.35.0-rc0 -m "Release Candidate v0.35.0-rc0
git push origin v0.35.0-rc0
Now the tag should be available on the repo's releases page.Note that this process should only be used for "true" RCs-- release candidates that, if successful, will be the next release. For more experimental "RCs," create a new, short-lived branch and tag that instead.
This major release process assumes that this release was preceded by release candidates. If there were no release candidates, begin by creating a backport branch, as described above.
v0.35.x
)make test_integrations
) and the e2e nightlies.CHANGELOG_PENDING.md
.
(Squashing includes both combining all entries, as well as removing or simplifying
any intra-RC changes. It may also help to alphabetize the entries by package name.)python ./scripts/linkify_changelog.py CHANGELOG.md
to add links for
all PRsUPGRADING.md
is up-to-date and includes notes on any breaking changes
or other upgrading flows.version.go
version.go
, if necessaryversion.go
, if necessaryv0.35.0
.
git tag -a v0.35.0 -m 'Release v0.35.0'
git push origin v0.35.0
master
is updated with the latest CHANGELOG.md
, CHANGELOG_PENDING.md
, and UPGRADING.md
.master
.docs/versions
to
ensure the newest release is the default for the landing page.themeConfig.versions
in
docs/.vuepress/config.js
to include the
release in the dropdown versions menu.Minor releases are done differently from major releases: They are built off of
long-lived backport branches, rather than from master. As non-breaking changes
land on master
, they should also be backported into these backport branches.
Minor releases don't have release candidates by default, although any tricky changes may merit a release candidate.
To create a minor release:
git checkout v0.35.x
make test_integrations
) and the nightlies.CHANGELOG_PENDING.md
to top of CHANGELOG.md
python ./scripts/linkify_changelog.py CHANGELOG.md
to add links for all issuesbash ./scripts/authors.sh
to get a list of authors since the latest release, and add the GitHub aliases of external contributors to the top of the CHANGELOG. To lookup an alias from an email, try bash ./scripts/authors.sh <email>
CHANGELOG_PENDING.md
version.go
v0.35.x
git tag -a v0.35.1 -m 'Release v0.35.1'
git push origin v0.35.1
R:minor
labels from the pull requests that were included in the release.