Настройка автоматичної раздачі білдів через TestFlight
Ручна загрузка через Xcode Organizer—джерело біля в будь-якій iOS-команді. Забутий флаг include bitcode, застарілий сертифікат, що лежить тільки на MacBook одного розробника, Upload Error 409 без пояснення—все це зупиняє доставку білда тестувальникам на кілька годин. Автоматична загрузка в TestFlight через altool або Fastlane прибирає людину з цієї цепочки.
Проблема з сертифікатами у CI
Головний технічний бар'єр—Code Signing. У Xcode Organizer це відбувається «само», тому що Xcode бере сертифікат та provisioning profile зі зв'язки ключів macOS. У CI такої зв'язки немає. Без настройки отримуємо:
error: exportArchive: No signing certificate "iOS Distribution" found
Варіантів два: match від Fastlane (рекомендується для команд) або sigh + cert (для одиночного проекту). match зберігає сертифікати та профіли в зашифрованому Git-репозиторії, CI клонує його перед сборкою та імпортує в тимчасову keychain. Не потрібно пробрасувати файли вручну.
Як влаштована автоматична загрузка
altool (застарілий, але все ще робочий) та xcrun altool --upload-app вимагають App Store Connect API Key. Зараз Apple рекомендує xcrun notarytool для macOS та altool для iOS, але насправді, Fastlane pilot (deliver для метаданих) надійніше—обробляє помилки та ретраї.
Типовий Fastfile для TestFlight:
platform :ios do
lane :beta do
setup_ci # настроює тимчасову keychain у CI
match(
type: "appstore",
readonly: true,
git_url: ENV["MATCH_GIT_URL"],
password: ENV["MATCH_PASSWORD"]
)
increment_build_number(
build_number: ENV["CI_BUILD_NUMBER"] || Time.now.to_i.to_s
)
build_app(
scheme: "MyApp",
configuration: "Release",
export_method: "app-store"
)
upload_to_testflight(
api_key_path: "fastlane/api_key.json",
skip_waiting_for_build_processing: true,
changelog: ENV["CHANGELOG"] || "Automated build"
)
end
end
skip_waiting_for_build_processing: true важливий—без нього Fastlane блокується на 10–20 хвилин, пока Apple обробляє білд. У CI це займає слот агента впустую.
App Store Connect API Key
Apple видалила підтримку логіну за паролем (App-Specific Password) для altool в кінці 2023 року. Тепер обов'язково API Key. Створюється в App Store Connect → Users and Access → Integrations. Потрібна роль не нижче App Manager. Ключ (AuthKey_XXXXXX.p8) зберігається в секретах CI, шлях до нього передається через api_key_path або через змінні оточення APP_STORE_CONNECT_API_KEY_KEY_ID, APP_STORE_CONNECT_API_KEY_ISSUER_ID, APP_STORE_CONNECT_API_KEY_KEY.
Групи тестувальників у TestFlight додаються автоматично: groups: ["Internal Testers", "QA Team"] у upload_to_testflight. Зовнішні тестувальники вимагають прохідження бета-ревью—це вже обмеження Apple, не автоматизуване.
Інкремент Build Number
TestFlight відхиляє білд з тим же CFBundleVersion, що вже завантажений. Стандартний підхід—використовувати номер сборки з CI: CI_BUILD_NUMBER у GitHub Actions, $CI_PIPELINE_IID у GitLab, $BITRISE_BUILD_NUMBER у Bitrise. Або git rev-list --count HEAD як монотонно зростаюче число.
Процес
Настройка App Store Connect API Key → конфігурація match для CI → написання Fastfile → тестування на реальному CI-агенті з macOS → настройка груп тестувальників → документація.
Срок: 1–3 дні в залежності від того, настроєн ли match вже або потрібно будувати з нуля. Стоимость рассчитывается индивидуально.







