2026 年遠端 Mac CI上,瓶頸常在flake.locksubstituter:前者鎖輸入提交,後者決定二進位從哪裡來;錯序快取會放大 TLS 重試與磁碟尖峰。本文含可複製 nix.conflock 更新/回滾快取對照表重試/水位閾值。延伸:構建池與磁碟 FAQRegistry 跨境矩陣部落格列表(免登入)。

為何 2026 遠端 Mac 要分開談「輸入鎖」與「substituter」

flake.lockinputs(如 nixpkgs 修訂);substituter 是二進位 URL 清單,決定能否下載 nar。兩者解耦:同一 lock 在不同地域可能 miss 而觸發大量本機編譯,拖垮共享 runner。

  • 輸入漂移:CI 內默默 nix flake update 易讓綠燈與開發機不一致。
  • substituter 順序:內網鏡像置前可降出境;缺 trusted-public-keys 會整段失敗。
  • 併發與磁碟:max-jobs 與下載連線過高時,/nix 與系統卷同碟易 IO 佇列。

對照表:本機 store/遠端 substituter/自建快取

以 nar 下載依賴度對照法遵、命中率與維運成本。

來源命中/延遲法遵與信任維運較適合
本機二進位快取(同一 runner 的 /nix/store 命中)最快;冷啟動為零資料不出機;路徑需與 lock 一致低;需規劃 gc 與快取保留策略固定映像、重複建置、高頻 MR
遠端 substitutercache.nixos.org、社群/上游 Cachix)跨境時延與抖動大;熱門路徑命中高trusted-public-keys;出境流量需稽核低–中開源依賴為主、可接受公網快取
自建/區域二進位快取(企業 Hydra/Attic/內網 S3 前置)內網 RTT 低;首包仍須種子金鑰與 ACL 自控;易滿足資料邊界高(同步、簽章、監控)釋出產線、混合閉源依賴、嚴格邊界

可複製的 nix.conf 範本(substituters、金鑰、max-jobs、cores)

寫入 /etc/nix/nix.confNIX_USER_CONF_FILES;替換佔位符。順序:內網/自建 → cache.nixos.org → 可選社群。

# 2026 遠端 Mac CI 建議起點(請依法遵刪減 substituters)
substituters = https://<YOUR_INTERNAL_CACHE> https://cache.nixos.org https://<YOUR_CACHIX>.cachix.org
trusted-public-keys = <YOUR_INTERNAL_CACHE_KEY> cache.nixos.org-1:6NCHdD59Z431Q0QK348AG5BK86JQ28DRVGV15KVX- <YOUR_CACHIX>.cachix.org-1:<YOUR_PUBLIC_KEY>

max-jobs = auto
cores = 0

# 跨境網路:收斂連線與逾時(依 Nix 版本微調鍵名;不支援可刪)
binary-caches-parallel-connections = 8
connect-timeout = 10

# 多使用者 CI:僅信任 root/daemon(示例)
trusted-users = root
max-jobs 與 cores 怎麼配
情境建議備註
共享遠端 Mac、單 jobmax-jobs = 2auto 搭配 CPU 上限避免與其他租戶搶滿編譯執行緒
專用 M 系列、單一流水線max-jobs = autocores = 0cores = 0 常見語意為「讓 Nix 自行選每作業核心數」;仍以實測為準
大量 substituter miss下調 max-jobs 與平行連線先救磁碟與頻寬,再調快取順序

Flake lockfile:更新與回滾命令

CI 預設應固定 lock,變更走 MR/PR;流水線內更新須留 diff/artifact 稽核。

1

更新單一輸入(例如只升 nixpkgs):nix flake lock --update-input nixpkgs

2

更新所有輸入nix flake update;若需直接寫入提交可視流程加上 --commit-lock-file(慎用)。

3

回滾 lockgit restore --source=HEAD~1 flake.lockgit checkout <已知良好修訂> -- flake.lock,再重跑 nix buildnix develop -c …

# 僅驗證 lock 與 flake 完整性(不改檔)
nix flake check --no-write-lock-file

# 在乾淨工作樹上鎖定當前 flake.nix 所宣告輸入(寫入 flake.lock)
nix flake lock

# 針對單一輸入重新解析並寫 lock
nix flake lock --update-input nixpkgs

lockfile 掃描可參考:GitHub Checks lockfile 掃描

失敗重試與磁碟水位閾值(參數清單)

常見失敗:TLS 中斷、5xx、nar 雜湊不符、逾時。以 shell 退避重試nix build,並聯動磁碟監控。

建議閾值(起點,請用監控回調)
維度建議值/階梯決策備註
下載/建置重試3–5 次;秒數 4+jitter816,封頂 120對 TLS/暫態 5xx;若連續 nar 雜湊錯誤應停並檢查金鑰/鏡像污染
/nix 可用空間警戒18–22% 剩餘比例觸發 nix-collect-garbage 或限流;多租戶節點宜偏保守
/nix 嚴重12–15%停止接受新任務或強制只讀快取路徑;附 df -h 快照到日誌
系統卷(非 /nix警戒 18–20%、嚴重 12–15%日誌與 tmp 同卷時,編譯暫存會與 store 競爭
# 示例:包裝 nix build 的指數退避(占位:將 .#default 換成你的 flake 目標)
set -euo pipefail
for i in 1 2 3 4 5; do
  nix build ".#default" --print-build-logs --no-link && exit 0
  s=$((4 << (i-1)))
  [ "$s" -gt 120 ] && s=120
  sleep $((s + RANDOM % 5))
done
exit 1

總結

flake.lock 管輸入、nix.conf 管二進位來源,再以重試+磁碟水位護共享節點,是 2026 較穩預設。免登入:定價購買說明中心首頁

總結:對照表選邊界;nix.conf 固定 substituter、金鑰、max-jobscores;lock 更新可審計、可 git 回滾;退避重試與磁碟閾值守節點。頁首 JSON-LD 含 BlogPostingBreadcrumbListHowTo

遠端 Mac × Nix CI

用專用節點驗證你的 substituter 矩陣

免登入即可查看定價與購買;說明中心提供連線與環境要點。