GitHub Actions 上跑 macOS CI,慢到让人怀疑人生——这正常吗?
如果你用的是托管 macos-latest,慢,而且往往先慢在 queue,不是慢在 CPU。 周一上午 push 后 job 在「Queued」里挂 20–40 分钟,iOS 团队里太常见了。
本篇是 Cloud Mac AI Stack · L1 专题第二篇(前置:① 执行引擎):从「排队到底有多严重」出发,讲清 self-hosted runner vs macos-latest 在队列、CI cost 与 xcodebuild 上的差异。L0 买/租决策见 Mac mini 还是云电脑;专题目录见 § L1 连载。
Featured Snippet · 直接回答
GitHub Actions macOS CI 在托管 runner 上「很慢」通常是正常的——最大瓶颈往往是 build queue,而不是 Apple Silicon 算力。
- 托管
macos-latest:高峰 queue time 20–40 分钟 不罕见,墙钟时间波动大 - Cloud Mac self-hosted runner:独享节点,基本不排队,
xcodebuild更稳定 - 是否划算:看每月 macOS CI 频率——每周 <5 次可先托管;日更 iOS CI 且讨厌排队 → 考虑自建
带着这些问题点进来的?
如果你是因为下面某个具体疑问找到这篇,不用从头读——点链接直接跳到对应段落:
- GitHub Actions self-hosted runner macOS 值不值得? → 见Cloud Mac 真实 TCO与决策树
- Cloud Mac 跑 CI 会不会更快? → 见queue 比 CPU 更伤人
- macos-latest 为什么总是在排队? → 见iOS CI 为何卡在排队
- self-hosted runner 是不是免费 CI? → 见误判:self-hosted ≠ 免费
- iOS CI 为什么 build 时间很不稳定? → 见性能差异与三种方案对比表
三个词先对齐 · L1 专题导航
macOS CI = 需要 Xcode / Apple Silicon 的 job · Cloud Mac = 常驻 macOS 底座(L0) · self-hosted runner = 在这台 Mac 上接 GitHub Actions 任务的进程(L1)
L1 建议顺序:① 执行引擎 → ② 本篇 · 排队 → ③ workspace 隔离
租 Cloud Mac 不会自动有 runner;装了 runner 也不等于 CI 免费——只是把 GitHub Actions billing 换成 Cloud Mac 月租 + 运维。
self-hosted runner vs macos-latest:三种 macOS CI 方案对比
性能指墙钟时间与 queue time 稳定性,非 Geekbench:
| 维度 | 托管 macos-latest |
Cloud Mac self-hosted runner | 本地 Mac self-hosted runner |
|---|---|---|---|
| CI cost 模型 | 按分钟计费(GitHub Actions billing) | Cloud Mac 月租 + 运维 | 硬件一次性 + 电费 |
| build queue / 等待 | 高峰常排队 20–40+ 分钟 | 独享节点,基本不排队 | 不排队(机器在线时) |
| xcodebuild 稳定性 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| Apple Silicon CI | 共享池,环境每次可能不同 | 固定 Xcode / 证书 / DerivedData | 同左 |
| 适合谁 | 低频 archive、能接受 queue | 日更 iOS CI、讨厌排队 | 已有 Mac mini 且 24/7 在线 |
为什么 macOS CI 最大成本不是 CPU,而是 queue time?
很多人打开 Actions 日志,看到 xcodebuild 跑了 18 分钟,就以为「机器不行」。但更伤人的往往是日志之前那段时间——job 状态一直是 Queued。
对 iOS 团队来说,墙钟时间 = queue time + build time + 偶发重试。托管 macos-latest 的 queue 在工作日高峰不可控;你付的是 macOS 分钟费,但人等 PR 变绿的时间没法开票,却真实消耗研发节奏。
所以判断「CI 慢」要先拆开:是排队慢,还是编译慢? 前者换 self-hosted runner(Cloud Mac 或本地 Mac)收益最大;后者才值得查 Xcode 版本、缓存与依赖。
iOS CI 为什么在 GitHub Actions 上经常「卡在排队」?
macos-latest 跑在 GitHub 的共享 macOS runner 池里,供给有限、需求集中:
- iOS CI 只能 macOS:不能像 Node 项目那样丢给
ubuntu-latest,所有 Apple 生态 job 挤同一类池子 - 高峰叠加:美东/欧洲上午 + 亚洲下午,全球 push 撞在同一时段
- 并发也排队:workflow 里开 3 个 macOS job,不是 3 倍快——往往 3 倍等
- 分钟费照收:排队结束后,
xcodebuild每分钟仍计入 GitHub Actions billing
典型体感:PR 已 review 完,Checks 还黄着——不是代码有问题,是 runner 还没轮到。 这就是「macOS CI 很慢是正常的吗」里「正常」的含义:在托管池上,慢是结构性问题,不是你没配置好。
两个常见误判
误判 ①:「上了 Cloud Mac,CI 自然就好了」
Cloud Mac 解决的是有一台常驻 macOS。Claude Code SSH 改代码,和 Actions 在 Linux 上跑测试,可以同时发生——于是「终端里 Agent 很欢,PR 里 xcodebuild 报错」。要消灭 queue,你得注册 self-hosted runner 并写对 runs-on 标签。
误判 ②:「self-hosted runner = 免费 CI」
GitHub 对 self-hosted 不收每分钟算力费,但机器钱、Cloud Mac 月租、证书、值班都是你的。只是把账单从 GitHub 换成自己的 TCO——没有谁白嫖 macOS CI。
Cloud Mac self-hosted runner 的真实 TCO 计算方式
别只比标价。真正要算的是:macOS 分钟数 × 单价 + queue 造成的人等成本 + 运维时间。
① 托管 macos-latest
按实际运行分钟计费(macOS 单价显著高于 Linux,以 GitHub 当前价目为准)。零运维,但 build queue 不可控。
粗算:仓库 Actions → Billing,看 30 天 macOS CI 分钟数。每月 <200 分钟且能接受偶发排队 → 托管往往最省事。
② Cloud Mac + self-hosted runner
成本 = Cloud Mac 月租 + 注册人力(约 1–2 小时)+ workspace 清理。换来的是接近零 queue time 的 Apple Silicon CI 专机。
经验阈值(与L1-Q01一致):每周 macOS job ≥10 次,且讨厌排队,固定 Cloud Mac 节点的 TCO 往往低于「托管分钟费 + 等待损耗」。租价见套餐说明。
③ 本地 Mac mini + self-hosted runner
成本 = 硬件 + 电费 + 24/7 在线保证。对照Mac mini vs 云 Mac:本来就要买 Mac 做 iOS 开发,顺带挂 runner 很顺;只为 CI 买一台,很多人选 Cloud Mac 更灵活。
托管月成本 ≈ macOS CI 分钟数 × 每分钟单价 + queue 造成的人等时间 Cloud Mac 月成本 ≈ 月租 + 轻量运维(换来稳定 queue time) 当 托管月成本 持续 > Cloud Mac 月租 → 考虑 self-hosted(Cloud 或本地)
self-hosted runner vs macos-latest:队列与 xcodebuild 性能差异
self-hosted 不一定 CPU 更快,但墙钟时间通常更短、更稳——因为砍掉了 queue:
- queue time:托管共享池 vs 自建独享 → 最大差异在这里
- xcodebuild:独享节点冷启动与磁盘状态一致,iOS CI build 时间方差更小
- 并发:一台 self-hosted 默认 1 job;托管可多 job,但 macOS 并发仍要排队
- 环境:自建固定 Xcode、钥匙串、DerivedData;托管每次可能是干净但陌生的镜像
若 Runner 与 Ollama / Claude Code 抢内存导致 Swap,见AI 工作负载调度——有时「慢」是内存,不是 queue。
什么时候 Cloud Mac 自建 self-hosted runner 更值?
- 每天至少 1 次 iOS CI workflow,且受够了 build queue
- workflow 含
xcodebuild、签名、notarize、TestFlight - 希望 push 后 5–15 分钟内看到 Checks 变绿/变红(Fact 层不迟到)
- 想在同一 Cloud Mac 跑 Claude Code + CI,减少「SSH 绿了、Actions 红了」
到这一步,问题不是「要不要 self-hosted」,而是 Cloud Mac 还是本地 Mac 挂 runner。
什么时候继续用 macos-latest 更聪明?
- 每月只 archive 一两次,能接受偶发 queue
- 主仓库 Linux runner 已全绿,macOS job 很少
- 团队还在验证要不要做 iOS——先托管跑通比先租固定节点划算
- 没人维护 runner 升级、token 轮换、磁盘清理
同一台 Cloud Mac:Claude Code + Runner 现实吗?
可以。白天 Claude Code 改代码,夜间或错峰跑重 xcodebuild。16GB 统一内存若 Ollama + Runner + Agent 同时满载会 Swap——CI 反而变慢。系列 Slogan:Claude Code 生产 Diff,GitHub Runner 生产 Fact。
决策树:queue 忍不了之后怎么办?
workflow 需要 macOS / Xcode 吗?
↓
否 → 继续 Linux 托管
是 → build queue 能接受吗?(20–40 分钟)
↓
能 → 继续 macos-latest
否 → 每月 macOS job > ~10 次?
↓
否 → 仍可先托管,观察 Billing
是 → 需要 24/7 在线?
↓
是 → Cloud Mac self-hosted runner
否 → 本地 Mac 自建(保证开机)
务实做法:保留托管,同时租 Cloud Mac 试跑两周,对比 queue time、GitHub Actions billing 与 xcodebuild 墙钟时间。
常见问题
GitHub Actions macOS CI 很慢是正常的吗?
在托管 macos-latest 上很常见。慢往往先发生在 queue,高峰 20–40 分钟不罕见。
macos-latest 为什么总是在排队?
共享 macOS runner 池供给有限,iOS CI 只能挤这一类资源,全球高峰叠加。
GitHub Actions self-hosted runner macOS 值不值得?
日更 iOS CI、无法忍受 queue 时通常更值;低频 job 先用托管。
Cloud Mac 跑 CI 会不会更快?
不一定 CPU 更快,但基本不排队,Apple Silicon 上 xcodebuild 更稳定。
self-hosted runner 是不是免费 CI?
不是。GitHub 不收分钟费,但 Cloud Mac 月租与运维是你的。
iOS CI 为什么 build 时间很不稳定?
queue 波动 + 托管镜像每次可能不同;自建可固定环境与缓存策略。
能和 Claude Code 同机吗?
可以,但要错峰。见调度文。
macOS CI 慢,不一定是你的 pipeline 写错了——先看清是 queue 还是 build,再决定要不要上 Cloud Mac self-hosted runner。
L1 专题连载 · 与 Stack 各层怎么接
| 篇目 | 主题 | 状态 |
|---|---|---|
| ① · 执行引擎 | 为什么 Runner 是 L1(Diff → Fact) | 已发布 |
| ② · 本篇 | macOS CI 排队 · self-hosted vs macos-latest |
已发布 |
| ③ · workspace 隔离 | 自建 Runner 安全大坑 · 一 Job 一 Workspace 行业标配 | 已发布 |
| ④ · OpenClaw | Runner 执行 step · OpenClaw 编排回执 | 已发布 |
纵向:L0 买/租 · L2 并行排班 · L3 Claude Code · L4 MCP 权限
L1 专题 · 下一篇
自建 runner 后,别共用 workspace
排队与 TCO 搞定之后,下一篇讲自建 runner 最常见的 CI/CD 安全大坑:一 Job 一 Workspace 行业标配与 token 轮换 runbook。
阅读 workspace 隔离