工程规模与项目价值
千节点计算资源池
上千节点日常保障与集群开发优化,约 20,000 核 CPU、40 TB 内存、300 TB 存储,为高并发编译与测试提供共享基础设施。
95%+ 构建缓存命中
复用已完成 Action 的构建结果,减少重复编译;将必须执行的任务并行分配到集群,缩短多语言项目的构建与测试等待。
工作的核心是把高速构建转化为可持续的工程能力:维护大规模 Worker 资源池,围绕执行并发、输入准备、缓存与集群稳定性持续优化,让开发者和 CI 共享构建成果。
架构:缓存优先,未命中任务进入远端执行
按 Buildfarm 官方 Shard 架构归纳的逻辑图。AC 与 CAS 为服务职责,AC 数据及 CAS 位置索引由 Backplane 管理,CAS 内容由存储分片承载;图中不代表它们必须独立部署。个人集群规模与命中率来自项目实践。
- 先复用结果:Bazel 根据输入树、命令与环境等构造 Action 摘要;命中 AC 后取得 ActionResult,再从 CAS 获取需要的输出,跳过重复执行。
- 再调度执行:缓存未命中时,补齐 CAS 中缺失的输入并提交 Execute。Server 处理操作并组织执行队列,Worker 按平台条件获取匹配任务。
- 输出进入下一轮复用:Worker 拉取输入、运行编译或测试,上传输出;符合缓存条件的结果写入 AC,供后续构建复用。执行状态经服务端返回客户端。
源码参考:Codex 的确定性测试分片
Codex 开源仓库的 Windows Bazel CI 使用四个并行作业,将测试目标标签进行校验和取模,稳定分配到各分片。该逻辑发生在 CI 选择测试目标时;远端执行器随后再决定每个 Action 由哪个 Worker 执行。
对应公开源码 .github/workflows/bazel.yml。这里的哈希用于测试目标分组,不是 CAS 分片寻址,也不是将任务固定绑定到某台 Worker。
稳定且无需中心状态:每个 CI 作业可以独立算出同一目标的归属,新增目标不会使其他目标因列表顺序而整体迁移;改变分片总数则会重新映射。哈希均分目标不等于执行时间均衡,长耗时目标仍可能决定整轮完成时间。
目标内部:以 FNV-1a 对测试用例再次分片
配置有效分片参数且未传额外 libtest 参数时,启动器列出 Rust libtest 用例、排序并排除跳过项,对测试名的字节序列计算 32 位 FNV-1a,再对分片总数取模。当前进程仅运行与自身零起始分片编号相符的用例,并使用 --exact 精确选择。额外 libtest 参数会直接交给测试程序,保留调用者的过滤行为;未配置分片时执行全量用例,若配置跳过项则仍应用对应过滤。
对应 workspace_root_test_launcher.sh.tpl 与 Windows 启动器。图示适用于已配置分片且未传额外 libtest 参数的路径;额外参数直接转交,未配置分片则不做哈希分组。测试用例 FNV-1a、CI 目标 cksum、远端 Worker 调度分属三个不同层次。
同一技术体系,不同服务实现:该版本 Codex 的 Bazel 配置使用 BuildBuddy 远端缓存与执行服务。它与 Buildfarm 共享 Bazel / Remote Execution API 技术体系,此处作为分布式构建与测试设计的公开源码参考。
工程关注点:吞吐、复用与可定位性
- 缓存正确性:输入、工具链和执行环境共同决定 Action 身份。保持输入声明完整与环境可复现,才能使高命中率转化为可信的构建结果。
- 流水线资源平衡:输入拉取、执行与输出回传分别消耗网络、磁盘和 CPU。通过阶段并发与背压限制排队占用,避免仅增加执行槽位却放大 I/O 瓶颈。
- 两层并行:CI 层将测试目标拆成并行作业;远端执行层调度实际编译与测试 Action。两层共同缩短反馈链路,同时保留分片日志与执行状态以定位慢任务和失败。