远程缓存是什么
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 指定的本地目录 |
缓存命中率是核心指标:命中偏低先检查动作是否封闭(读了网络、时钟或未声明的文件),再考虑扩容机器。
缓存后端必须配置容量与驱逐策略;仓库涉密时先评估哪些动作结果允许出网,必要时只保留内网后端。