首页/开发/CI/CD 与发布速查/Bazel 远程缓存与远程执行
构建与制品管理58 条

Bazel 远程缓存与远程执行

把动作结果缓存到共享后端(--remote_cache),团队与 CI 复用构建结果;大规模场景可接远程执行分摊负载。

CI/CD 与发布速查开发更新于 2026-10-13

远程缓存是什么

Bazel 按内容哈希为每个构建动作(action)建键:命令、环境与声明输入不变,输出就一致,可以跨机器复用。远程缓存把这份「动作结果库」放到共享后端(--remote_cache):任何人或 CI 算过一次,全团队不再重算;远程执行(--remote_executor)进一步把动作分发到远端集群运行。两者常叠加使用,接口都是 gRPC 的 Remote Execution API(REAPI),常见实现有 Google RBE、bazel-remote、Buildbarn 等。

基本信息

适用平台Bazel / Bazelisk 项目,Linux 与 macOS 的本地机与 CI 构建机
缓存键动作输入的内容哈希:命令行、环境变量、声明输入的文件内容
常用参数--remote_cache=grpcs://...、--remote_executor=...、--disk_cache=路径
认证方式--remote_header=Authorization=... 或后端凭据配置
生效前提动作封闭可复现:不读网络、不读时钟、输入输出声明准确

典型使用场景

  • 本地与 CI 共享结果:本地编译过的目标,CI 上直接命中,反馈时间明显缩短
  • 大型仓库增量构建:绝大多数动作命中缓存,构建从小时级降到分钟级
  • 分支频繁切换的验证流水线:同一提交被多套流水线重复构建时只真正算一次
  • 本机资源不足:用远程执行把编译动作分摊到远端集群
  • 内网合规要求:自建缓存后端,在控制产物出网范围的前提下提速

常用参数

常用参数
bazel build //app:server --remote_cache=grpcs://cache.example.com  # 指定共享缓存后端
bazel build //app:server --remote_cache=grpcs://cache.example.com --remote_upload_local_results=true  # 本地结果回传供他人命中
bazel build //app:server --disk_cache=$HOME/.cache/bazel-disk  # 断网或后端故障时本地磁盘缓存兜底
bazel clean && bazel build //app:server --remote_cache=grpcs://cache.example.com  # 清理后重编,观察输出 cache hit 行验证后端

缓存类型对照

类型命中条件典型实现
远程缓存动作输入哈希与后端记录一致REAPI 服务:RBE、bazel-remote、Buildbarn
远程执行动作分发到远端集群执行并按同一套键缓存各 REAPI 执行集群
磁盘缓存本机历史构建复用,不跨机共享--disk_cache 指定的本地目录
缓存命中率是核心指标:命中偏低先检查动作是否封闭(读了网络、时钟或未声明的文件),再考虑扩容机器。
缓存后端必须配置容量与驱逐策略;仓库涉密时先评估哪些动作结果允许出网,必要时只保留内网后端。

易错点

  • 动作有隐式输入(访问网络、读取时间、未声明环境变量):错误结果经缓存扩散到所有机器,先修封闭性再追命中率
  • 缓存后端不设容量与驱逐:磁盘无限膨胀,最终整个缓存服务不可用
  • 只读缓存不开上传(--remote_upload_local_results):本地结果不进共享库,团队命中率永远上不去
  • 以为开了缓存一定变快:命中率低时每次动作多付一次网络 RPC,应先用命中率数据验证收益

数据来源与参考

  • Bazel 文档《Remote caching》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌