先核对失败作业的时间和实际 runs-on 标签;若它仍指向 macOS-14,且失败落在官方 Brownout 窗口,就先迁移到经过项目验证的替代 Runner,而不是先改应用代码。对暂时无法验收替代环境的关键发布任务,只走团队已有且经过真实流水线验证的备用 Mac 路径。
本文供负责 GitHub Actions 工作流、iOS/macOS 发布和 Mac CI 容量的 IT 管理员、发布工程师与技术负责人使用。
如果你要找的是组织范围的遗留工作流盘点清单,这篇聚焦的是 Brownout 正在发生时的故障判断、发布恢复和放行决策。
时效核实:最后更新于 2026 年 10 月 15 日;Brownout 窗口、退役日期及替代标签核实自 GitHub 官方公告。
SECTION 01 时间线与故障边界
截至 2026 年 10 月 15 日,GitHub 已确认 macOS-14 Runner 将于 2026 年 11 月 2 日退役。公告列出的后续 Brownout 时段均为 UTC 时间:
- 10 月 16 日 14:00 至 10 月 17 日 00:00
- 10 月 19 日 14:00 至 10 月 20 日 00:00
- 10 月 23 日 14:00 至 10 月 24 日 00:00
- 10 月 26 日 14:00 至 10 月 27 日 00:00
- 10 月 29 日 14:00 至 10 月 30 日 00:00
- 10 月 30 日 14:00 至 10 月 31 日 00:00
官方公告还列出了 10 月 5 日至 6 日和10 月 12 日至 13 日的 Brownout 时段;这两段截至本文更新时已经过去。受影响的标签包括 macos-14、macos-14-large 与 macos-14-xlarge。GitHub 也提示,退役前可能降低 macOS-14 Runner 容量,导致排队时间变长。具体日期和时段以官方退役公告为准。
故障时间吻合并不等于原因已确定。Brownout 期间,先记录仓库、工作流文件、分支、作业名称、失败时间和 Runner 标签;再区分以下情形:
- 时间与标签都吻合:优先检查作业是否仍路由到 macOS-14。
- 时间吻合但标签不同:检查替代 Runner 的环境差异和项目错误,不要直接归因于 Brownout。
- 标签吻合但时间不在窗口内:排查依赖安装、Xcode 选择、签名凭证、网络与代码变更。
- 多个不同标签同时失败:先查公共依赖或流水线配置,避免只盯着 macOS-14。
SECTION 02 标签替换后仍失败:检查真实路由与环境
runs-on 显示的标签决定 GitHub-hosted Runner 的选择;作业实际运行记录则用于确认最后匹配了什么环境。GitHub 的按标签选择 Runner 文档说明了标签路由方式。排查时不要只改一份 YAML 就认定迁移生效。
先在工作流中搜索 macos-14、macos-14-large 和 macos-14-xlarge,同时查找变量、矩阵、复用工作流调用及默认配置。调用方可能没有直接写 runs-on,被调用的复用工作流却仍保留旧标签;GitHub 的复用工作流配置说明可用于确认调用关系与适用限制。
替代选项方面,GitHub 公告列出的标签包括 macos-15、macos-15-xlarge、macos-latest(对应 macos-26)以及 macos-latest-xlarge(对应 macos-26-xlarge)。标签更换只是路由变化,不是兼容性验收。 macOS-15 与 macOS-26 的系统、Xcode、SDK、模拟器运行时、预装工具及架构可能不同;可先按 GitHub 提供的macOS-15 镜像软件清单和macOS-26 镜像软件清单核对,再用项目自己的构建记录验证。
一张表决定下一步
| 选项 | 适合情形 | 主要风险 | 放行条件 |
|---|---|---|---|
macos-15 |
已确认项目依赖与 macOS-15 镜像匹配 | Xcode、SDK、工具链或架构变化导致测试、归档差异 | 同一提交通过构建、测试、签名与产物核验 |
macos-26 / macos-latest |
已验证项目支持目标系统和工具链,且团队接受相应环境变更 | latest 随官方稳定镜像更新,环境基线可能变化 |
固定并记录工具版本,关键发布工作流完成验收 |
| 已验收的备用 Mac | 关键发布暂时无法在托管 Runner 上验收,且团队确有可用备用环境 | 凭证、代码、产物交接与审计流程可能不完整 | 真实发布路径已测试,责任人、回退与审计记录明确 |
选择前还要看架构相关约束。GitHub 的托管 Runner 参考文档指出,macOS arm64 Runner 不提供静态 UDID;如果你的签名或测试依赖固定 UDID,就必须把这一项列入迁移阻断条件,而不能假设更换系统标签后行为不变。
⚠️ 不要用一个全局搜索替换,把所有 macOS 作业一次性迁到同一标签。测试、归档、签名和正式发布风险不同;未验收的全局切换可能把局部故障扩大成发布阻断。
SECTION 03 按发布风险恢复流水线
遇到企业 Mac CI 发布应急,先让关键路径恢复,再处理低风险任务。把工作流按 PR 验证、模拟器测试、归档与签名、正式发布拆开,标清每项任务的业务优先级、负责人和当前可用 Runner。只允许已经通过项目验证的环境承担正式发布;非关键任务可以暂缓迁移或单独复验。
可照此顺序操作:
- 留存故障证据。 导出失败运行记录,记下 UTC 时间、分支、提交、工作流、作业、Runner 标签,以及失败发生在排队、依赖、构建、测试还是签名阶段。
- 确认运行时标签。 检查工作流 YAML、调用链、矩阵和变量;再从运行记录确认实际使用的标签。不要把未被当前分支或调用方执行的配置修改当作修复。
- 按最小范围切换。 先对一个低风险、可重复的工作流或分支试跑替代标签,保留原有稳定路径;记录修改提交和回滚方式。
- 用同一提交对照环境。 在候选 Runner 上执行与旧流程相同的依赖恢复、构建和测试,比较 Xcode、SDK、模拟器、依赖工具和架构。若失败只在一侧出现,先定位环境差异,不要把它误判为应用代码回归。
- 逐项验收发布链路。 对 iOS/macOS 发布任务核查归档、签名、导出与产物校验;另行验证发布凭证是否可读、权限是否足够、流水线是否生成审计记录。
- 分级放行或回退。 只有关键任务完成所需验证,才将它切为正式路径;若兼容性、签名或产物核验未通过,立即回退到已验收路径,并记录待解决问题与责任人。
这套步骤能帮助区分 Runner 故障与项目故障,但不会替你证明替代环境兼容。若你需要追查 Runner 标签与镜像差异,应对照官方托管 Runner 环境和镜像说明;若使用自托管 Mac,则按自托管 Runner 文档核对在线状态、标签路由和机器通信条件。标签相同也不意味着两台机器的镜像、Xcode 或凭证状态相同。
SECTION 04 放行门槛与备用承载
正式切换前,至少应有一份能由值班人员复核的验收记录:提交标识、Runner 标签、系统与工具链版本、构建和测试结果、签名及产物校验结果、回退条件、责任人。失败时也要记录具体阶段和差异;单次 PR 绿色不能代替正式发布链路的验证。
备用 Mac 只有在真实流水线已走通过时才能作为应急承载。确认代码获取方式、凭证交接、产物存放、审计记录与值班责任;任何一项没有测试证据,就把它列为未验证风险,而不是承诺能无缝接替 GitHub-hosted Runner。自托管 Runner 还需要你持续管理主机和 Runner 应用,并保证主机能与 GitHub Actions 通信,参见自托管 Runner 的机器要求。
若你的团队正在评估 Mac 承载方案,可以先查看 VPSNIX 的 Mac 服务信息,并通过服务帮助说明核对可用交付方式;实际是否适合生产发布,仍要以你自己的签名、凭证隔离和流水线验收结果为准。
SECTION 05 常见问题
Brownout 期间失败的作业都要迁移吗?
不必。先确认失败作业确实使用了公告覆盖的 macOS-14 标签,并且失败时间落入 Brownout 窗口;其余作业按自身日志排查。即便吻合,也应按发布风险决定迁移顺序,而不是将所有工作流一次性切换。
macOS-14 Runner 何时退役?
GitHub 公告确认退役日期为 2026 年 11 月 2 日。公告覆盖 macos-14、macos-14-large 和 macos-14-xlarge,并列出 Brownout 时段及替代标签。日期或窗口若有调整,应以 GitHub 后续公告为准。
迁到 macOS-15 还是 macOS-26?
先比对项目依赖的 Xcode、SDK、模拟器和架构,再对两个候选环境执行同一提交的构建、测试与签名。选择通过项目验收的标签,而不是仅因为版本较新就迁移;若目标环境尚未通过关键发布验证,先保留已验收的承载路径。
怎么证明 iOS 发布流水线迁移已完成?
保存完整运行记录,确认从依赖恢复到产物核验的关键环节都在目标 Runner 上成功,并记录使用的提交、工具链与标签。还要验证签名凭证权限、发布产物交接和审计留痕;如果只有编译或 PR 测试结果,发布链路仍未完成验收。
Brownout 期间直接依赖单一托管标签,可能遇到窗口内失败、退役期限和镜像差异;临时自建备用节点则会增加主机维护、凭证交接和审计责任。若你需要短期补充一条可控的 Mac 执行路径,可以评估 VPSNIX 的远程 Mac 租赁,但先用真实流水线验收再承载发布;需要固定环境长期高负载运行或依赖物理接口时,自购设备可能更合适。
SECTION 06 常见问题 FAQ
Brownout 期间,怎样判断 CI 失败是否由 macOS-14 退役造成?
先把失败作业的 UTC 时间与 GitHub 公布的 Brownout 窗口对照,再查看运行记录中实际匹配的 Runner 标签。只有时间与标签都吻合,才优先按退役影响处理;若标签不是 macOS-14,或失败发生在窗口外,应继续检查依赖、签名、网络和项目代码,不能仅凭一次失败归因。
GitHub Actions macOS-14 Runner 还能运行到哪一天?
GitHub 已公布 macOS-14、macOS-14-large 与 macOS-14-xlarge 将于 2026 年 11 月 2 日退役,并在此之前安排多个 Brownout 窗口。窗口内相关作业可能临时失败,退役前容量也可能减少;不要把 Brownout 当成服务稳定性保证,应按公告更新迁移计划并尽早验证替代环境。
macOS-14 作业应该迁到 macOS-15 还是 macOS-26?
不要只按系统版本新旧选标签。先确认项目所需 Xcode、SDK、模拟器运行时、依赖工具和架构,再对 macOS-15 与 macOS-26 的真实工作流做同提交对照;优先选完整构建、测试、签名与产物核验都通过的环境。若一边仍有兼容性缺口,就暂时保留已验收的备用路径。
切换 macOS Runner 后,iOS 发布流水线要验证哪些环节?
至少在目标 Runner 上验证依赖恢复、编译、目标设备或模拟器测试、归档、签名、导出和产物校验,并记录 Xcode、SDK、架构及签名结果。还要确认凭证的读取权限、构建产物的交接和审计记录;仅有 PR 测试通过,不能代表正式发布链路已经验收。