Нативная iOS · ночная сборка
Запускайте archive при push в Git, а загрузку поручите fastlane.
Зарегистрируйте облачный Mac как self-hosted runner GitHub Actions, GitLab Runner или агент Jenkins. После push в ветку релиза сначала получите код фиксированного коммита, затем создайте Release archive и IPA. Загрузка в TestFlight — отдельный этап: так ошибки сборки и загрузки можно устранять и повторять независимо.
Сначала подготовьте три вещи
- Задайте
WORKSPACE,SCHEMEиEXPORT_OPTIONS: укажите рабочую область, общую схему и конфигурацию экспорта соответственно. - Настройте сертификат подписи и профиль подготовки для текущего пользователя сборки. Управлять ими можно через fastlane match, а расшифрованные учетные данные передавайте через секреты CI.
- Задайте
ASC_API_KEY_JSON: путь к JSON-файлу ключа API App Store Connect для fastlane. Не храните ключ в репозитории.
Что проверить при приемке
Сохраните архив build/App.xcarchive, экспортированный IPA, идентификатор коммита и версию Xcode. Убедитесь, что TestFlight получил нужную сборку: успешное завершение команды сборки не означает, что загрузка завершена.
Почему эта конфигурация: 24 ГБ объединенной памяти Host M4 Plus подходят для повседневной сборки проектов с несколькими 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"