公证证明 Apple 已扫描你的二进制;装订(stapling)把票据嵌入其中,使 Gatekeeper 能在离线条件下验证。不做决策就「一律装订」会在每次构建多花数分钟;「从不装订」则在隔离实验室里吃苦头。在Mac mini M4 CI Runner 上——尤其是 NodeMac 在香港、日本、韩国、新加坡或美国提供的独占主机——应发布一张矩阵,把装订策略与分发渠道、网络假设和产物类型绑定。本文给出两张矩阵、八步上线与与安全评审阅读流水线方式一致的 FAQ 结构化数据。
存储与保留背景:磁盘与产物保留、锁文件哈希缓存。工程师若需 GUI 对比两棵已签名目录树,可在同一 NodeMac 主机使用 VNC。定价;帮助。
Gatekeeper:在线查票 vs 装订票据
macOS 可以公证成功,但若未装订且机器在首次启动时无法访问 Apple 服务,仍会让用户意外。相反,装订会改变外层容器(例如 .dmg),若过早计算哈希会破坏朴素的校验门。CI 策略必须写明哪份校验和是审计产物(装订前)以及哪份二进制交付给客户(装订后)。
- 仅票据:实验室 Mac 出口稳定且你控制复检策略时迭代最快。
- 已装订:面向客户的磁盘映像、离线安装包与现场笔记本的默认做法。
- 混合:仅对发布渠道装订;夜间构建保持仅票据并加显式横幅说明。
矩阵 A:按分发路径选择装订或票据
| 产物与路径 | 装订? | 理由 |
|---|---|---|
| 开发者 U 盘展台 .dmg | 是 | 离线 Gatekeeper;避免首次启动依赖 CDN |
| 有线实验室内 CI 冒烟安装 | 可选 | 若出口受监控且可接受失败,仅票据加快循环 |
| MDM 投递 pkg 且安装后装订 | 皆可 | 记录由流水线还是 MDM 装订,避免重复劳动 |
| App Store 上传流水线 | 遵循 Apple 传输文档 | 消费者路径不同;勿照搬桌面 DMG 规则 |
矩阵 B:CI 阶段顺序与验证
| 阶段 | 命令族 | 通过标准 |
|---|---|---|
| 签名 | codesign 强化运行时标志按权利矩阵 |
codesign --verify --deep --strict 无告警 |
| 公证 | notarytool submit + 轮询 |
日志显示 Accepted;提交 ID 已归档 |
| 装订 | xcrun stapler staple |
干净虚拟机上 stapler validate 通过 |
| 冒烟 | 从已挂载映像启动应用 | 无「已损坏」对话框;遥测版本符合预期 |
数值护栏
- 超时预算:发布列车为 notary 轮询至少预留 25 分钟墙钟;功能分支可更短,若接受偶发失败。
- 并行提交:每台主机并发公证任务上限 2,避免与 Xcode 峰值叠加触发 Apple 侧限流。
- 产物不可变:将装订后对象上传到新的对象键;切勿原地覆盖。
审计提示:在变更单上同时附上公证提交 ID 与装订前产物的 SHA-256。装订不能替代签名日志。
八步上线
- 清点渠道:各构建类型发往何处(实验室、客户、MDM)。
- 编码矩阵:写入流水线模板——而非 Slack 部落知识。
- 拆分作业:构建/签名、公证、装订、发布为独立步骤并配不同缓存。
- 增加 VM 冒烟:可选禁用出站 Apple 端点以检测缺失装订。
- 存储日志:notarytool 日志与其他签名证据同一保留桶。
- 轮换签名证书:按日历执行;每次轮换后重跑矩阵验证。
- 培训值班:区分 stapler 与 notarytool 错误——责任人不同。
- 按区域独占 M4:队列时间迫使走捷径时——NodeMac 用硬件独占把政策争论从风险里拿掉。
常见问题
CI 何时必须装订?
当用户离线安装或来自网络不受控的环境时。若内部循环网络良好且已文档化,可保持仅票据。
装订会破坏校验和缓存吗?
会——装订前哈希用于审计;将装订后 blob 视为交付物并单独记录校验和。
stapler 过早运行会怎样?
Gatekeeper 拒绝损坏应用。强制执行 签名 → 公证 → 验证 → 装订 → 校验 顺序。