macOS 26.6 CI 升级不要全池自动安装。先用少量试点节点验证,再排空任务、分批滚动升级,并在重启后跑真实流水线;生产签名节点必须保留未升级节点或临时备用远程 Mac。
这篇文章适合三类人:管理长期在线 Mac CI 节点、准备迁移到 Xcode 27 的研发负责人,以及需要核查 FileVault、更新授权、远程恢复和备用容量的基础设施负责人。
最后更新于 2026 年 9 月 18 日。本文涉及的系统要求、更新授权、强制重启和 Apple Silicon 机制,已按 Apple Developer 与 Apple Platform Deployment 文档核实。
01 先划清 macOS 26.6 的维护边界
Apple 当前列出的系统要求显示,Xcode 27 需要运行在 macOS Tahoe 26.6 或更高版本。因此,如果你的生产节点必须部署 Xcode 27,macOS 26.6 不是普通可选补丁,而是工具链迁移的前置条件。反过来,仍运行旧版 Xcode、没有立即迁移计划的节点,不应因为“全公司统一版本”而被强制同时升级。(developer.apple.com)
你需要把更新动作拆成三类:
- 后台安全改进:主要用于安全配置、系统数据和安全响应。部分内容不要求完整系统升级,但涉及操作系统的内容可能仍要求重启。(support.apple.com)
- 同代系统更新:仍处于 macOS 26 的小版本更新,重点是补丁、稳定性和安全修复。
- 跨大版本升级:例如从 macOS 15 迁移到 macOS 26,涉及更多工具链、权限和系统行为变化,不应与普通补丁采用同一个自动策略。Apple 也明确区分 update、upgrade 和 Background Security Improvements。(support.apple.com)
最大的风险不是“Mac 会不会回来”,而是恢复后仍然没有生产资格。你必须分别判断:
- 主机是否在线;
- Runner 是否在线;
- Xcode 是否能被正确调用;
- 依赖是否能干净解析;
- 构建是否成功;
- 归档和签名是否成功;
- 上传是否成功。
只看到 VNC、SSH 或 Runner 状态变绿,不能宣布升级完成。
02 日常 PR 构建池采用排空后滚动升级
PR 构建节点的目标是降低中断范围,而不是追求一次性完成。你应先把节点从调度系统中标记为 draining,阻止新的 Job 进入;已经运行的任务则继续执行,直到完成或被明确迁移。
最小操作顺序如下:
- 给目标节点加上维护标签,停止新任务路由。
- 查询当前 Job 数量、最长运行任务和队列等待状态。
- 等待已有 Job 结束;超时任务要记录 Job ID、提交人和取消原因。
- 记录升级前的 macOS 版本、Xcode 路径、Runner 版本和关键环境变量。
- 执行 macOS 26.6 更新,并允许节点按计划重启。
- 节点恢复后检查 Runner 自动启动、工作目录权限和网络连通性。
- 先跑一条干净依赖解析流水线,再跑编译、测试和缓存命中流水线。
- 观察首批真实 Job 的日志,确认没有把失败任务重新路由到旧缓存或错误的 Xcode 路径。
Apple 的声明式软件更新支持设置目标系统版本和强制执行时间;如果用户没有在指定时间前完成更新,设备可以执行强制安装。Apple 同时提醒,不同设备管理服务对这些设置的具体实现并不完全相同,不能仅凭 Apple 的通用能力推断你的管理平台已经正确支持。(support.apple.com)
验收清单:
- ✅ 节点升级前已停止接单;
- ✅ 当前 Job 已完成、取消或迁移;
- ✅ 升级前后版本信息已归档;
- ✅ Runner 自动启动并重新注册;
- ✅ Xcode 27 路径明确,没有调用旧版本;
- ✅ 依赖解析和干净构建成功;
- ✅ 测试结果可追溯;
- ❌ 不能只用“主机在线”作为通过条件;
- ❌ 不能只用“Runner 在线”作为通过条件。
第一批不要覆盖整个 PR 池。若首个节点的验收失败,立即暂停放量,保留尚未升级的节点继续接单。不要在失败原因还没有定位前扩大升级范围。
03 生产签名节点必须使用独立维护窗口
正式归档、代码签名和上传节点不能沿用普通 PR 节点的更新节奏。它们承载的不只是编译任务,还包括证书私钥、Keychain、发布凭证、归档产物和审计记录。
维护前至少完成以下确认:
- 冻结正式发布任务,并通知发布负责人;
- 确认没有正在进行的 archive、签名或上传;
- 记录 Keychain 状态、证书有效期和私钥可用性;
- 确认 App Store Connect 凭证仍能完成非破坏性验证;
- 标记一台未升级回滚节点,或者准备经过真实验收的备用远程 Mac;
- 明确升级失败时由谁执行切换,谁负责恢复发布队列。
恢复验收也要按发布链路逐项完成:
- 使用固定提交执行干净归档;
- 检查签名身份和 provisioning profile;
- 验证导出的产物完整性;
- 执行上传流程;
- 检查上传结果和审计记录;
- 确认失败时能够切回未升级节点。
Apple 的软件更新强制执行机制可能强制退出打开的应用,并在需要时重启 Mac。对于正在执行 archive 或签名的节点,这意味着系统在线更新可能直接破坏任务上下文。(support.apple.com)
如果你使用 CALMVPS 的企业 Mac 方案准备临时节点,建议先把它当作验收和回退资源,而不是未经验证就接管正式签名。你需要先跑通同一项目、同一凭证流程和同一上传链路。
04 Apple Silicon 无人值守节点先验证授权和恢复
Apple Silicon 构建机的关键不是“能不能远程登录”,而是系统更新后是否能在无人现场操作的情况下重新启动并接单。
Apple 文档明确区分了 secure token、bootstrap token 和 volume ownership。Apple Silicon Mac 需要 volume owner 才能授权部分系统更新和启动安全策略变更;bootstrap token 在可用时可以帮助授权软件更新,并为相关账户提供 secure token。macOS 26 还支持在设备管理注册阶段生成 bootstrap token,但前提是设备管理服务支持对应流程。(support.apple.com)
不要把这段通用机制直接等同于“你的 MDM 一定能无人值守升级”。你需要在实际节点上核查:
- bootstrap token 是否已经生成并回传管理平台;
- secure token 是否存在于预期账户;
- CI 服务账户是否拥有正确的本地权限;
- FileVault 开机解锁是否需要人工输入;
- 用户会话是否能按预期恢复;
- Runner 是否作为 LaunchDaemon、登录项或其他受管服务自动启动;
- SSH、VNC 或网页控制台是否在重启后恢复;
- 重启后能否完成一次真实构建。
建议设计一次受控重启演练。选一台非关键节点,先排空任务,再触发更新和重启。演练的通过标准不是“你能重新连上 SSH”,而是节点在没有现场输入的情况下完成注册、拉取代码、解析依赖、编译并上传测试产物。
Apple 的更新文档还指出,macOS 强制执行更新时会关闭打开的应用;Apple Silicon Mac 在可用时会使用 bootstrap token 授权,否则可能要求用户凭据。(support.apple.com)
05 跨地域节点按业务时区错峰
多地域 Mac CI 不能只按机器数量分批,还要按业务影响范围分批。至少区分三类节点:
- 单机房 PR 节点:先在一个机房选少量节点试点,确认失败时不会耗尽本地容量。
- 跨地域构建池:将不同地域放在不同维护批次,避免同一业务时段同时失去多个队列。
- 共享签名节点:单独安排维护窗口,不与普通构建节点绑定。
维护时使用节点标签、队列路由或调度规则,把任务转移到尚未维护的 Mac。提前定义排队上限:如果剩余容量只能维持低优先级 PR,而无法承接发布任务,就暂停下一批升级。
你可以用下面的条件分支做决定:
- 若剩余节点能够承接关键队列,且试点节点已完成真实构建、签名或上传验收,则继续扩大滚动批次。
- 若主机恢复但 Runner 没有自动注册,则暂停升级,先修复启动项、权限或管理平台回传。
- 若 Runner 在线但 Xcode 调用、依赖解析或构建失败,则保留未升级节点,禁止把失败节点重新加入生产池。
- 若 PR 队列可以排队,但正式发布没有备用节点,则只升级 PR 池,签名节点延后。
- 若跨地域维护会同时影响同一发布窗口,则拆开维护日期,并让至少一个地域保持未升级状态。
- 若没有任何冗余节点,则先申请一台短期 远程 Mac PoC 环境,跑通真实项目后再开始生产升级。
不要预设一个脱离业务的备用容量比例。需要多少备用容量,取决于最长构建时长、发布冻结窗口、跨地域故障范围和队列优先级。企业记录应至少保存维护期间的排队数量、任务迁移结果和备用节点接管记录。
06 紧急补丁按风险等级决定加速还是暂缓
如果补丁涉及高风险安全问题,不能机械等待常规维护周期;但“紧急”也不等于立即对所有 CI 节点执行强制安装。你应同时评估四个维度:
- 安全风险:不升级是否会暴露已确认的高影响问题;
- 生产影响:重启会不会命中发布、签名或高峰构建;
- 工具链兼容性:Xcode、依赖、脚本和签名链是否完成试点;
- 可回退性:是否有未升级节点、可恢复凭证和临时远程 Mac。
Apple 的软件更新管理支持目标版本、目标时间和状态回传,但具体强制行为仍受设备管理服务实现影响。对无人值守 Mac,不能只看策略是否下发,还要核对节点是否真正完成更新、重启和恢复。(support.apple.com)
可以按以下结果执行:
- 试点通过,风险高,且有备用容量:加速滚动放量,但仍保持分批。
- 试点通过,风险中等,发布窗口临近:先更新 PR 节点,签名节点延后到发布冻结窗口。
- 试点失败,或 Runner 恢复异常:暂停升级,切换干净备用节点,保存失败日志。
- 系统已升级但签名失败:节点只能作为普通构建节点,不能恢复发布资格。
- 没有备用节点且容量不足:不要扩大批次,先用短期远程 Mac 完成同项目验收和回退演练。
07 企业维护记录至少保存这些证据
每个升级批次都应形成一条可审计记录,避免事后只剩“当时好像成功了”。
建议保存:
- 节点标识、地域和队列标签;
- 升级前后的 macOS、Xcode 和 Runner 版本;
- 排空开始时间、最后一个 Job 结束状态;
- 更新策略的目标版本和执行时间;
- 重启后主机、Runner、Xcode、构建、签名、上传六类状态;
- 首条真实验收流水线的提交号和日志;
- 失败节点是否回退;
- 备用远程 Mac 是否启用,以及承接了哪些任务;
- 最终由谁批准节点重新进入生产池。
如果你还没有标准化这些记录,可以先从 CALMVPS 的 Mac CI 基础设施入口规划临时节点、共享构建机和远程恢复演练。重点不是购买更多机器,而是把升级窗口变成可验证、可回退的运行流程。
08 常见问题
系统自动更新可能如何影响正在运行的构建?
会。受管软件更新达到强制执行时间后,macOS 可能强制退出打开的应用并在需要时重启。CI 系统不会天然知道某个编译进程是否必须保留,因此你必须先停止 Runner 接单,再等待已有 Job 完成或迁移。(support.apple.com)
维护 macOS 26.6 之前,Runner 应该怎样处理?
要先进入 draining 或 offline 状态,确认没有运行中的 Job,再执行系统更新。升级完成后,还要分别验证 Runner 注册、Xcode 调用、依赖解析和真实构建,不能把“服务在线”当成完整验收。
Apple Silicon 构建机怎样才能完成无人值守更新?
重点是 bootstrap token、secure token 和 volume ownership。Apple Silicon Mac 的更新授权可能依赖 bootstrap token,但管理平台是否已经生成、托管并正确使用该令牌,需要通过平台文档和一次受控重启演练确认。(support.apple.com)
Xcode 27 节点恢复后应检查哪些流水线环节?
至少验证干净依赖解析、普通编译、测试、正式归档、代码签名和上传。Xcode 27 需要 macOS Tahoe 26.6 或更高版本,因此迁移节点必须同时验证系统版本、工具链路径和发布凭证,而不是只检查 Xcode 是否能打开。
滚动维护时备用 Mac 应按什么依据准备?
没有适用于所有企业的固定数字。你应按最长构建时长、发布冻结窗口、地域故障范围和队列优先级计算。只要剩余节点无法承接正式发布,就应缩小批次,或先启用一台经过真实项目验收的临时远程 Mac。
如果你现在的方案是把所有 Mac 节点放在同一维护策略下,主要缺点是:系统更新可能同时中断构建,签名节点和普通 PR 节点会互相牵连,节点恢复后还可能出现 Runner 在线但上传失败的半恢复状态。相比之下,按需租用 CALMVPS 的远程 Mac,可以在正式升级前补出一台独立验收和回退节点,不必先采购长期闲置的实体设备,也不必让生产签名节点承担第一次升级试错。
但长期稳定的高负载构建、必须接入本地物理设备,或需要完全控制硬件链路的团队,仍应自购并托管 Mac。若你的需求集中在维护窗口、迁移验证和短期备用容量,先租用一台远程 Mac 跑通真实流水线,再决定是否扩大采购,风险通常更低。