输入锁、跨境拉取与 2026 Runner 现实
Flake 用 lock 里的精确提交换可复现 CI,但冷构建仍会密集拉 narinfo / NAR。跨境下若 substituters 未按 RTT 排序,或 max-jobs 与多 Job 对撞,易出现 TLS 超时、回源编译与 /nix 快速触顶。
- lock 漂移:合并了
flake.nix却未同步提交flake.lock,或反之。 - 公钥与缓存主机不匹配:日志出现 ignoring untrusted substituter,实际走了全量本地构建。
- 并行度与带宽对撞:多 Job × 高
max-jobs放大 nar 下载并发。 - 磁盘硬阈值未接:store 写满后表现为神秘失败或守护进程报错。
建议每次只调一维:先确认 substituter 命中与签名,再动 max-jobs,最后才考虑改输入版本。
对比表:本机二进制缓存 vs 远程 substituter vs 自建缓存
这里的「本机」指同一 Runner 上已存在于 Nix Store 的路径命中,无需出网;远程与自建则涉及信任边界与合规审计。
| 形态 | 典型收益 | 主要风险 / 代价 | 与 nix.conf 的关系 |
|---|---|---|---|
| 本机 store 命中(上一轮构建残留) | 零出网、最低延迟 | 多租户隔离不当会泄露闭包;缓存键错误会「误命中」旧 drv | 不写入 substituters;靠 同一 lock 与干净或受控的 store |
| 远程 substituter(cache.nixos.org 等) | 大量预编译路径,显著缩短冷启动 | 跨境带宽与 SNI 抖动;官方未覆盖的私有 overlay 仍回源编译 | substituters 前列 + 对应 trusted-public-keys |
| 自建二进制缓存(S3/MinIO + nix-serve / Harmonia 等) | 可走内网或专线;可镜像组织常用闭包 | 密钥轮换、索引一致性、首包冷拉成本 | 追加 HTTPS 端点与组织签名公钥;必要时经反向代理做鉴权 |
可复制的 nix.conf(substituters、公钥、max-jobs、cores)
写入守护进程读取的 nix.conf(多用户常见 /etc/nix/nix.conf)。substituters 从左到右优先。下方 https://nix-cache.example.internal 与 YOUR_ORG_CACHE_KEY... 为占位,替换为团队缓存 URL 与配对公钥。
临时覆盖可用 NIX_CONFIG 注入 extra-substituters;长期建议写入镜像或配置管理。
Flake lockfile:更新、单输入升级与回滚命令
合并前用与 CI 同 major 的 Nix更新锁,把解析失败拦在 PR。回滚优先 git checkout,其次备份文件。
lockfile 变更流程可对照 Rust lockfile 矩阵 的单点变更习惯。
失败重试与磁盘水位参数清单
出网拉取外层用带抖动的 2/4/8 秒阶梯,避免多 Runner 同相对齐。磁盘在构建前自检:预警后跑 nix-store --gc,硬阈值直接 fail fast。
| 参数 | 保守起点(共享出口 / 多 Job) | 说明 |
|---|---|---|
| TLS / 连接重置 / 5xx 重试间隔(秒) | 2 → 4 → 8(最多 3~4 次,±20% 抖动) | 连续失败先降 max-jobs 再拉长间隔 |
| 磁盘预警(可用空间低于) | 18 GiB:触发 nix-store --gc 或告警 |
大闭包项目可上调预警线,但需监控趋势 |
| 磁盘硬阈值(低于则禁止新构建) | 12 GiB:失败 fast,避免半写入 store | 与构建池 FAQ 中的「触顶」排障衔接 |
max-jobs(共享 Runner) |
1~2 | 独占整机且带宽充足再评估上调 |
检索要点(meta title / description)
- Title 要点:含「2026」「远程 Mac」「Nix Flake」「substituter」「nix.conf」「决策矩阵」等检索词,总长约 28~35 个汉字以避免截断。
- Description 要点:一句点出「lock 更新/回滚 + 三类缓存对比 + max-jobs/磁盘阈值 + 重试阶梯」,并暗示教程可复制。
页面 <head> 中已写入对应 title 与 description,并与 BlogPosting、Breadcrumb、HowTo、FAQPage JSON-LD 对齐。
FAQ
日志提示 ignoring untrusted substituter?
为每个 HTTPS 缓存主机配置匹配的 trusted-public-keys;不要随意信任来源不明的公钥。临时调试可用特权命令,但不要把调试配置长期留在共享 Runner。
更新 flake.lock 后 CI 变慢?
新版本可能触发大量回源编译;用 nix path-info -r 一类命令对比闭包体积变化,并检查是否误删了可用的 substituter 或镜像路由。
总结
2026 年要在远程 macOS 上把 Nix CI 跑得可回归:先钉死 flake.lock,再让 nix.conf 的 substituter 顺序与公钥、max-jobs / cores 与出口能力一致,最后把重试阶梯与磁盘 18/12 GiB 水位写进 Runbook。需要可长期驻留的 Apple Silicon 环境做验证,可前往 购买页、帮助中心(均免登录),或从 首页了解节点与网络选项。
要点:lock 与 flake.nix 同步提交;substituters × trusted-public-keys 成对校验;共享机低 max-jobs;出网失败2/4/8 秒抖动重试;磁盘18/12 GiB两档阈值。