首页 / iOS 构建服务器
iOS 构建服务器
iOS 构建服务器能把一次提交变成已签名、已测试并上传到 TestFlight 的构建,全程无需有人操作 Mac。Hatmac 为你在云端提供独享的 Mac mini 或 Mac Studio 来运行整条流水线。
流水线概览
- 检出与依赖:从热缓存安装 Swift 包、CocoaPods 或两者。
- 测试:在 iOS 模拟器上并行运行单元测试和 UI 测试。
- 签名:把证书和描述文件装入临时钥匙串。
- 归档与导出:生成用于 App Store Connect 的
.ipa。 - 上传:使用 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 M5 Pro
24GB · 512GB SSD
Pro 级 CPU 与 GPU,适合重度构建和小型模型。
低至 $229/月
- 6 个月$249/月
- 12 个月$229/月
Mac Studio M5 Max
36GB · 512GB SSD
高 GPU 吞吐量,适合机器学习、渲染和并行 CI。
低至 $679/月
- 6 个月$699/月
- 12 个月$679/月
价格为每台机器起始配置的美元月费。需要更多内存、存储或多台机器?联系我们。
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。