认识 Xcode Cloud
Meet Xcode Cloud
2021年6月8日
一句话判断
Xcode Cloud 是苹果终于给出的 CI/CD 答案——深度集成 Xcode,零配置起步,但别指望它替代你现有的 Jenkins 流水线,至少目前不能。
这场 Session 讲了什么
Xcode Cloud 是苹果推出的云端持续集成/持续部署服务,直接内置在 Xcode IDE 和 App Store Connect 中。它做了几件事:当你 push 代码到 Git 仓库时,自动触发构建;在云端运行你写的单元测试和 UI 测试;构建完成后自动归档并分发到 TestFlight。整个流程不需要写任何 YAML 配置文件——至少简单的场景不需要。
Session 展示了从 Xcode 里创建一个 workflow 的全过程:选择触发条件(每次 push、pull request 或手动触发)、指定要构建的 scheme 和分支、配置测试设备矩阵。构建过程跑在 macOS 机器上(而不是 Linux),所以你的签名证书和 Provisioning Profile 都能正常工作。Xcode Cloud 会自动管理你的签名资源——你把证书上传到 App Store Connect,Xcode Cloud 在构建时自动使用,不用在 CI 脚本里处理 keychain 的折腾。
定价按「并发小时数」计费,在 beta 期间免费。对于小团队来说,这可能是最省心的 iOS CI 方案。
值得深挖的点
workflow 配置的 ci_scripts 目录。 虽然 Xcode Cloud 号称「零配置」,但当你需要自定义行为时(比如安装 CocoaPods 依赖、运行 SwiftLint、上传构建产物到其他平台),你需要在一个叫 ci_scripts/ci_post_clone.sh 的脚本里写逻辑。这个脚本在 Xcode Cloud 拉取代码后、正式构建前执行。Xcode Cloud 会注入一系列环境变量(CI_XCODEBUILD_SCHEME、CI_COMMIT_BRANCH 等),你可以据此做条件分支。这比 GitLab CI 或 GitHub Actions 简陋得多,但对于大多数 iOS 项目的需求来说够用了。
测试报告和截图的集成。 Xcode Cloud 跑完测试后,测试结果会自动出现在 Xcode 的 Report Navigator 里,和在本地跑测试的体验完全一致。UI 测试的截图也会自动关联到对应的测试用例。这对调试 flaky test 非常有帮助——你可以直接在 Xcode 里看到云端跑测试时的截图和视频,而不需要去某个 CI 系统的网页界面翻找。
代码片段
#!/bin/bash
# ci_scripts/ci_post_clone.sh
# Xcode Cloud 拉取代码后自动执行的脚本
set -euo pipefail
# 安装 CocoaPods 依赖(如果项目使用 CocoaPods)
if [ -f "Podfile" ]; then
gem install cocoapods --no-document
pod install
fi
# 运行 SwiftLint 检查代码风格
if command -v swiftlint &> /dev/null; then
swiftlint lint --reporter json > swiftlint-report.json || true
fi
echo "Post-clone 脚本执行完毕"
#!/bin/bash
# ci_scripts/ci_post_xcodebuild.sh
# 构建完成后执行的脚本
set -euo pipefail
# 如果构建成功,可以在这里做额外的部署操作
if [ "$CI_RESULT" = "success" ]; then
echo "构建成功,可以触发额外的部署流程"
# 比如上传 dSYM 到崩溃报告服务
# 或者通知 Slack 频道
fi
// 在 Xcode 中查看 Xcode Cloud 的构建状态
// Xcode > Report Navigator (Cmd+9) 可以看到所有云端构建记录
// 包括测试结果、截图、构建日志等
// workflow 的触发条件配置在 App Store Connect 中:
// App Store Connect > 你的 App > Xcode Cloud > Workflows
// 可配置:触发条件、分支过滤、scheme、设备矩阵
最佳实践
- 新项目接入 Xcode Cloud 时先用默认 workflow 跑通,再逐步添加自定义脚本——苹果的设计意图是让零配置能覆盖 80% 的场景
- 把耗时的依赖安装(CocoaPods、Carthage)放在
ci_post_clone.sh中,Xcode Cloud 目前不缓存这些依赖,每次构建都会重新下载 - 如果你有多个 scheme(比如 App 和 App Clip),为每个 scheme 创建独立的 workflow,触发条件可以分别设置
- Xcode Cloud 的 macOS 环境会预装 Xcode 和常用工具链,但版本可能滞后于最新版,检查环境变量
CI_XCODE_VERSION确认
还有什么值得关注
- Xcode Cloud 支持与 GitHub、GitLab、Bitbucket 集成,也支持自托管的 Git 仓库
- 每个 workflow 可以设置每日构建上限,避免意外消耗大量计算时长
- 构建产物(IPA、dSYM)会自动出现在 App Store Connect 的 Builds 列表中,不需要额外的上传步骤
- 并发构建数量取决于你的订阅计划,beta 期间的并发限制比较宽松