http_archive、git_repository、Registry 與 Maven/Go 等外掛規則同時出站,RTT 與小包延遲會被放大;若再把錯誤的快取旗標混用,會出現「以為命中、其實仍在狂拉外站」的假像。本文用決策表拆開 --repository_cache、--disk_cache、--remote_cache 分工,附可執行 .bazelrc 片段、orchestrator 平行 job與 Git 淺克隆/partial clone協同注意點。可先讀MacPull 首頁了解節點地域,並用技術部落格列表串聯 Git/npm/Homebrew 鏡像 CI 優化、構建池併發與磁碟 FAQ、SSH 中繼與跨境效率對照你的網路路徑。
① Bazel 外源與 registry 在遠端 Mac 上的瓶頸畫像
先把時間軸切兩段:repository 解析/下載與action 執行。前者命中的是「外源工件」(壓縮包、git 樹、模組 metadata);後者才是編譯/連結產物。跨境時,前者的 TLS 握手、HTTP/2 多路復用與 DNS 解析往往吃掉大部分 wall time;共享一台遠端 Mac時,若多名使用者或矩陣 job 同時冷啟,還會疊加連線數、inode 與隨機寫入,使 repository_cache 目錄成為隱形熱點。
| 訊號 | 典型成因 | 優先排查(可執行) |
|---|---|---|
| loading 階段長、外站域名分散 | 未集中 repository_cache;或鏡像只配了一半(metadata 與 blob 主機不一致) | 加 --repository_cache 掛卷;用 bazel fetch //... 單獨預拉並打日誌 |
| 偶發 checksum/TLS 失敗 | 弱網、代理半套、企業根憑證未注入 JVM/Git | 統一 HTTPS_PROXY/NO_PROXY;Java 信任庫或 SSL_CERT_FILE;步驟級 2/4/8 秒退避重試 |
| 磁碟滿、iowait 飆 | output_base 與快取目錄同盤;多 job 並寫 | 分離掛卷:output_user_root/repository_cache/disk_cache;限 orchestrator max-parallel |
| bzlmod 解析抖動 | Registry 與 MODULE.bazel 版本解析跨區 | bazel sync --configure 單獨步驟;鎖定 Bazel 小版本與 MODULE.bazel.lock(若採用) |
② 本地 disk cache vs 遠端 remote cache 選型閾值表
實務上最常混淆的是:以為開了 --disk_cache 就能省掉外源流量——實際上應優先檢查是否已設 --repository_cache。--remote_cache 則服務「跨 runner 的 action 命中」,與「外源 tarball 是否下完」是不同維度。
| 旗標/能力 | 快取內容 | 適用閾值(決策) | 不適用場景 |
|---|---|---|---|
--repository_cache=… | WORKSPACE/MODULE 規則下載的外源工件 | 任何會反覆冷啟的 CI;單機多分支構建 | 不能替代鎖檔與固定 commit;仍需合規出站審計 |
--disk_cache=… | 本地 action 快取(建構中間產物鍵) | 單一遠端 Mac 長生命週期;想降本機重複編譯成本 | 預設不跨使用者/路徑搬遷即失效;與 ephemeral runner 搭配收益有限除非掛卷持久化 |
--remote_cache=grpc://… 或 HTTPS | 遠端 action 快取條目 | 多台 runner、矩陣 shard;團隊願意維護快取後端與 ACL | 弱網且無本地 disk 輔助時,可能反被 gRPC 延遲拖累(需觀測) |
remote_cache+disk_cache | 遠端為主、本機為輔(讀寫策略依版本與設定) | 共享 Mac 又想降遠端 QPS | 配額與清理策略要寫進 Runbook,避免快取汙染 |
# 專案或 CI 注入(路徑請換成掛卷)
build --repository_cache=/var/cache/bazel-repo
build --disk_cache=/var/cache/bazel-disk
# 遠端範例:bazel-remote、gRPC 後端(URL 與憑證依實際環境)
# build --remote_cache=grpcs://cache.internal.example.com
# build --remote_header=authorization="Bearer ${BAZEL_REMOTE_TOKEN}"
# 執行期併發(Apple Silicon 共享節點請勿盲目拉滿)
build --jobs=4
延伸:Git/npm 快取策略與 CI 加速可與本文併讀,對齊「倉庫目錄」與「Bazel 外源目錄」配額。
③ WORKSPACE/MODULE 拉取失敗重試與逾時參數清單
建議把「依賴下載」拆成獨立 CI 步驟:先 bazel fetch //... 或 bazel sync --configure,成功後再進主構建。步驟外層用 3~5 次重試、退避 2/4/8 秒;內層用 Bazel 旗標拉長 HTTP 相關逾時倍率。選項名稱可能隨 Bazel 小版本調整,上線前請以 bazel help build 與實際版本釋出說明為準。
| 目的 | 建議旗標/做法 | 經驗閾值 |
|---|---|---|
| 拉長下載逾時 | common --http_timeout_scaling=2(或更高) | 跨境先 2~4 倍,再依 P95 收斂 |
| 下載器重試 | 查版本說明中的 repository downloader retries 類選項 | 3~5 次與步驟級重試二選一疊加時避免過度轟炸 |
| 隔離輸出根 | --output_user_root 指向專用掛卷 | 每 job 子目錄,避免 output 競態 |
| 預拉驗證 | bazel fetch //...、bazel mod deps --lockfile_mode=update(視專案策略) | 與主 build 分 job,失敗快取可單獨重跑 |
| Orchestrator 逾時 | GitHub Actions timeout-minutes 等 | 冷啟 25~45 分起跳再調;預拉步驟應略短於全量 build |
④ 與 Git 部分克隆並行的目錄與 IO 配額 FAQ
--depth)與 partial clone(如 --filter=blob:none)要注意什麼?git_repository 若以浮動 branch追蹤遠端,淺克隆常缺物件;請改固定 commit,並確認深度或 filter 規則涵蓋該提交。partial clone 在首次 Bazel 觸發 git 讀取時可能觸發額外 fetch,與 CI 同時跑的大規模 git fetch 會競爭頻寬與 inode。
建議四類路徑分開掛卷或子卷:工作樹(checkout)、output_user_root、repository_cache、disk_cache。共享遠端 Mac 上,避免把四者壓在同一顆小容量 SSD 的根分區,否則 loading 與 action 寫入會互相擠兌。
請交叉閱讀 Git Submodule/LFS CI 矩陣:LFS 與 Bazel 外源下載會疊加出站;可在流水線上「先 LFS pull/子模組 init,再 bazel fetch」,並限縮同機平行 job。
⑤ 遠端 Mac 節點地域與平行編譯對拉取穩定性的影響
節點地域決定的是「你到 Maven、GitHub、Google Storage、Registry 的預設路徑」,並非 Bazel 本身魔法。若外源主機集中在某一雲區,選靠近該區的遠端 Mac通常比在本機硬撐代理更穩。--jobs 提高的是執行期平行度,會放大編譯階段的 CPU 與磁碟 IOPS;若與 loading 階段重疊在同一窄時間窗,仍可能讓 fetch 逾時。實務上常採「序列化冷啟」或「預拉 job 與 build job 分離」,並在 orchestrator 設 max-parallel: 1~2 於單台共享 mini。
| 情境 | 地域/併發建議 | 可觀測指標 |
|---|---|---|
| 外源多在美西 | 優先美西或對等低 RTT 節點;慎用遠距離雙跳代理 | fetch 步驟 DNS/TLS 耗時、失敗率 |
| 企業只允許單一出口 | 節點地域次要;統一代理與 NO_PROXY 清單 | 代理日誌 502/connect timeout 比例 |
| 單機多 job | --jobs 下修;矩陣改 shard 到多機 | iostat、df -h、df -i |
總結:2026 年在遠端 Mac跑 Bazel 跨境 CI,請先用 --repository_cache 承接 WORKSPACE/MODULE 外源,再視需求疊加 --disk_cache 與 --remote_cache;以獨立步驟做 bazel fetch/bazel sync 並配套逾時倍率與退避重試;Git 淺克隆務必鎖 commit並分區 IO;地域與 --jobs/orchestrator 併發要一起調,否則快取再完整也扛不住同機資源互搶。若要省去自建機房與長連線維護,可直接租用 MacPull 遠端 Mac,把節點放在更接近你的外源與團隊時區的位置。免登入導覽:首頁、套餐/節點購買、定價方案、說明中心(SSH/連線);延伸閱讀技術部落格內 CI 與網路優化文章。