写给在远程 Mac上跑 Bazel 流水线的团队:要把跨境拉外源(registry、http_archivegit_repository)与动作缓存一次设计清楚,需要同时看WORKSPACE/MODULE 解析阶段的网络形态编译写盘阶段的 IO。入口:MacPull 首页技术博客列表;同栈延伸阅读 Git 与 Docker 跨境拉取优化Gradle/Maven 缓存与并行矩阵

Bazel 外源与 registry 在远程 Mac 上的瓶颈画像

解析阶段往往在数秒到数分钟内打出大量小体积 HTTPS 请求(Bazel Central Registry、自定义 registry、发行版元数据),随后才是 tarball / Git 对象的突发下载。远程 Mac 作为 CI 节点时,瓶颈通常不是「单文件不够快」,而是RTT 叠加、代理并发连接上限、以及与编译并行时的磁盘队列:同一时刻既有 repository_cache 写入,又有动作输出与沙箱临时文件,APFS 上表现为latency 抖动而非单纯带宽用尽。

bzlmodMODULE.bazel 与 registry 解析链更长;老仓库仍以 WORKSPACE 为主时,http_archive 的 checksum 与镜像切换也集中在解析期。把「解析」与「编译」拆成独立 CI Job或至少串行阶段,能显著降低「外源超时」被误判为 flaky 的概率。

阶段 主要 IO / 网络特征 远程 Mac 上常见表象
加载与解析 大量小请求、registry 查询 跨境 RTT 高时 wall time 线性变差
外源下载 tarball / Git packfile 出口带宽与代理超时并存
动作执行 沙箱读写、头文件与中间产物 与下载并行时磁盘队列饱和

本地 disk cache vs 远程 cache 选型阈值表

--disk_cache 缓存动作输出,适合单节点重复构建--remote_cache(HTTP(S)/gRPC)在多台 Runner之间复用命中,适合共享远程 Mac 池--repository_cache 则专门承接外源制品下载,应与二者一起规划路径与清理策略,不要与系统临时目录混用。

条件 disk_cache remote_cache 备注
单台专用 Runner、磁盘 > 200G 可用 优先开启 可选(加速冷机) 路径放 SSD,定期按水位清理
多台 Mac 共享构建、分支多 每台仍建议有 强烈建议 注意缓存命名空间与权限头
合规:二进制不得出区 区内路径 仅自建区内端点 禁用公共 SaaS 或加脱敏策略
磁盘紧张、inode 告警 慎堆大 disk_cache 以 remote 为主 收紧 repository_cache 保留天数

可执行示例(按环境改写路径与令牌):

# .bazelrc 片段 — CI 共享 Mac 池 build --disk_cache=/var/bazel-disk-cache build --repository_cache=/var/bazel-repo-cache build --remote_cache=grpcs://cache.internal.example:9090 build --remote_header=authorization=Bearer ${BAZEL_REMOTE_TOKEN} # 纯 remote_cache 无需 remote_download_*;若叠加远程执行(RBE)再按需加 --remote_download_minimal 等

WORKSPACE / MODULE 拉取失败重试与超时参数清单

弱网下优先限并发加长超时,否则多 Job 同时重试会放大重试风暴。下列标志为常见可调项(具体名称以你安装的 Bazel 大版本为准,可用 bazel help build 检索确认)。

目的 标志 / 环境思路 CI 起步建议
外源 HTTP 重试次数 --experimental_repository_downloader_retries 5→10
远程缓存 RPC 超时 --remote_timeout 60s–300s
远程缓存失败重试 --remote_retries 2–5
固定下载与输出根 --repository_cache + 独立 --output_user_root 每流水线子目录
编排层 GitHub Actions timeout-minutesmax-parallel 解析 Job 单独 20–40 分钟预算

Shell 层可对 bazel fetch @//...bazel build //... 外包2s / 4s / 8s三次指数退避;仅对 fetch 步骤重试,避免整流水线重复链接。

与 Git 部分克隆并行的目录与 IO 配额 FAQ

问:主仓库 git clone --depth 1 会影响 Bazel 外源吗? 一般不会:外源落在 output_base/externalrepository_cache。但若 Starlark 或规则在配置阶段调用 git 读取提交历史,浅克隆会失败——应改为固定 tag/commit 的 http_archive或完整子模块初始化。

问:多 Job 同机并行要注意什么? 避免共用同一默认 output_user_rootrepository_cache 可读共享、写入仍需考虑锁竞争,高峰可按 Job 分子目录再定期归并。监控inode、剩余空间、iostat,磁盘阈值策略见 构建池并发与磁盘 FAQ

问:bazel --jobs 与 Git 拉取同时进行? 错开峰值:先完成 clone/fetch submodule,再拉高 --jobs;否则 SSD 队列上与网络下载争抢,表现为随机超时。

远程 Mac 节点地域与并行编译对拉取稳定性的影响

节点离制品源与远程缓存入口越近,解析阶段的小请求越不容易被 RTT 拖垮;若合规要求数据留在境内,应把 remote_cache 与 registry 镜像一并放在可达区内,而不是只加速 Git。并行编译bazel build --jobs=N)会占用 CPU 与磁盘带宽,与「冷配置外源下载」叠加时,建议矩阵上限制 max-parallel,并为「仅 fetch / 分析」Job 单独设较低 --jobs。自托管 Runner 的标签与并发规划可参考 GitHub Actions 自托管 Runner 远程 Mac 指南

场景 并行策略 拉取侧动作
冷缓存、新分支 矩阵 max-parallel: 1–2 单独 fetch + repository_cache 预热
热缓存、主干合并 适度提高并行 依赖 remote_cache 命中,缩短外源命中
跨境长 RTT 限制 --jobs 与 Job 数 就近节点或区内镜像 + 加长超时

总结:2026 年在远程 Mac 上跑 Bazel 跨境 CI,先把 repository_cachedisk_cache / remote_cache输出根隔离写进流水线模板,再用编排并发 + Bazel 超时/重试 + Git 浅克隆协同压住 flaky。需要稳定 Apple Silicon 出口、SSH 文档与同构环境时,可免登录访问 首页套餐定价购买说明帮助中心,通过租用远程 Mac 把外源拉取与缓存治理从个人网络迁到可预期地域与磁盘的生产节点上。

Bazel / 远程 Mac CI

外源稳、缓存准,再谈并行与发布频率

MacPull 提供 Apple Silicon 远程 Mac,适合与本地同构的 Bazel iOS/macOS 构建;定价、购买与帮助中心均可免登录浏览。更多网络与镜像主题见 跨境 Git/npm/Homebrew CI 优化技术博客列表

多地域节点
SSH 就绪
弹性租期
7×24 支持