开发团队对照 GitHub Actions 与自建 Mac CI 节点的效率指标

平台组开迁移评审会,老板只问一句:「从 GitHub Actions 换到自建 Mac 节点,开发效率到底能提升多少?」——如果回答「构建快了一点」,会议通常开不下去。2026 年我们帮几支 iOS / Flutter / React Native 团队做过对照实验:迁到自托管 Mac 节点(办公室 Mac mini、机房裸金属、或 Cloud Mac 挂 Runner)之后,最大收益往往不是编译本身,而是排队与等待归零。下文用可复现的四类指标、三套真实量级对照表,回答「提升了多少」;并附两周可落地的迁移清单与 ROI 粗算。

交付声明:文中数字来自 2025 Q4–2026 Q2 间协助迁移的匿名团队样本(8–35 人规模),仓库含 Swift / Kotlin Multiplatform / RN;硬件以 M4 16GB 与 M4 Pro 24GB 为主。你的仓库体积不同,请用文末公式套自己的数据,截至 2026-07-20

Quick Answer:效率提升多少?

你关心的托管 macOS runner(迁移前)自建 Mac 节点(迁移后)典型提升幅度
PR 推到绿勾(端到端)42–68 分钟9–16 分钟约 70%–80% 缩短
排队等待(queue time)15–45 分钟/次0–2 分钟接近归零
单次 Archive 构建11–14 分钟8–11 分钟约 15%–25%(缓存命中后)
发版夜可出 TestFlight 版次1–2 版3–5 版吞吐约 2–3 倍
开发者周被动等待3–6 人时/人0.5–1.2 人时/人约 75% 减少

一句话:开发效率提升的主项是「等待」,不是「编译器变快」。自建节点把稀缺 macOS 池从共享队列里摘出来,再叠持久化 DerivedData,才出现上表的量级。

先量什么,再谈「提升了多少」

很多团队迁移后觉得「没快多少」,是因为只看了 GitHub Actions 里的 Job duration,忽略了 queue time 和人在 Slack 里干等的时间。建议迁移前后各采两周,至少记四类数:

  • 排队等待job queuedjob started 的秒数,按 P50 / P95 汇报
  • PR 反馈环:最后一次 push 到 required checks 全绿的时间
  • 发版窗口吞吐:固定 4 小时窗口内成功上传 TestFlight 的次数
  • 被动等待人时:抽样问开发者「今天等 CI 多久」或从 PR 评论时间戳推算

导出方式:GitHub API 的 run_started_atcreated_at 相减;或在 workflow 里加一步把 queue 秒数写入 artifact。没有基线就迁,事后很难向管理层证明 ROI。

指标怎么采迁移成功信号
Queue P95Actions API / 自定义 step从 >20min 降到 <3min
PR 反馈 P50PR 事件时间戳下降 >50%
缓存命中率DerivedData 目录体积 + 构建日志从 <20% 升到 >60%
并发失败率同机多 Job 失败占比隔离目录后 <2%

三套团队对照:迁移前 vs 迁移后

下面三组数据均来自真实迁移项目(团队名匿名化),条件已对齐:同一仓库、同一 Xcode 大版本、采样两周工作日。

案例 A:12 人 iOS 团队,单 App + 扩展

迁移前全部跑 macos-14 托管 runner;迁移后 2 台 M4 16GB Cloud Mac 自托管 Runner,DerivedData 挂本地 NVMe 路径。PR 日均 18 次。

指标迁移前迁移后变化
PR 反馈 P5052 分钟11 分钟−79%
Queue P9538 分钟0.8 分钟−98%
Archive 单次12.4 分钟9.1 分钟−27%
发版夜 TestFlight 版次1.5 版/夜4 版/夜+167%

Tech Lead 原话:「以前下午五点 push,六点半才能知道能不能合;现在去倒杯水回来就绿了。」

案例 B:28 人 KMP + Android 主仓,Mac 只做 iOS 壳

迁移前 macOS Job 与 Android Job 抢同一发版窗口;迁移后 1 台常驻 M4 Pro + 发版周加 2 台 burst Cloud Mac(见 发版 burst 玩法)。

指标迁移前迁移后变化
双端 PR 全绿 P5071 分钟24 分钟−66%
发版周 Queue 总时长/日6.2 小时0.4 小时−94%
开发者周等待(问卷均值)4.8 人时1.1 人时−77%

案例 C:8 人 indie,月发版 2 次

反例对照:他们迁移后几乎没提升——因为 PR 少、无排队,自建机反而多了钥匙串维护。Archive 仅从 10.2 分钟降到 9.4 分钟(−8%),Queue 本就接近 0。这说明「提升多少」高度依赖负载形态,不能照搬大厂数据。

读表时注意:案例 A/B 的收益里,约 60%–75% 来自排队归零,约 15%–25% 来自 DerivedData / SwiftPM 持久缓存,余下是并发加机。只换 runner 不做缓存,提升会腰斩。

提升从哪来:排队、缓存、并发

把总等待时间拆开,更容易向非技术负责人解释:

PR 总耗时 ≈ 排队等待 + 环境准备 + 编译测试 + 上传制品

1. 排队(最大头):GitHub 托管 macOS runner 是共享池,发版周、Xcode 大版本升级周后 P95 排队 30+ 分钟不罕见。自建节点 = 独占执行器,queue 项几乎消失。

2. 冷启动与缓存:托管 Job 结束即销毁,DerivedData、Pods、SwiftPM 缓存每次重来。自建机把热目录挂持久卷,二次构建常见快 20% 左右;细节见 自托管 Runner 缓存与磁盘 FAQ

3. 并发:2–3 台 Mac 并行接矩阵 Job,发版夜不再「一串糖葫芦」排队。注意多 Job 同机要写目录隔离,否则随机失败会把效率增益吃回去。

阶段托管 runner 典型占比自建节点后
排队45%–70%<5%
依赖解压 / 索引15%–25%5%–10%(有持久缓存)
纯编译测试20%–35%15%–30%

两周迁移路径:先对照,再切流量

不建议周五下班「一把梭」切生产。可复现的节奏如下:

  • 第 1–2 天:从 Actions 导出两周 queue / duration 基线;选 1 台 Cloud Mac(约 5 分钟开通)装 Runner,runs-on: [self-hosted, macos, canary] 仅手动触发
  • 第 3–5 天:持久化 ~/ci/DerivedData 与 SwiftPM 缓存;同一 main commit 跑 A/B 各 5 次,记 P50
  • 第 6–8 天:Release / nightly workflow 切 50% 流量到自建 label;托管 runner 保留作 fallback
  • 第 9–10 天:PR required checks 全切自建;写磁盘 80% 水位与产物清理 cron
  • 第 11–14 天:对照表复盘,向管理层报 ROI;决定常驻 1 台还是继续按天租 burst

编排层仍用 GitHub Actions——YAML、权限、环境保护规则都不用换平台,只改 runs-on。这与 企业 Mac CI 资源池选型 里的「编排与执行分离」是同一思路。

最小 Workflow 改动示例

jobs:
  ios-build:
    # 迁移前:runs-on: macos-14
  ios-build:
    runs-on: [self-hosted, macos, ios-pool]
    steps:
      - uses: actions/checkout@v4
      - name: Log queue metrics
        run: echo "QUEUE_SEC=${QUEUE_SEC:-0}" >> $GITHUB_STEP_SUMMARY

若你尚未决定买不买机器,按天租 M4 Cloud Mac 做两周对照,成本通常低于「全组人多等一小时」的人力账。

ROI 粗算:效率账能不能盖住机器账?

用案例 A 的数字举个可套用的公式(时薪按 blended $55 估,仅示意):

  • 12 人 × 每周少等 3.7 人时 ≈ 44 人时/月$2,420/月 等价产出(或更早合 PR 减少冲突返工)
  • 2 台 M4 16GB Cloud Mac 月租约 $206($103/台 × 2,以定价页为准)
  • 平台兼职运维约 4–8 人时/月(磁盘、证书、Runner 升级)

粗算净收益仍为正——但小团队低频构建(案例 C)可能算不过来。决策前用你自己团队的 queue P95 代入:

月收益 ≈ 开发者数 × 每周少等人时 × 4 × 时薪 − 机器月租 − 运维人时 × 时薪

发版周还可临时加第三台机做 burst,平峰退租,避免全年为峰值买单。买 vs 租的长期 TCO 对照见 买 Mac mini 还是租 Cloud Mac

什么时候别迁?——避免为迁移而迁移

下列情况我会明确建议先别动,或只租一周做验证:

  • 月 macOS Job <30 次,且 Queue P95 长期 <5 分钟——提升天花板很低(案例 C)
  • 无人能 on-call 维护 Runner——磁盘打满比排队更搞心态
  • 安全合规要求机器必须在自有 VPC——先解决网络与密钥方案,再上自建池
  • 以为迁完就不用 GitHub Actions 了——编排、审计、权限仍值得留在平台上

迁移是手段,目标是可测量的等待时间下降。两周对照实验做不出 >30% 的 PR 反馈改善,就该先优化 workflow(拆 Job、减 Archive 频率),而不是先买三台 Mac。

常见问题 FAQ

从 GitHub Actions 迁到自建 Mac,开发效率一般能提升多少?

高频 iOS 团队常见 PR 反馈缩短 70% 左右排队接近归零;纯编译快 15%–25%。低频团队可能只有个位数百分比——务必先采基线。

只加一台 Mac 够吗?

对 10 人以内、串行发版通常够;若矩阵测试或多 App 并行,建议 2 台起,并设并发上限避免互踩缓存。

自建后 Actions 账单会降多少?

macOS 分钟数往往可降 60%–90%(视你把多少 Job 迁走);但会增加机器租购与运维。总账要用上文 ROI 公式一起看。

Cloud Mac 和办公室 Mac mini 效率有差吗?

同芯片同内存下,编译性能接近;差别在网络 RTT(拉依赖、上传制品)与磁盘是否 NVMe。选离代码托管与制品库近的节点。

迁移会影响签名与公证吗?

不会 magically 变好,但环境稳定后钥匙串与描述文件漂移减少,间接少了很多「只在 CI 复现」的半夜救火。

要多长时间才能看见提升?

Runner 接好且缓存目录生效后,第一个工作日就能在 queue 指标上看到变化;PR 反馈环建议采满两周再汇报。

总结与延伸阅读

从 GitHub Actions 迁移至自建 Mac 节点,开发效率提升的答案不是模糊的「快很多」——在典型 iOS 团队里,PR 反馈缩短约七成、发版吞吐翻倍是常见量级,其中大头是排队消失,其次才是持久缓存。用两周对照实验、四类指标和 ROI 公式,你可以给出老板能听懂的数字;若对照不明显,先优化 workflow 比先买机器更划算。