CI 选型

Xcode Cloud 还是自建 Mac 构建机:
计费、缓存与适用场景

iOS 团队搭 CI 时,常在两条路之间选择:Apple 官方的 Xcode Cloud,或一台自己维护的 Mac 构建机(自托管 runner)。这篇从计费方式、可定制性、缓存、并发和维护成本几个维度对比两者,并给出选择建议。涉及价格和额度的部分以 Apple 官方页面为准。

三万主机 · 更新于

01 / OVERVIEW

两种方案分别是什么

Xcode Cloud 是 Apple 提供的 CI/CD 服务,集成在 Xcode 和 App Store Connect 中。连接 GitHub、GitLab 或 Bitbucket 仓库后,在 Xcode 里配置工作流(触发条件、构建、测试、归档、分发),构建在 Apple 的云端执行,结果可以直接发布到 TestFlight。

自建 Mac 构建机指一台你自己掌控的 Mac,上面运行 GitHub Actions、GitLab Runner、Jenkins 或 Buildkite 等的 agent。这台 Mac 可以放在办公室、托管机房,也可以远程租用。配置步骤见 把 Mac mini 变成 iOS 构建机。

02 / COMPARE

逐项对比

维度Xcode Cloud自建 Mac 构建机
计费按计算小时计费,开发者计划包含一定免费额度,超出部分按订阅档位付费硬件购买或按月租金,费用与构建次数无关
环境每次构建为全新环境,Xcode 和 macOS 版本从 Apple 提供的列表中选择完全由你控制,可以装任意工具和多个 Xcode 版本
缓存缓存策略由平台决定,用户能调整的余地较小DerivedData、依赖、模拟器常驻本地
并发由平台调度,受计算时间额度约束取决于机器数量和配置
与 Apple 集成原生集成签名、TestFlight 分发和 App Store Connect需要自己配置签名和上传(如 fastlane)
维护几乎不需要需要升级系统和 Xcode、清理磁盘、监控在线状态

资料来源:Apple:Xcode Cloud(含当前额度与订阅价格)

03 / CACHE

缓存与构建速度

iOS 构建时间很大一部分花在依赖解析和全量编译上。在以全新环境为基础的托管平台上,平台未缓存的内容(例如在 ci_scripts 里安装的 Flutter SDK、Node 依赖)每次都要重新准备,这部分时间同样计入计算时长。

常驻的自建机则不同:DerivedData 留在磁盘上,第二次以后多数是增量编译;Swift Package 和 CocoaPods 缓存都在本地;模拟器已经创建好,不需要每次启动新设备。代价是缓存可能“脏”,偶尔需要手动清理:

# 清理 DerivedData(构建异常时)
rm -rf ~/Library/Developer/Xcode/DerivedData/*
# 删除不可用的模拟器
xcrun simctl delete unavailable
# 查看磁盘占用
du -sh ~/Library/Developer/*
04 / CUSTOM

可定制性:脚本钩子与完全控制

Xcode Cloud 允许在项目根目录的 ci_scripts 文件夹中放置约定名称的脚本,例如 ci_post_clone.sh(克隆后)、ci_pre_xcodebuild.sh(构建前)、ci_post_xcodebuild.sh(构建后),用于安装依赖或上传产物。它覆盖了大部分常见需求,但运行环境本身由 Apple 决定。

自建机没有这类限制:可以长期运行一个本地服务供测试使用、接入内网资源、保留多个 Xcode 版本并用 DEVELOPER_DIR 切换、在同一台机器上跑 Android 或后端任务。也意味着安全由你负责,例如只在私有仓库使用自托管 runner、为 runner 单独建 macOS 用户。

05 / CHOOSE

怎么选

  • 倾向 Xcode Cloud:纯 Swift / SwiftUI 项目、构建量不大、团队不想维护机器、看重与 TestFlight 的一体化。
  • 倾向自建构建机:每天构建次数多、依赖重(Flutter、React Native、大量 Pod)、需要特殊工具或多个 Xcode 版本、希望费用按月固定。
  • 混合:发版和分发走 Xcode Cloud,耗时的测试矩阵放在自建机上。

判断费用时,可以先统计最近一个月的构建次数和平均时长,按 Apple 官方价格估算计算小时开销,再与一台构建机的月租对比。三万主机的 Mac mini 按月租用 是自建方案的一种形式,也可以用 租还是买计算器 对比直接购买。如果你也在考虑 GitHub 托管 runner,见 GitHub macOS runner 费用对比。

FAQ

常见问题

Xcode Cloud 能构建 Flutter 或 React Native 项目吗?

可以,但需要在 ci_scripts 目录的脚本里自行安装 Flutter SDK、Node、CocoaPods 等依赖,每次构建都要重新执行。依赖越多,准备环境花的计算时间越长。自建构建机可以把这些工具常驻安装。

两者能同时用吗?

可以。常见做法是用 Xcode Cloud 处理与 Apple 生态紧密的发版流程,比如自动分发 TestFlight;把耗时的测试矩阵、需要特殊工具的任务放到自建 Mac 上。也可以反过来,主力用自建机,Xcode Cloud 作为备用。

自建构建机需要多大内存?

单个原生项目、偶尔跑模拟器测试时,16 GB 一般够用;同时跑多个模拟器、多条流水线并行,或者 Flutter 与原生混合的大工程,建议 24 GB 以上,存储至少 512 GB,用来放多个 Xcode 版本和模拟器运行时。

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