限时优惠

Apple Silicon 云 Mac 上跑 iOS/macOS CI:codesign、Notarization、stapler 与密钥/钥匙串边界——可复现流水线与常见拒绝码排障表

CI 构建与签名
2026-05-07 约 6 分钟阅读

iOS/macOS 流水线迁到 Apple Silicon 云 Mac 时,常见卡点不在 Xcode 版本,而在分发证书、专用钥匙串、codesign、公证与 stapler这条链。本文固定可复现前提,并附拒绝码/症状速查表,便于值班先归类再动手。

本文要点

  1. CI 上为签名单独准备钥匙串 + 最小权限证书,避免与登录用户钥匙串混用导致 errSecInternalComponent
  2. codesignHardened Runtime、entitlements 要按产物类型(app、helper、XPC、插件)分层校验,再送公证。
  3. xcrun notarytool 提交与轮询;通过后对分发包执行 stapler staple,区分公证失败与装订失败。
  4. 排障先对齐 submission id 与证书指纹;Runner 取舍见 Bitrise 与自建云 Mac Runner 决策文
显示器上的代码与终端界面,象征云端 CI 与签名流水线
封面为氛围示意;生产排障请以 Apple 官方文档、实际 codesign / notarytool 日志与钥匙串访问控制为准。

1. 可复现流水线:密钥、钥匙串与 Runner 边界

云 Mac 强调无人值守与镜像重置:凡依赖「手动点钥匙串允许」都会在下次实例复发。把分发证书与私钥放进专用钥匙串文件,Job 开头用 security 设定搜索顺序、默认钥匙串与解锁;口令只走 CI 秘密变量。公证轮询受出口网络影响,若同机还跑 VPN,默认路由可能与 WireGuard 跨境远控排障文 所述非对称路由叠加,需一并排查。

2. codesign:分层校验与 Hardened Runtime

对 app 与嵌套目标跑 codesign --verify --deep --strict,必要时 spctl --assess 预检 Gatekeeper。隐性失败多来自子二进制漏签entitlements 与 capability 漂移,或脚本改写已签 bundle。签名顺序建议写死:先子后主、再验签;第三方二进制须在你的证书链下或改为 xcframework。若同机用 Docker 构建缓存,勿把宿主钥匙串 bind 到与用户上下文不一致的容器,以免「见证书不解私钥」。

3. Notarization 与 stapler:提交、通过、装订

xcrun notarytool store-credentials 建 profile,再 submit + wait 拉结构化日志。通过后对最终分发的那份包执行 stapler staple;装订失败常见是包体在公证后被改动。把 submission id 与状态打进构建日志,便于与 Connect 工单对齐。

# 示意:提交并等待(具体 profile 名与路径按项目替换)
xcrun notarytool submit ./MyApp.zip --keychain-profile "AC_NOTARY" --wait
xcrun stapler staple ./MyApp.zip
xcrun stapler validate ./MyApp.zip

4. 常见拒绝码与症状—动作(速查)

下表用于先归类:左列贴日志关键词,右列为首选动作(细节以 Apple 文档为准)。

症状 / 日志线索 高概率根因 首选动作
errSecInternalComponent / 用户交互不允许 钥匙串 ACL、未解锁或搜索顺序不对 专用钥匙串;security set-key-partition-list;确认无 GUI 弹窗依赖
code object is not signed at all / nested code 嵌套二进制漏签或签名被破坏 codesign --verify --deep;按依赖树补签;检查复制脚本是否改写 bundle
notarytool Invalid Runtime / entitlements 与公证策略不符 按日志条目逐项收紧;删掉不必要的宽 entitlement
stapler staple 失败 / validate 红 公证对象与本地文件不一致或未通过 对同一未改动包重试;确认先 wait 成功再装订;检查是否二次压缩改 checksum
上传 App Store / TestFlight 被拒(ITMS-xxxx) 元数据、隐私清单、架构切片与签名策略 以 Transporter / Xcode Organizer 详细为准;同步更新隐私原因字符串与 PrivacyInfo.xcprivacy

5. 结语

云 Mac 上的 CI,要把钥匙串、证书、profile、notarytool 与 stapler 顺序写成可声明的 Runbook,镜像升级后做一次冷启动签名校验,让红构建尽量只反映产品变更。

在云端 Mac mini 上,签名与公证更省心

Apple Silicon 统一内存让 Xcode、模拟器与 notarytool 轮询并发时更不易触顶;macOS 原生工具链与钥匙串语义一致,减少「Linux Runner + macOS 远程」的双栈心智负担。独占云 Mac 能把构建峰值与磁盘 I/O 从共享邻居中隔离,长期无人值守稳定性更好;Gatekeeper、SIP 与系统完整性降低供应链被篡改面;M 系列能效高、体积小,总拥有成本常优于为每台笔记本单独买 Apple Care + 固定机位。

若你正把 iOS/macOS CI 迁到可预期、可复现的 Apple Silicon 环境,kvmboot 云端 Mac mini M4 是目前性价比很高的起点——立即了解套餐方案,让 codesign 与公证不再绑在某一台个人电脑上。