跨境 CI遠端 Mac上跑 Bazel 時,紅燈常出在loading 階段:MODULE/WORKSPACE 解析、http_archivegit_repository、Registry 與 Maven/Go 等外掛規則同時出站,RTT 與小包延遲會被放大;若再把錯誤的快取旗標混用,會出現「以為命中、其實仍在狂拉外站」的假像。本文用決策表拆開 --repository_cache--disk_cache--remote_cache 分工,附可執行 .bazelrc 片段orchestrator 平行 jobGit 淺克隆/partial clone協同注意點。可先讀MacPull 首頁了解節點地域,並用技術部落格列表串聯 Git/npm/Homebrew 鏡像 CI 優化構建池併發與磁碟 FAQSSH 中繼與跨境效率對照你的網路路徑。

① 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_PROXYNO_PROXY;Java 信任庫或 SSL_CERT_FILE;步驟級 2/4/8 秒退避重試
磁碟滿、iowait 飆output_base 與快取目錄同盤;多 job 並寫分離掛卷:output_user_rootrepository_cachedisk_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_cachedisk_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。

目錄應如何分區以降低 IO 互搶?

建議四類路徑分開掛卷或子卷:工作樹(checkout)、output_user_rootrepository_cachedisk_cache。共享遠端 Mac 上,避免把四者壓在同一顆小容量 SSD 的根分區,否則 loading 與 action 寫入會互相擠兌。

與 submodule/LFS 並行時?

請交叉閱讀 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: 12 於單台共享 mini。

情境地域/併發建議可觀測指標
外源多在美西優先美西或對等低 RTT 節點;慎用遠距離雙跳代理fetch 步驟 DNS/TLS 耗時、失敗率
企業只允許單一出口節點地域次要;統一代理與 NO_PROXY 清單代理日誌 502/connect timeout 比例
單機多 job--jobs 下修;矩陣改 shard 到多機iostatdf -hdf -i

總結:2026 年在遠端 Mac跑 Bazel 跨境 CI,請先用 --repository_cache 承接 WORKSPACE/MODULE 外源,再視需求疊加 --disk_cache--remote_cache;以獨立步驟做 bazel fetchbazel sync 並配套逾時倍率與退避重試;Git 淺克隆務必鎖 commit並分區 IO;地域與 --jobs/orchestrator 併發要一起調,否則快取再完整也扛不住同機資源互搶。若要省去自建機房與長連線維護,可直接租用 MacPull 遠端 Mac,把節點放在更接近你的外源與團隊時區的位置。免登入導覽:首頁套餐/節點購買定價方案說明中心(SSH/連線);延伸閱讀技術部落格內 CI 與網路優化文章。

遠端 Mac × Bazel 外源/快取

固定 repository/disk/remote 三層,跨境拉取更穩

首頁、購買、定價、說明中心皆可免登入瀏覽;部落格另有 Git、Gradle、構建池與 SSH 實戰文可延伸。