Runner 成本

GitHub Actions macOS runner:
托管计费与自托管怎么算

iOS 项目在 GitHub Actions 上构建,绕不开 macOS runner。GitHub 托管的 macOS runner 开箱即用、按分钟计费;自托管 runner 需要自己准备 Mac,费用按机器算。这篇说明两者的计费方式、怎样估算哪种更划算,以及自托管时的安全注意事项。具体单价请以 GitHub 官方文档为准。

三万主机 · 更新于

01 / BILLING

GitHub 托管 macOS runner 怎么计费

GitHub 托管 runner 按 job 的运行时长计费,以分钟为单位向上取整。私有仓库使用时,先消耗账户套餐内包含的分钟数,超出后按各操作系统和规格的单价付费;macOS runner 的单价明显高于 Linux,规格越大单价越高。公开仓库使用标准规格的托管 runner 不收费。

几个容易忽略的点:

  • 计时从 job 开始到结束,包括检出代码、安装依赖、恢复缓存、等待测试的时间,而不只是编译本身。
  • 每个 job 单独向上取整,把一条流水线拆成很多短 job 会多计时间。
  • 缓存(actions/cache)和制品存储有独立的容量与计费规则。

资料来源:GitHub Docs:About billing for GitHub Actions,About GitHub-hosted runners

02 / ESTIMATE

用自己的数据估算月度费用

不必先猜,GitHub 的账单页面(Settings → Billing)可以看到各 runner 类型已用分钟。也可以按下面的方法粗算:

每月 macOS 分钟 ≈ 每天构建次数 × 每次平均分钟 × 工作日数
每月费用 ≈ (每月 macOS 分钟 − 套餐内可用于 macOS 的部分) × macOS 单价

单价和套餐分钟数从 GitHub 官方计费文档读取。一次 iOS 构建加单元测试和 UI 测试,时长常常远超同等的 Linux 任务,构建频繁的团队这笔费用增长很快。

03 / SELF-HOSTED

自托管 runner 的成本结构

自托管 runner 把计费单位从“分钟”换成“机器”:购买 Mac 的一次性支出(或按月租金)、电费与网络、维护时间。机器费用与构建次数无关,跑得越多,摊到每次构建上越便宜。

此外,自托管 Mac 的环境常驻:Xcode、模拟器运行时、CocoaPods 和 Swift Package 缓存、DerivedData 都保留在磁盘上,增量构建通常比每次从全新环境开始更快,排队时间也只取决于你自己的机器数量。

流水线里只需把 runs-on 指向自托管标签,托管和自托管可以并存,例如 Linux 任务继续用托管 runner:

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
  ios:
    runs-on: [self-hosted, macOS, ARM64, ios]
    steps:
      - uses: actions/checkout@v4
      - run: xcodebuild -scheme MyApp -destination 'generic/platform=iOS Simulator' build
04 / WHEN

什么时候自托管更划算

  • 构建量稳定且较大:按上面的公式算出的月度托管费用,接近或超过一台 Mac 的月租时。
  • 依赖重:Flutter、React Native、大量 Pod,每次在全新环境安装依赖要花不少分钟。
  • 需要特定环境:特定 Xcode 版本组合、内网服务、长期运行的测试设施。

反过来,构建偶尔才跑、团队没人维护机器、或者主要是公开仓库,用托管 runner 更省心。对比购买与租用的总成本,可以用 租还是买计算器;与 Xcode Cloud 的对比见 Xcode Cloud 与自建构建机。

05 / SECURITY

自托管 runner 的安全注意事项

  • 不要用于公开仓库:任何人都能提交 Pull Request,工作流可能在你的机器上执行任意代码。GitHub 官方也不建议这样做。
  • 独立的 macOS 用户:为 runner 建单独的非管理员用户,不要让它接触你个人账户的钥匙串和文件。
  • 短生命周期:注册时加 --ephemeral,runner 执行完一个 job 就自动注销,适合配合自动重新注册的脚本。
  • 组织级管理:在组织中用 runner 组限制哪些仓库可以使用这台机器。
  • 密钥最小化:签名证书用临时钥匙串,API Key 放在 GitHub Secrets 中,不在磁盘上留明文。
./config.sh --url https://github.com/<组织>/<仓库> --token <令牌> \
  --labels ios --ephemeral

完整的注册与服务配置步骤见 iOS 构建机配置指南。

FAQ

常见问题

公开仓库用 GitHub 托管的 macOS runner 要钱吗?

按 GitHub 当前规则,公开仓库使用标准规格的 GitHub 托管 runner 不收费,更大规格的 runner 则单独计费。私有仓库会消耗套餐内的分钟数,超出部分按量付费。规则可能调整,请以 GitHub 计费文档为准。

自托管 runner 完全免费吗?

机器和网络费用由你自己承担。GitHub 侧是否对自托管 runner 收取平台费用,近年有过调整和讨论,决定前请查看 GitHub 官方计费文档和公告,以当前条款为准。

一台自托管 Mac 能同时跑几个任务?

一个 runner 进程同一时间只执行一个 job。想并行,可以在同一台 Mac 上注册多个 runner(各用独立目录),但要注意它们共享 CPU、内存和模拟器,Xcode 并行构建时内存压力较大。

微信
微信客服二维码扫码加微信客服手机上长按二维码识别
Telegram 客服