# Bazel: what changed from 8 to 9 - Product: Bazel (https://whatsnew.fyi/product/bazel) - Vendor: Google - Range: changelog entries numbered after 8.8.0 up to and including 9.2.0, stable releases only - Entries below: 3 releases (newest first) - Resolved: 8 is 8.8.0 and 9 is 9.2.0, the newest stable release of each major we track - Carrying security changes: 0 · CVEs mentioned: 0 · Mentioning breaking changes: 2 · Removing or deprecating something: 0 - Page: https://whatsnew.fyi/product/bazel/compare/8...9 What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. ## What changed (40 changes, grouped by kind) ### Added #### 9.2.0 (2026-07-13) - The new `refines_constraint_value` attribute on `constraint_setting` can be used to indicate that any non-default value for that setting specified on a `platform` requires the refined value to also be specified - The `and_then` method on `transition`s can be used to compose transitions, supporting both Starlark transitions and native transitions - Added SOCKS proxy support for `socks://`, `socks4://`, and `socks5://` URLs in `HTTPS_PROXY`/`HTTP_PROXY` environment variables and related system properties - Added the `strip_components` attribute to `extract`/`download_and_extract`/`http_archive` to allow stripping of path components when extracting files - Added the `module_ctx.tag_sort_key(tag)` method, which returns an opaque object for the given tag that can be compared to derive the order in which tags from different classes appear in the MODULE.bazel file - `module_extension(...)` now accepts a `facts_version` integer parameter to invalidate persisted facts and allow breaking changes to the facts schema #### 9.1.0 (2026-04-20) - Reporting of cached test results can now be suppressed with --test_summary=short_uncached or --test_summary=detailed_uncached - package_group now supports labels with external repositories in the packages attribute - Bazel now has experimental support for --rewind_lost_inputs, which can rerun actions within a single build to recover from remote or disk cache evictions - Added --experimental_remote_cache_chunking flag to read and write large blobs to/from the remote cache in chunks ### Changed #### 9.2.0 (2026-07-13) - `exec_properties` now respects `resources:cpu` and `resources:memory` for local resource estimation - Source directories in external repositories are temporarily allowed to cross package boundaries, gated by the new `--incompatible_check_external_repo_source_dir_package_boundary` flag - External repos are no longer refetched whenever they contribute inputs to an action using the hermetic Linux sandbox - The remote repo contents cache now correctly materializes chains of symlinks as action inputs, but no longer supports symlinks into the main repository - The remote repo contents cache no longer caches or restores repos with cross-repo symlinks to avoid a large surface area for bugs - Enable TCP keepalive by default for gRPC connections with reasonable defaults - CDC chunk uploads and downloads can now happen in parallel within a large blob - Bazel no longer limits the size of gRPC messages received from the remote executor or cache #### 9.1.1 (2026-06-03) - Support bounded parallel chunk transfers #### 9.1.0 (2026-04-20) - The --downloader_config flag can now be specified multiple times to use several downloader config files at once - The compatibility_level and max_compatibility_level attributes of module in MODULE.bazel are now no-ops - The local and remote repo contents cache now include the host OS and CPU architecture in the cache key - The remote repo contents cache now supports all reproducible repo rules ### Fixed #### 9.2.0 (2026-07-13) - Bazel no longer crashes when a `label_list_dict` attribute is used in a split transition - Fixed spurious "No such file" errors with the remote repo contents cache when a repo contains a symlink to a `.bzl` file - Modifying environment variables no longer causes spurious reloading of packages in external repositories - Fixed a performance regression in Bazel 9 that causes `RepoMappingManifest` actions to consume a lot of CPU time - Fixed repo content caching for non-gRPC cache backends - Fixed a crash with `--experimental_remote_repo_contents_cache` when running without a remote or disk cache #### 9.1.1 (2026-06-03) - Reverted --downloader_config from being a repeatable flag to restore backward compatibility - Fixed a crash with file:// URIs - Fixed a crash with opaque URIs - Fixed an issue that caused Bazel to fail on a lost input even with build or action rewinding enabled - Fixed crash on --remote_default_exec_properties with the same key - Verify the whole blob when downloading chunks - Fixed JVM crash from VerifyException in GrpcCacheClient.onNext() - Invalidate unresolved symlink info after deletion in the RAFS #### 9.1.0 (2026-04-20) - Fix launcher/launcher_maker for cross build, for example build windows binary on linux machine - rctx.symlink now implicitly watches the target if it falls back to a copy - string.splitlines() no longer incorrectly treats u+0085 (NEL) as a newline character ## Release notes ### 9.2.0 - Date: 2026-07-13 - Version: 9.2.0 - Original notes: https://github.com/bazelbuild/bazel/releases/tag/9.2.0 - Permalink: https://whatsnew.fyi/product/bazel/releases/9.2.0 - **added** — The new `refines_constraint_value` attribute on `constraint_setting` can be used to indicate that any non-default value for that setting specified on a `platform` requires the refined value to also be specified - **fixed** — Bazel no longer crashes when a `label_list_dict` attribute is used in a split transition - **changed** — `exec_properties` now respects `resources:cpu` and `resources:memory` for local resource estimation - **added** — The `and_then` method on `transition`s can be used to compose transitions, supporting both Starlark transitions and native transitions - **changed** — Source directories in external repositories are temporarily allowed to cross package boundaries, gated by the new `--incompatible_check_external_repo_source_dir_package_boundary` flag - **added** — Added SOCKS proxy support for `socks://`, `socks4://`, and `socks5://` URLs in `HTTPS_PROXY`/`HTTP_PROXY` environment variables and related system properties - **added** — Added the `strip_components` attribute to `extract`/`download_and_extract`/`http_archive` to allow stripping of path components when extracting files - **added** — Added the `module_ctx.tag_sort_key(tag)` method, which returns an opaque object for the given tag that can be compared to derive the order in which tags from different classes appear in the MODULE.bazel file - **added** — `module_extension(...)` now accepts a `facts_version` integer parameter to invalidate persisted facts and allow breaking changes to the facts schema - **changed** — External repos are no longer refetched whenever they contribute inputs to an action using the hermetic Linux sandbox - **changed** — The remote repo contents cache now correctly materializes chains of symlinks as action inputs, but no longer supports symlinks into the main repository - **fixed** — Fixed spurious "No such file" errors with the remote repo contents cache when a repo contains a symlink to a `.bzl` file - **changed** — The remote repo contents cache no longer caches or restores repos with cross-repo symlinks to avoid a large surface area for bugs - **fixed** — Modifying environment variables no longer causes spurious reloading of packages in external repositories - **fixed** — Fixed a performance regression in Bazel 9 that causes `RepoMappingManifest` actions to consume a lot of CPU time - **changed** — Enable TCP keepalive by default for gRPC connections with reasonable defaults - **fixed** — Fixed repo content caching for non-gRPC cache backends - **changed** — CDC chunk uploads and downloads can now happen in parallel within a large blob - **changed** — Bazel no longer limits the size of gRPC messages received from the remote executor or cache - **fixed** — Fixed a crash with `--experimental_remote_repo_contents_cache` when running without a remote or disk cache > [!NOTE] > If you are looking for [rolling releases](https://bazel.build/release#rolling-releases), please visit [this page](https://bazel.build/release/rolling). #### Release 9.2.0 (2026-07-13) Bazel 9.2.0 is a minor LTS release. It is fully backward compatible with Bazel 9 releases starting from 9.0.1; see [Bazel 9.0.1 release notes](https://github.com/bazelbuild/bazel/releases/tag/9.0.1) for a note on backward compatibility. ##### Configurability * The new `refines_constraint_value` attribute on `constraint_setting` can be used to indicate that any non-default value for that setting specified on a `platform` requires the refined value to also be specified. ([#29727](https://github.com/bazelbuild/bazel/pull/29727)) * Bazel no longer crashes when a `label_list_dict` attribute is used in a split transition (#29830). ([#29856](https://github.com/bazelbuild/bazel/pull/29856)) * `exec_properties` now respects `resources:cpu` and `resources:memory` for local resource estimation. ([#29426](https://github.com/bazelbuild/bazel/pull/29426)) * The `and_then` method on `transition`s can be used to compose transitions. Both Starlark transitions and native transitions (e.g. `config.exec()`) are supported. ([#29888](https://github.com/bazelbuild/bazel/pull/29888)) ##### Core * Source directories in external repositories are temporarily allowed to cross package boundaries. This will be disallowed in the future, gated by the new `--incompatible_check_external_repo_source_dir_package_boundary` flag. ([#30040](https://github.com/bazelbuild/bazel/pull/30040)) ##### External Deps * Added SOCKS proxy support. Bazel now accepts `socks://`, `socks4://`, and `socks5://` URLs in `HTTPS_PROXY`/`HTTP_PROXY` environment variables and related system properties. ([#29364](https://github.com/bazelbuild/bazel/pull/29364)) * Adds the `strip_components` attribute to `extract`/`download_and_extract`/`http_archive` to allow stripping of path components when extracting files. ([#29369](https://github.com/bazelbuild/bazel/pull/29369)) * Added the `module_ctx.tag_sort_key(tag)` method, which returns an opaque object for the given tag that can be compared to derive the order in which tags from different classes appear in the MODULE.bazel file. ([#29484](https://github.com/bazelbuild/bazel/pull/29484)) * `module_extension(...)` now accepts a `facts_version` integer parameter. Bumping it invalidates the facts persisted in `MODULE.bazel.lock` for that extension, allowing extension authors to make breaking changes to the facts schema without risking misinterpretation by older code paths. ([#29871](https://github.com/bazelbuild/bazel/pull/29871)) * External repos are no longer refetched whenever they contribute inputs to an action using the hermetic Linux sandbox. ([#29889](https://github.com/bazelbuild/bazel/pull/29889)) * The remote repo contents cache now correctly materializes chains of symlinks as action inputs, but no longer supports symlinks into the main repository. ([#29959](https://github.com/bazelbuild/bazel/pull/29959)) * Fixed spurious "No such file" errors with the remote repo contents cache when a repo contains a symlink to a `.bzl` file. ([#30037](https://github.com/bazelbuild/bazel/pull/30037)) * The remote repo contents cache no longer caches or restores repos with cross-repo symlinks, thus avoiding a large surface area for bugs. The effort to reenable this support is tracked by [#30160](https://github.com/bazelbuild/bazel/issues/30160). ([#30190](https://github.com/bazelbuild/bazel/pull/30190)) * Modifying environment variables no longer causes spurious reloading of packages in external repositories. ([#30194](https://github.com/bazelbuild/bazel/pull/30194)) ##### Performance * Fixed a performance regression in Bazel 9 that causes `RepoMappingManifest` actions to consume a lot of CPU time. ([#29807](https://github.com/bazelbuild/bazel/pull/29807)) ##### Remote Execution _[Truncated at 4000 characters — full notes: https://github.com/bazelbuild/bazel/releases/tag/9.2.0]_ ### 9.1.1 - Date: 2026-06-03 - Version: 9.1.1 - Original notes: https://github.com/bazelbuild/bazel/releases/tag/9.1.1 - Permalink: https://whatsnew.fyi/product/bazel/releases/9.1.1 - **fixed** — Reverted --downloader_config from being a repeatable flag to restore backward compatibility - **fixed** — Fixed a crash with file:// URIs - **fixed** — Fixed a crash with opaque URIs - **fixed** — Fixed an issue that caused Bazel to fail on a lost input even with build or action rewinding enabled - **fixed** — Fixed crash on --remote_default_exec_properties with the same key - **fixed** — Verify the whole blob when downloading chunks - **fixed** — Fixed JVM crash from VerifyException in GrpcCacheClient.onNext() - **fixed** — Invalidate unresolved symlink info after deletion in the RAFS - **changed** — Support bounded parallel chunk transfers > [!NOTE] > If you are looking for [rolling releases](https://bazel.build/release#rolling-releases), please visit [this page](https://bazel.build/release/rolling). #### Release 9.1.1 (2026-06-03) Bazel 9.1.1 is a patch LTS release. With the exception of `CcInfo` (see below), it is backward compatible with Bazel 9.0. ##### IMPORTANT Compatibility Note: **CcInfo** removal and **rules\_go** If you encounter the error "`The CcInfo symbol has been removed`", this is due to an intentional change in Bazel 9 regarding C++ Starlarkification. While this change was present in 9.0.0, a bug fixed in 9.0.1 ([\#28360](https://github.com/bazelbuild/bazel/pull/28360)) now correctly surfaces this error instead of failing silently or with a confusing message. To fix this, please upgrade rules\_go, rules\_nodejs or any broken rulesets. For example, ``` #### Add repo_name = None if you don't directly depend on them. bazel_dep(name = "rules_go", version = "0.59.0") bazel_dep(name = "rules_nodejs", version = "6.7.3") ``` ##### External Deps * `--downloader_config` was accidentally made a repeatable flag in 9.1.0, which was a backwards-incompatible change. This has been reverted in 9.1.1. ([#29616](https://github.com/bazelbuild/bazel/pull/29616)) * Fixed a crash with `file://` URIs. ([#29579](https://github.com/bazelbuild/bazel/pull/29579)) * Fixed a crash with opaque URIs. ([#29658](https://github.com/bazelbuild/bazel/pull/29658)) ##### Remote Execution * Fixed an issue that caused Bazel to fail on a lost input even with build or action rewinding enabled. ([#29677](https://github.com/bazelbuild/bazel/pull/29677)) * Fix crash on `--remote_default_exec_properties` with the same key. ([#29596](https://github.com/bazelbuild/bazel/pull/29596)) * Verify the whole blob when downloading chunks ([#29593](https://github.com/bazelbuild/bazel/pull/29593)) * Support bounded parallel chunk transfers ([#29614](https://github.com/bazelbuild/bazel/pull/29614)) * Fix JVM crash from VerifyException in GrpcCacheClient.onNext() ([#29583](https://github.com/bazelbuild/bazel/pull/29583)) * Invalidate unresolved symlink info after deletion in the RAFS ([#29671](https://github.com/bazelbuild/bazel/pull/29671)) ##### Acknowledgments This release contains contributions from many people at Google, as well as Armando Montanez, ashutosh0x, Boleyn Su, Fabian Meumertzheim, H5-O5, Joseph Gette, Keith Smiley, Paul Tarjan, Ted Kaplan, Tyler French, and Will Stranton. _Notice_: Bazel installers contain binaries licensed under the GPLv2 with Classpath exception. Those installers should always be redistributed along with the source code. Some versions of Bazel contain a bundled version of OpenJDK. The license of the bundled OpenJDK and other open-source components can be displayed by running the command `bazel license`. The vendor and version information of the bundled OpenJDK can be displayed by running the command `bazel info java-runtime`. The binaries and source-code of the bundled OpenJDK can be [downloaded from our mirror server](https://mirror.bazel.build/openjdk/index.html). _Security_: All our binaries are signed with our [public key](https://releases.bazel.build/bazel-release.pub.gpg) 3D5919B448457EE0. ### 9.1.0 - Date: 2026-04-20 - Version: 9.1.0 - Original notes: https://github.com/bazelbuild/bazel/releases/tag/9.1.0 - Permalink: https://whatsnew.fyi/product/bazel/releases/9.1.0 - **added** — Reporting of cached test results can now be suppressed with --test_summary=short_uncached or --test_summary=detailed_uncached - **added** — package_group now supports labels with external repositories in the packages attribute - **added** — Bazel now has experimental support for --rewind_lost_inputs, which can rerun actions within a single build to recover from remote or disk cache evictions - **added** — Added --experimental_remote_cache_chunking flag to read and write large blobs to/from the remote cache in chunks - **changed** — The --downloader_config flag can now be specified multiple times to use several downloader config files at once - **changed** — The compatibility_level and max_compatibility_level attributes of module in MODULE.bazel are now no-ops - **changed** — The local and remote repo contents cache now include the host OS and CPU architecture in the cache key - **changed** — The remote repo contents cache now supports all reproducible repo rules - **fixed** — Fix launcher/launcher_maker for cross build, for example build windows binary on linux machine - **fixed** — rctx.symlink now implicitly watches the target if it falls back to a copy - **fixed** — string.splitlines() no longer incorrectly treats u+0085 (NEL) as a newline character > [!NOTE] > If you are looking for [rolling releases](https://bazel.build/release#rolling-releases), please visit [this page](https://bazel.build/release/rolling). #### Release 9.1.0 (2026-04-20) Bazel 9.1.0 is a minor LTS release. With two exceptions (see below: `CcInfo` and `--downloader_config`), it is backward compatible with Bazel 9.0 and contains selected changes by the Bazel community and Google engineers. ##### IMPORTANT Compatibility Note: **CcInfo** removal and **rules\_go** If you encounter the error "`The CcInfo symbol has been removed`", this is due to an intentional change in Bazel 9 regarding C++ Starlarkification. While this change was present in 9.0.0, a bug fixed in 9.0.1 ([\#28360](https://github.com/bazelbuild/bazel/pull/28360)) now correctly surfaces this error instead of failing silently or with a confusing message. To fix this, please upgrade rules\_go, rules\_nodejs or any broken rulesets. For example, ``` #### Add repo_name = None if you don't directly depend on them. bazel_dep(name = "rules_go", version = "0.59.0") bazel_dep(name = "rules_nodejs", version = "6.7.3") ``` ##### CLI * Reporting of cached test results can now be suppressed with `--test_summary=short_uncached` or `--test_summary=detailed_uncached`. ([#29263](https://github.com/bazelbuild/bazel/pull/29263)) ##### Configurability * Fix launcher/launcher_maker for cross build, e.g. build windows binary on linux machine. ([#29239](https://github.com/bazelbuild/bazel/pull/29239)) ##### External Deps * The `--downloader_config` flag can now be specified multiple times to use several downloader config files at once. Note that this is technically a breaking change, and will be reverted in future 9.x releases, starting from 9.1.1. Bazel 10.x will again contain this incompatible change. * The `compatibility_level` and `max_compatibility_level` attributes of `module` in MODULE.bazel are now no-ops. Module maintainers should stop specifying those attributes and provide clear build time error messages and actionable migration paths when making major breaking changes. ([#28616](https://github.com/bazelbuild/bazel/pull/28616)) * `package_group` now supports labels with external repositories in the `packages` attribute. ([#28893](https://github.com/bazelbuild/bazel/pull/28893)) * `rctx.symlink` now implicitly watches the target if it falls back to a copy. ([#28741](https://github.com/bazelbuild/bazel/pull/28741)) * The local and remote repo contents cache now include the host OS and CPU architecture in the cache key. ([#29195](https://github.com/bazelbuild/bazel/pull/29195)) * The remote repo contents cache now supports all reproducible repo rules. ([#29225](https://github.com/bazelbuild/bazel/pull/29225)) ##### Remote Execution * Bazel now has experimental support for `--rewind_lost_inputs`, which can rerun actions within a single build to recover from (remote or disk) cache evictions. ([#28958](https://github.com/bazelbuild/bazel/pull/28958)) * Added `--experimental_remote_cache_chunking` flag to read and write large blobs to/from the remote cache in chunks. Requires server support. ([#28903](https://github.com/bazelbuild/bazel/pull/28903)) ##### Starlark / Build Language * `string.splitlines()` no longer incorrectly treats u+0085 (`NEL`) as a newline character ([#28931](https://github.com/bazelbuild/bazel/pull/28931)) ##### Acknowledgments This release contains contributions from many people at Google, as well as Armando Montanez, ashutosh0x, Boleyn Su, Fabian Meumertzheim, H5-O5, Joseph Gette, Keith Smiley, Paul Tarjan, Ted Kaplan, Tyler French, and Will Stranton. _Notice_: Bazel installers contain binaries licensed under the GPLv2 with Classpath exception. Those installers should always be redistributed along with the source code. Some versions of Bazel contain a bundled version of OpenJDK. The license of the bundled OpenJDK and other open-source components can be dis _[Truncated at 4000 characters — full notes: https://github.com/bazelbuild/bazel/releases/tag/9.1.0]_