原生 iOS · 夜间构建
让 Git 推送触发 archive,把上传留给 fastlane。
将云端 Mac 注册为 GitHub Actions self-hosted runner、GitLab Runner 或 Jenkins agent。推送到发布分支后,先检出固定提交,再生成 Release archive 与 IPA。上传 TestFlight 是独立步骤,便于把构建失败和上传失败分开重试。
先准备这三件事
- 设置
WORKSPACE、SCHEME与EXPORT_OPTIONS,分别指向工作区、共享 scheme 和导出配置。 - 将签名证书与描述文件配置到当前构建用户;可用 fastlane match 管理,解密凭据通过 CI 密钥注入。
- 设置
ASC_API_KEY_JSON,指向 fastlane 使用的 App Store Connect API 密钥 JSON。不要把密钥放进代码仓库。
验收时看什么
归档 build/App.xcarchive、导出的 IPA、提交标识与 Xcode 版本。确认 TestFlight 接收了对应版本;构建命令退出成功不等于上传已经完成。
选型理由:Host M4 Plus 的 24GB 统一内存适合多 target 日常构建。先串行跑通,再根据内存压力和 DerivedData 占用决定是否增加并发。
set -euo pipefail
: "${WORKSPACE:?Set WORKSPACE}"
: "${SCHEME:?Set SCHEME}"
: "${EXPORT_OPTIONS:?Set EXPORT_OPTIONS}"
: "${ASC_API_KEY_JSON:?Set ASC_API_KEY_JSON}"
mkdir -p build
xcodebuild -version
xcodebuild \
-workspace "$WORKSPACE" -scheme "$SCHEME" \
-configuration Release \
-destination 'generic/platform=iOS' \
-archivePath build/App.xcarchive archive
xcodebuild -exportArchive \
-archivePath build/App.xcarchive \
-exportPath build/export \
-exportOptionsPlist "$EXPORT_OPTIONS"
IPA_PATH="$(find build/export -type f -name '*.ipa' -print -quit)"
test -n "$IPA_PATH"
bundle exec fastlane pilot upload \
--ipa "$IPA_PATH" \
--api_key_path "$ASC_API_KEY_JSON"