blob: 3a05e3cb20566bc4d5ea5835a40e7a72aa05c5a2 [file] [log] [blame] [view] [edit]
Project: /_project.yaml
Book: /_book.yaml
# Release Model
{% dynamic setvar source_file "site/en/release/index.md" %}
{% include "_buttons.html" %}
As announced in [the original blog
post](https://blog.bazel.build/2020/11/10/long-term-support-release.html), Bazel
4.0 and higher versions provides support for two release tracks: rolling
releases and long term support (LTS) releases. This page covers the latest
information about Bazel's release model.
## Support matrix {:#support-matrix}
| LTS release | Support stage | Latest version | End of support |
| ----------- | ------------- | -------------- | -------------- |
| Bazel 9 | Rolling| [Check rolling release page](/release/rolling) | N/A |
| Bazel 8 | Active| [8.3.1](https://github.com/bazelbuild/bazel/releases/tag/8.3.1){: .external} | December 2027 |
| Bazel 7 | Maintenance| [7.6.1](https://github.com/bazelbuild/bazel/releases/tag/7.6.1){: .external} | Dec 2026 |
| Bazel 6 | Maintenance | [6.5.0](https://github.com/bazelbuild/bazel/releases/tag/6.5.0){: .external} | Dec 2025 |
| Bazel 5 | Deprecated | [5.4.1](https://github.com/bazelbuild/bazel/releases/tag/5.4.1){: .external} | Jan 2025 |
| Bazel 4 | Deprecated | [4.2.4](https://github.com/bazelbuild/bazel/releases/tag/4.2.4){: .external} | Jan 2024 |
All Bazel LTS releases can be found on the [release
page](https://github.com/bazelbuild/bazel/releases){: .external} on GitHub.
Note: Bazel version older than Bazel 5 are no longer supported, Bazel users are
recommended to upgrade to the latest LTS release or use rolling releases if you
want to keep up with the latest changes at HEAD.
## Release versioning {:#bazel-versioning}
Bazel uses a _major.minor.patch_ [Semantic
Versioning](https://semver.org/){: .external} scheme.
* A _major release_ contains features that are not backward compatible with
the previous release. Each major Bazel version is an LTS release.
* A _minor release_ contains backward-compatible bug fixes and features
back-ported from the main branch.
* A _patch release_ contains critical bug fixes.
Additionally, pre-release versions are indicated by appending a hyphen and a
date suffix to the next major version number.
For example, a new release of each type would result in these version numbers:
* Major: 6.0.0
* Minor: 6.1.0
* Patch: 6.1.2
* Pre-release: 7.0.0-pre.20230502.1
## Support stages {:#support-stages}
For each major Bazel version, there are four support stages:
* **Rolling**: This major version is still in pre-release, the Bazel team
publishes rolling releases from HEAD.
* **Active**: This major version is the current active LTS release. The Bazel
team backports important features and bug fixes into its minor releases.
* **Maintenance**: This major version is an old LTS release in maintenance
mode. The Bazel team only promises to backport critical bug fixes for
security issues and OS-compatibility issues into this LTS release.
* **Deprecated**: The Bazel team no longer provides support for this major
version, all users should migrate to newer Bazel LTS releases.
## Release cadence {:#release-cadence}
Bazel regularly publish releases for two release tracks.
### Rolling releases {:#rolling-releases}
* Rolling releases are coordinated with Google Blaze release and are released
from HEAD around every two weeks. It is a preview of the next Bazel LTS
release.
* Rolling releases can ship incompatible changes. Incompatible flags are
recommended for major breaking changes, rolling out incompatible changes
should follow our [backward compatibility
policy](/release/backward-compatibility).
### LTS releases {:#lts-releases}
* _Major release_: A new LTS release is expected to be cut from HEAD roughly
every
12 months. Once a new LTS release is out, it immediately enters the Active
stage, and the previous LTS release enters the Maintenance stage.
* _Minor release_: New minor verions on the Active LTS track are expected to
be released once every 2 months.
* _Patch release_: New patch versions for LTS releases in Active and
Maintenance stages are expected to be released on demand for critical bug
fixes.
* A Bazel LTS release enters the Deprecated stage after being in ​​the
Maintenance stage for 2 years.
For planned releases, please check our [release
issues](https://github.com/bazelbuild/bazel/issues?q=is%3Aopen+is%3Aissue+label%3Arelease){: .external}
on Github.
## Release procedure & policies {:#release-procedure-policies}
For rolling releases, the process is straightforward: about every two weeks, a
new release is created, aligning with the same baseline as the Google internal
Blaze release. Due to the rapid release schedule, we don't backport any changes
to rolling releases.
For LTS releases, the procedure and policies below are followed:
1. Determine a baseline commit for the release.
* For a new major LTS release, the baseline commit is the HEAD of the main
branch.
* For a minor or patch release, the baseline commit is the HEAD of the
current latest version of the same LTS release.
1. Create a release branch in the name of `release-<version>` from the baseline
commit.
1. Backport changes via PRs to the release branch.
* The community can suggest certain commits to be back-ported by replying
"`@bazel-io flag`" on relevant GitHub issues or PRs to mark them as potential
release blockers, the Bazel team triages them and decide whether to
back-port the commits.
* Only backward-compatible commits on the main branch can be back-ported,
additional minor changes to resolve merge conflicts are acceptable.
1. Backport changes using Cherry-Pick Request Issue for Bazel maintainers.
* Bazel maintainers can request to cherry-pick specific commit(s)
to a release branch. This process is initiated by creating a
cherry-pick request on GitHub. Here's how to do it.
1. Open the [cherry-pick request](https://github.com/bazelbuild/bazel/issues/new?assignees=&labels=&projects=&template=cherry_pick_request.yml){: .external}
2. Fill in the request details
* Title: Provide a concise and descriptive title for the request.
* Commit ID(s): Enter the ID(s) of the commit(s) you want to
cherry-pick. If there are multiple commits, then separate
them with commas.
* Category: Specify the category of the request.
* Reviewer(s): For multiple reviewers, separate their GitHub
ID's with commas.
3. Set the milestone
* Find the "Milestone" section and click the setting.
* Select the appropriate X.Y.Z release blockers. This action
triggers the cherry-pick bot to process your request
for the "release-X.Y.Z" branch.
4. Submit the Issue
* Once all details are filled in and the miestone is set,
submit the issue.
* The cherry-pick bot will process the request and notify
if the commit(s) are eligible for cherry-picking. If
the commits are cherry-pickable, which means there's no
merge conflict while cherry-picking the commit, then
the bot will create a new pull request. When the pull
request is approved by a member of the Bazel team, the
commits are cherry-picked and merged to the release branch.
For a visual example of a completed cherry-pick request,
refer to this
[example](https://github.com/bazelbuild/bazel/issues/20230){: .external}
.
1. Identify release blockers and fix issues found on the release branch.
* The release branch is tested with the same test suite in
[postsubmit](https://buildkite.com/bazel/bazel-bazel){: .external} and
[downstream test pipeline]
(https://buildkite.com/bazel/bazel-at-head-plus-downstream){: .external}
on Bazel CI. The Bazel team monitors testing results of the release
branch and fixes any regressions found.
1. Create a new release candidate from the release branch when all known
release blockers are resolved.
* The release candidate is announced on
[bazel-discuss](https://groups.google.com/g/bazel-discuss){: .external},
the Bazel team monitors community bug reports for the candidate.
* If new release blockers are identified, go back to the last step and
create a new release candidate after resolving all the issues.
* New features are not allowed to be added to the release branch after the
first release candidate is created; cherry-picks are limited to critical
fixes only. If a cherry-pick is needed, the requester must answer the
following questions: Why is this change critical, and what benefits does
it provide? What is the likelihood of this change introducing a
regression?
1. Push the release candidate as the official release if no further release
blockers are found
* For patch releases, push the release at least two business days after
the last release candidate is out.
* For major and minor releases, push the release two business days after
the last release candidate is out, but not earlier than one week after
the first release candidate is out.
* The release is only pushed on a day where the next day is a business
day.
* The release is announced on
[bazel-discuss](https://groups.google.com/g/bazel-discuss){: .external},
the Bazel team monitors and addresses community bug reports for the new
release.
## Report regressions {:#report-regressions}
If a user finds a regression in a new Bazel release, release candidate or even
Bazel at HEAD, please file a bug on
[GitHub](https://github.com/bazelbuild/bazel/issues){: .external}. You can use
Bazelisk to bisect the culprit commit and include this information in the bug
report.
For example, if your build succeeds with Bazel 6.1.0 but fails with the second
release candidate of 6.2.0, you can do bisect via
```bash
bazelisk --bisect=6.1.0..release-6.2.0rc2 build //foo:bar
```
You can set `BAZELISK_SHUTDOWN` or `BAZELISK_CLEAN` environment variable to run
corresponding bazel commands to reset the build state if it's needed to
reproduce the issue. For more details, check out documentation about Bazelisk
[bisect feature] (https://github.com/bazelbuild/bazelisk#--bisect){: .external}.
Remember to upgrade Bazelisk to the latest version to use the bisect
feature.
## Rule compatibility {:#rule-compatibility}
If you are a rule authors and want to maintain compatibility with different
Bazel versions, please check out the [Rule
Compatibility](/release/rule-compatibility) page.