Ми автоматизуємо доставку білдів у TestFlight, заощаджуючи до 80% часу вашої команди. Вартість налаштування починається від $500. Ручне завантаження через Xcode Organizer — джерело болю в будь-якій iOS-команді. Забутий флаг include bitcode, застарілий сертифікат, який лежить тільки на MacBook одного розробника, Upload Error 409 без зрозумілого пояснення — все це зупиняє доставку білда тестувальникам. У підсумку команда втрачає до 5 годин на тиждень на рутинних операціях, при цьому кожен десятий білд доводиться перезаливати через помилки. Автоматичне завантаження в TestFlight через Fastlane прибирає людину з цього ланцюжка. З нашим рішенням ви отримуєте передбачуваний процес та економію до 80% часу, що при ставці $50/год складає $2000 на місяць для команди з 5 розробників. Налаштування окупається за кілька тижнів навіть для невеликої команди. Автоматизація в 10 разів прискорює доставку білдів.
Як вирішити проблему з сертифікатами в 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. Не потрібно пробрасувати файли вручну. За нашим досвідом, match у 10 разів надійніше ручного копіювання. Code signing iOS забезпечується Fastlane match. Понад 100 проектів вже автоматизовано.
Чому Fastlane — найкращий вибір для TestFlight
altool (застарілий, але ще робочий) і xcrun altool --upload-app вимагають App Store Connect API Key. Зараз Apple рекомендує xcrun notarytool для macOS і altool для iOS, але на практиці Fastlane pilot (deliver для метаданих) надійніше — він обробляє помилки та ретраї. Fastlane виконує завантаження в 10 разів швидше за ручне. Налаштування CI/CD iOS включає ці компоненти.
Типовий 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. Тепер обов'язково 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. Докладніше див. Apple Developer Documentation.
Групи тестувальників у 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 як монотонно зростаюче число.
| Спосіб | Приклад | Монотонність | CI-залежність? |
|---|---|---|---|
| git rev-list --count | 1234 |
висока | ні |
| CI_BUILD_NUMBER | 12345 |
середня (скидається при новому проекті) | так |
| дата-штамп | YYYYMMDD-N |
низька (може бути неунікальним) | ні |
Які проблеми вирішує автоматизація?
| Проблема | Ручне завантаження | Автоматизація |
|---|---|---|
| сертифікати | один розробник носить із собою | зберігаються в зашифрованому репозиторії |
| завантаження білда | 10–20 хвилин у Xcode | 2–3 хвилини через CI |
| помилки | 409, незрозумілі коди | логи та автоматичні ретраї |
| тестувальники | запрошувати вручну | авто-додавання через групи |
Що входить у роботу
- Налаштування App Store Connect API Key та його інтеграція в CI.
- Конфігурація Fastlane match для безпечного зберігання сертифікатів.
- Написання Fastfile для пайплайну збірки та завантаження.
- Тестування на вашому CI-агенті (macOS).
- Документація щодо процесу для команди.
- Навчання розробників роботі з автоматизацією.
Типові помилки при налаштуванні
- Використання застарілого altool замість Fastlane: пропускає помилки. - Неправильний api_key_path: вказуйте абсолютний шлях у CI. - Забута роль App Manager: ключ не зможе завантажувати білди. - Блокування CI при очікуванні обробки: ставте `skip_waiting_for_build_processing: true`.Процес
- Аналіз поточної CI-інфраструктури та сертифікатів.
- Налаштування App Store Connect API Key та секретів.
- Розгортання match-репозиторію.
- Написання Fastfile з обробкою помилок.
- Пробний запуск на CI-агенті.
- Документування та передача знань.
Строки та вартість
Строк: 1–3 дні залежно від того, чи налаштований match вже або потрібно будувати з нуля. Вартість розраховується індивідуально, пишіть — оцінимо ваш проект. Гарантія якості на всі роботи. 99% білдів завантажуються з першої спроби.
Наша команда має більш ніж 5-річний досвід у iOS-розробці та CI/CD: реалізовано понад 100 проектів з автоматичною доставкою білдів. iOS збірка CI через Fastlane – наша спеціалізація. Кожен налаштований пайплайн економить команді години на тиждень. Зв'яжіться з нами для консультації — оцінимо вашу інфраструктуру та запропонуємо оптимальне рішення. Замовте налаштування TestFlight автоматизації, щоб звільнити час розробників для більш важливих завдань.
Apple рекомендує використовувати App Store Connect API Key для автоматизації завантаження.







