检出策略是每条 macOS 流水线的隐形放大器:同一台 Mac mini M4 用 git worktree 可以感觉「够快」,而一旦 DerivedData 在任务间泄漏就会「莫名不稳定」。2026 年,团队若发布明确的 worktree 对比全新克隆 政策,可同时缩短排队时间 并 降低审计风险。本文提供两张矩阵、量化磁盘预算、八步上线路径,以及可粘贴进内部运行手册的 FAQ 结构化数据。
将本政策与 磁盘与产物留存、容量包络 及 Runner 亲和规则 配套使用。若需在香港、日本、韩国、新加坡或美国增加专用主机,请从 定价 起步,并常备 帮助 以查阅 SSH/VNC 接入模式。
为何检出模式是调度问题,而不只是 Git 细节
自托管 macOS Runner 默认带状态:全局缓存、用户级钥匙串项,以及 Xcode 默认 DerivedData 路径会在任务间保留,除非你做隔离。每任务全新克隆能隔离 Git 对象,却不能自动隔离编译器。Worktree 共享单一对象数据库——更快——但会放大清理脚本中的任何错误。请将检出模式纳入与密钥、签名身份并列的 爆炸半径 叙事。
- Worktree 在多条分支构建同一修订流时,可最小化
git fetch字节数。 - 全新克隆 在仓库检出后会修改树外工具的后置钩子时,可最大化隔离。
- 规模化场景常见的 混合 模式(热裸镜像 + 临时 worktree)需要严格的路径约定。
决策矩阵 A:选择 worktree、全新克隆或混合
| 仓库信号 | 推荐模式 | 注意点 |
|---|---|---|
| 单体仓库、高变更、共享 Xcode 版本 | 混合(裸镜像 + worktree) | 必须用 -derivedDataPath 按 worktree 固定 DerivedData |
| 小型应用、依赖少、需要可复现性 | 每任务全新克隆 | 关注 LFS 带宽;在主机上缓存 blob 并做校验和验证 |
| 绑定硬件身份的发布签名 | 专用主机 + 全新克隆 | 切勿让不受信任 fork 与 worktree 基座共享 |
| 外部贡献者的 fork PR 构建 | 唯一路径下的临时克隆 | 跨信任边界禁用共享裸镜像 |
决策矩阵 B:缓存放置与泄漏风险
检出模式决定 Git 对象放在哪;缓存放置决定 下一任务仍保留什么。两者不对齐时,会出现「明明全新克隆却仍通过全局路径泄漏编译器状态」的情况。
| 缓存 | M4 Runner 上的安全默认 | 泄漏症状 |
|---|---|---|
| Swift Package Manager | 每任务将 SourcePackages 放在工作区临时目录下 |
全局缓存复用且无 lockfile 哈希时,PR 间出现版本漂移 |
| CocoaPods / Bundler | vendor 在克隆内或内容寻址 tarball 缓存 | 原生扩展构建选错架构标志 |
| Xcode DerivedData | 始终按任务 ID 限定路径 | 另一分支的部分索引导致 UI 测试不稳定 |
可执行的磁盘预算(起点)
- 裸镜像上限:512 GB 主机上单体镜像控制在 120 GB 以内;用可审计脚本修剪,勿手工删。
- 并发 worktree:除非 IO 指标显示持续读吞吐有余量,每台主机最多 4 个。
- 全新克隆暂存:为
git clone --depth 1加 LFS 峰值预留最大工作树的 2×。 - 告警:CI 卷空闲磁盘低于 15% 超过 5 分钟即分页。
审计提示:记录每个 Runner 组所属信任层级。曾检出 fork PR 的 worktree 基座,若无文档化擦除,不得再构建签名发布产物。
八步上线路径
- 仓库分级为可信内部、合作方与公共 fork。
- 度量 每个层级在两种模式下的 p95 检出+编译时间,跨度一个迭代。
- 实现路径约定,例如
/ci/jobs/<id>/tree,由自动化独占。 - 挂载任务后钩子,删除 worktree、DerivedData 及与任务 ID 绑定的模拟器缓存。
- 阻断全局缓存,除非以内容哈希 + 信任层级为键。
- 增加指标:检出秒数、LFS 兆字节、每台主机磁盘空闲百分比。
- 季度两次 演练磁盘写满场景。
- 扩展硬件:当预算迫使冒险共享时——NodeMac 可按区域增加专用 Mac mini M4 节点,无需托管 lead time。
常见问题
在共享 Mac mini M4 CI 主机上,git worktree 何时安全?
当每个 worktree 路径按任务隔离、钩子受控、子模块已固定,且清理会删除 worktree 及同路径缓存时。不要将裸仓库与开发者的交互式会话共享。
为何全新克隆仍会随机失败?
多为全局缓存、LFS 网络问题或扫描器触碰输出。将缓存限定在任务内,并将失败与网络曲线关联。
并行 worktree 需要多少额外磁盘?
为每个并发 worktree 预算一份工作树加共享对象库,若编译 Xcode 项目再加每任务 DerivedData。