首页 / iOS 构建服务器

iOS 构建服务器

iOS 构建服务器能把一次提交变成已签名、已测试并上传到 TestFlight 的构建,全程无需有人操作 Mac。Hatmac 为你在云端提供独享的 Mac mini 或 Mac Studio 来运行整条流水线。

流水线概览

  1. 检出与依赖:从热缓存安装 Swift 包、CocoaPods 或两者。
  2. 测试:在 iOS 模拟器上并行运行单元测试和 UI 测试。
  3. 签名:把证书和描述文件装入临时钥匙串。
  4. 归档与导出:生成用于 App Store Connect 的 .ipa。
  5. 上传:使用 App Store Connect API 密钥上传到 TestFlight。

任何 CI 系统都能驱动这些步骤。可以先在 macOS CI/CD 运行器概览中选定系统,再按 Xcode 构建服务器指南配置 Xcode 版本和缓存。

Mac mini M6

最受欢迎

24GB · 512GB SSD

更大内存与存储,适合大型项目和缓存。

低至 $179/月

  • 月付$209/月
  • 6 个月$199/月
  • 12 个月$179/月
订购 Mac mini M6

Mac mini M5 Pro

24GB · 512GB SSD

Pro 级 CPU 与 GPU,适合重度构建和小型模型。

低至 $229/月

  • 6 个月$249/月
  • 12 个月$229/月
订购 Mac mini M5 Pro

Mac Studio M5 Max

36GB · 512GB SSD

高 GPU 吞吐量,适合机器学习、渲染和并行 CI。

低至 $679/月

  • 6 个月$699/月
  • 12 个月$679/月
订购 Mac Studio M5 Max

价格为每台机器起始配置的美元月费。需要更多内存、存储或多台机器?联系我们。

iOS 构建服务器上的代码签名

大多数无界面 iOS 构建都卡在签名上。服务器上需要两样东西:带私钥的分发证书,以及与 Bundle ID、团队和证书相匹配的描述文件。

  • 证书存放在钥匙串中。在构建服务器上应使用由任务解锁的专用钥匙串,而不是登录钥匙串。
  • 描述文件是 Xcode 从用户 Library 中读取的文件,会过期,设备或功能变化时需要更新。
  • Xcode 的自动签名在 CI 上也能用,但使用固定描述文件的手动签名更可预期。

用 fastlane match 共享签名

fastlane match 把加密后的证书和描述文件保存在私有 git 仓库或云存储桶中,让每位开发者和每台构建服务器使用同一套身份。先在开发机上创建一次,服务器端使用只读模式,确保 CI 永远不会创建或吊销证书。

fastlane match init                    # once, choose a private git repo
fastlane match development
fastlane match appstore
# on the build server, never create or revoke:
fastlane match appstore --readonly

MATCH_PASSWORD 和仓库访问密钥应保存在 CI 的机密存储中。

用 API 密钥上传到 TestFlight

请使用 App Store Connect API 密钥,而不是 Apple 账户密码。这样可以避免双重认证提示,也能单独吊销。在 App Store Connect 的“用户和访问 → 集成”中创建一个 App Manager 角色的密钥,把密钥 ID、Issuer ID 和 .p8 文件保存为 CI 机密。

lane :beta do
  setup_ci                             # temporary keychain for this run
  app_store_connect_api_key(
    key_id: ENV["ASC_KEY_ID"],
    issuer_id: ENV["ASC_ISSUER_ID"],
    key_content: ENV["ASC_KEY_P8_BASE64"],
    is_key_content_base64: true
  )
  match(type: "appstore", readonly: true)
  increment_build_number(build_number: ENV["BUILD_NUMBER"])
  build_app(scheme: "MyApp", export_method: "app-store")
  upload_to_testflight(skip_waiting_for_build_processing: true)
end

setup_ci 在检测到 CI 环境时会创建临时钥匙串,避免钥匙串弹窗。skip_waiting_for_build_processing 让运行器在上传完成后立即释放,不必等待 Apple 处理构建。

在模拟器上测试

只构建一次,然后在多个模拟器上测试。把 build-for-testing 与 test-without-building 分开,重跑测试时就无需重新编译。

# device names: see xcrun simctl list devices available
xcodebuild build-for-testing -scheme MyApp \
  -destination 'platform=iOS Simulator,name=iPhone 17' \
  -derivedDataPath "$HOME/ci-cache/DerivedData/MyApp"

xcodebuild test-without-building -scheme MyApp \
  -destination 'platform=iOS Simulator,name=iPhone 17' \
  -destination 'platform=iOS Simulator,name=iPad Pro 11-inch (M4)' \
  -derivedDataPath "$HOME/ci-cache/DerivedData/MyApp" \
  -parallel-testing-enabled YES -parallel-testing-worker-count 3 \
  -resultBundlePath build/Tests.xcresult
  • 并行测试会把测试类分配到多个模拟器克隆上运行。每个克隆都占内存,可承受的并发数取决于方案。24GB 机型建议从两到三个开始,再根据实测调整。
  • 多个目标设备可以在一条命令中同时跑 iPhone 和 iPad 测试。
  • 结果包(.xcresult)保存日志、截图和覆盖率,可作为 CI 产物归档。
  • 如果测试会残留状态,可在每次运行之间执行 xcrun simctl shutdown all 和 xcrun simctl erase all。

为 iOS 构建选择方案

团队与应用建议机型
单个应用、小团队、单元测试Mac mini M6,24GB / 512GB
较大应用、多模拟器 UI 测试Mac mini M5 Pro,24GB / 512GB
多个 target 或应用、大量并行 UI 测试Mac Studio M5 Max,36GB / 512GB
多个团队或大量并发任务多台机器组成构建农场

基于 GitHub Actions 的完整示例请阅读在云端 Mac mini 上做 iOS CI/CD。如果使用 Actions,注册和标签配置见 GitHub Actions Mac 运行器页面。

常见问题

iOS 构建服务器能把应用装到真机上吗?

不能直接安装。设备需要通过 USB 或本地网络与 Mac 配对,远程 Mac 无法连到你手边的设备。自动化测试请用模拟器,真机安装请通过 TestFlight。

需要加入 Apple Developer Program 吗?

分发签名和上传 TestFlight 或 App Store 需要。仅做模拟器构建和测试则不需要。

必须使用 fastlane 吗?

不是必须的。只用 xcodebuild 和 Apple 自带工具也能完成签名、归档和上传。fastlane match 及其上传功能只是让签名和 TestFlight 发布更容易重复执行。

在租用的 Mac 上放签名身份安全吗?

每台 Hatmac 机器都是只分配给你的独享物理 Mac。请把证书放在独立钥匙串中,密码保存为 CI 机密,并以只读模式使用 match。