http_archive、git_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 抖动而非单纯带宽用尽。
bzlmod 下 MODULE.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 保留天数 |
可执行示例(按环境改写路径与令牌):
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-minutes、max-parallel |
解析 Job 单独 20–40 分钟预算 |
Shell 层可对 bazel fetch @//... 或 bazel build //... 外包2s / 4s / 8s三次指数退避;仅对 fetch 步骤重试,避免整流水线重复链接。
与 Git 部分克隆并行的目录与 IO 配额 FAQ
问:主仓库 git clone --depth 1 会影响 Bazel 外源吗? 一般不会:外源落在 output_base/external 与 repository_cache。但若 Starlark 或规则在配置阶段调用 git 读取提交历史,浅克隆会失败——应改为固定 tag/commit 的 http_archive或完整子模块初始化。
问:多 Job 同机并行要注意什么? 避免共用同一默认 output_user_root;repository_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 数 |
就近节点或区内镜像 + 加长超时 |
外源稳、缓存准,再谈并行与发布频率
MacPull 提供 Apple Silicon 远程 Mac,适合与本地同构的 Bazel iOS/macOS 构建;定价、购买与帮助中心均可免登录浏览。更多网络与镜像主题见 跨境 Git/npm/Homebrew CI 优化 与 技术博客列表。