|
|
@ -0,0 +1,161 @@ |
|
|
|
# Releases |
|
|
|
|
|
|
|
Tendermint uses [semantic versioning](https://semver.org/) 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). |
|
|
|
|
|
|
|
## Backporting |
|
|
|
|
|
|
|
As non-breaking changes land on `master`, they should also be backported |
|
|
|
to these backport branches. |
|
|
|
|
|
|
|
We use Mergify's [backport feature](https://mergify.io/features/backports) 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. |
|
|
|
|
|
|
|
### Creating a backport branch |
|
|
|
|
|
|
|
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](https://github.com/tendermint/tendermint/pull/6072) |
|
|
|
for more context. |
|
|
|
|
|
|
|
In the following example, we'll assume that we're making a backport branch for |
|
|
|
the 0.35.x line. |
|
|
|
|
|
|
|
1. Start on `master` |
|
|
|
2. Create and push the backport branch: |
|
|
|
`git checkout -b v0.35.x; git push origin v0.35.x` |
|
|
|
3. Go back to master and tag it as the dev branch for the _next_ major release and push it back up: |
|
|
|
`git tag -a v0.36.0-dev -m "Development base for Tendermint v0.36."; git push origin v0.36.0-dev` |
|
|
|
4. Create a new workflow (still on master) to run e2e nightlies for the new backport branch. |
|
|
|
(See https://github.com/tendermint/tendermint/blob/master/.github/workflows/e2e-nightly-master.yml |
|
|
|
for an example.) |
|
|
|
5. 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](https://github.com/tendermint/tendermint/labels) so the bot can be triggered. |
|
|
|
|
|
|
|
## Release candidates |
|
|
|
|
|
|
|
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: |
|
|
|
|
|
|
|
1. Start from the backport branch (e.g. `v0.35.x`). |
|
|
|
2. Run the integration tests and the e2e nightlies |
|
|
|
(which can be triggered from the Github UI; |
|
|
|
e.g., https://github.com/tendermint/tendermint/actions/workflows/e2e-nightly-34x.yml). |
|
|
|
3. Prepare the changelog: |
|
|
|
- Move the changes included in `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. |
|
|
|
- Run `python ./scripts/linkify_changelog.py CHANGELOG.md` to add links for |
|
|
|
all PRs |
|
|
|
- Ensure that `UPGRADING.md` is up-to-date and includes notes on any breaking changes |
|
|
|
or other upgrading flows. |
|
|
|
- Bump TMVersionDefault version in `version.go` |
|
|
|
- Bump P2P and block protocol versions in `version.go`, if necessary. |
|
|
|
Check the changelog for breaking changes in these components. |
|
|
|
- Bump ABCI protocol version in `version.go`, if necessary |
|
|
|
4. Open a PR with these changes against the backport branch. |
|
|
|
5. Once these changes have landed on the backport branch, be sure to pull them back down locally. |
|
|
|
6. Once you have the changes locally, create the new tag, specifying a name and a tag "message": |
|
|
|
`git tag -a v0.35.0-rc0 -m "Release Candidate v0.35.0-rc0` |
|
|
|
7. Push the tag back up to origin: |
|
|
|
`git push origin v0.35.0-rc0` |
|
|
|
Now the tag should be available on the repo's releases page. |
|
|
|
8. Future RCs will continue to be built off of this branch. |
|
|
|
|
|
|
|
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. |
|
|
|
|
|
|
|
## Major release |
|
|
|
|
|
|
|
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. |
|
|
|
|
|
|
|
1. Start on the backport branch (e.g. `v0.35.x`) |
|
|
|
2. Run integration tests (`make test_integrations`) and the e2e nightlies. |
|
|
|
3. Prepare the release: |
|
|
|
- "Squash" changes from the changelog entries for the RCs into a single entry, |
|
|
|
and add all changes included in `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.) |
|
|
|
- Run `python ./scripts/linkify_changelog.py CHANGELOG.md` to add links for |
|
|
|
all PRs |
|
|
|
- Ensure that `UPGRADING.md` is up-to-date and includes notes on any breaking changes |
|
|
|
or other upgrading flows. |
|
|
|
- Bump TMVersionDefault version in `version.go` |
|
|
|
- Bump P2P and block protocol versions in `version.go`, if necessary |
|
|
|
- Bump ABCI protocol version in `version.go`, if necessary |
|
|
|
4. Open a PR with these changes against the backport branch. |
|
|
|
5. Once these changes are on the backport branch, push a tag with prepared release details. |
|
|
|
This will trigger the actual release `v0.35.0`. |
|
|
|
- `git tag -a v0.35.0 -m 'Release v0.35.0'` |
|
|
|
- `git push origin v0.35.0` |
|
|
|
6. Make sure that `master` is updated with the latest `CHANGELOG.md`, `CHANGELOG_PENDING.md`, and `UPGRADING.md`. |
|
|
|
7. Add the release to the documentation site generator config (see |
|
|
|
[DOCS_README.md](./docs/DOCS_README.md) for more details). In summary: |
|
|
|
- Start on branch `master`. |
|
|
|
- Add a new line at the bottom of [`docs/versions`](./docs/versions) to |
|
|
|
ensure the newest release is the default for the landing page. |
|
|
|
- Add a new entry to `themeConfig.versions` in |
|
|
|
[`docs/.vuepress/config.js`](./docs/.vuepress/config.js) to include the |
|
|
|
release in the dropdown versions menu. |
|
|
|
|
|
|
|
## Minor release (point releases) |
|
|
|
|
|
|
|
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: |
|
|
|
|
|
|
|
1. Checkout the long-lived backport branch: `git checkout v0.35.x` |
|
|
|
2. Run integration tests (`make test_integrations`) and the nightlies. |
|
|
|
3. Check out a new branch and prepare the release: |
|
|
|
- Copy `CHANGELOG_PENDING.md` to top of `CHANGELOG.md` |
|
|
|
- Run `python ./scripts/linkify_changelog.py CHANGELOG.md` to add links for all issues |
|
|
|
- Run `bash ./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>` |
|
|
|
- Reset the `CHANGELOG_PENDING.md` |
|
|
|
- Bump the TMDefaultVersion in `version.go` |
|
|
|
- Bump the ABCI version number, if necessary. |
|
|
|
(Note that ABCI follows semver, and that ABCI versions are the only versions |
|
|
|
which can change during minor releases, and only field additions are valid minor changes.) |
|
|
|
4. Open a PR with these changes that will land them back on `v0.35.x` |
|
|
|
5. Once this change has landed on the backport branch, make sure to pull it locally, then push a tag. |
|
|
|
- `git tag -a v0.35.1 -m 'Release v0.35.1'` |
|
|
|
- `git push origin v0.35.1` |
|
|
|
6. Create a pull request back to master with the CHANGELOG & version changes from the latest release. |
|
|
|
- Remove all `R:minor` labels from the pull requests that were included in the release. |
|
|
|
- Do not merge the backport branch into master. |