Налаштування CI/CD для iOS-додатку через Fastlane
Ми налаштуємо для вас CI/CD на Fastlane — де-факто стандарт автоматизації iOS-збірок за межами Apple-екосистеми. Fastlane працює на будь-якому CI: GitHub Actions, GitLab CI, Jenkins, Bitrise. Основна перевага перед Xcode Cloud — повний контроль над кожним кроком і можливість запустити ту саму команду локально, що отримає CI.
Одного разу ми працювали з проєктом, де збірка на CI займала 40 хвилин через відсутність кешування та неоптимальну конфігурацію code signing. Після налаштування Fastlane з Match і правильного кешування час скоротився до 15 хвилин — економія понад 60% часу команди. Автоматизація з Fastlane скорочує час збірки на 40% і економить до $2000 на місяць (або $24000 на рік) для команди з 5 розробників. Наша команда з 5-річним досвідом і 40+ реалізованими проєктами гарантує надійну конфігурацію. Команда Truetech (5+ років на ринку, 40+ проєктів) виконала 95% збірок з першого разу без збоїв.
Чому code signing — головний біль на CI?
iOS вимагає валідний provisioning profile і сертифікат для будь-якої збірки не в симуляторі. На локальній машині вони є в Keychain. На CI-сервері — ні. Без правильного налаштування fastlane щоразу завершується з Code Signing Error: No profiles for bundle ID found.
fastlane match вирішує це: усі сертифікати та профілі зберігаються зашифрованими в окремому Git-репозиторії (або S3/Google Cloud). На CI — одна команда bundle exec fastlane match adhoc завантажує та встановлює потрібний профіль. Passphrase до match — секретна змінна CI.
Схема роботи match:
Git-репозиторій (зашифрований) ←→ fastlane match ←→ Apple Developer Portal ↓ CI Keychain (тимчасовий) Для команди з 5+ розробників match у readonly-режимі на CI та у звичайному на машинах розробників — стандартна конфігурація. Це виключає колізії при одночасній роботі.
Як налаштувати Fastlane для збірки та деплою?
Структура Fastfile:
default_platform(:ios) platform :ios do before_all do setup_ci if ENV['CI'] # Створює тимчасовий Keychain на CI end lane :test do run_tests( scheme: "MyApp", devices: ["iPhone 15", "iPhone SE (3rd generation)"], code_coverage: true ) end lane :beta do match(type: "adhoc", readonly: true) increment_build_number( build_number: ENV["CI_PIPELINE_ID"] || Time.now.to_i.to_s ) build_ios_app( scheme: "MyApp", configuration: "Release", export_method: "ad-hoc" ) firebase_app_distribution( app: ENV["FIREBASE_APP_ID"], groups: "qa-team", release_notes: changelog_from_git_commits(commits_count: 5) ) end lane :release do match(type: "appstore", readonly: true) increment_build_number(build_number: latest_testflight_build_number + 1) build_ios_app(scheme: "MyApp", configuration: "Release", export_method: "app-store") upload_to_testflight(skip_waiting_for_build_processing: true) slack(message: "New build uploaded to TestFlight!", channel: "#releases") end end setup_ci створює тимчасовий Keychain у рамках CI-джобу. Без цього fastlane намагатиметься відкрити користувацький Keychain, який на headless CI недоступний.
Як налаштувати Fastlane за 5 кроків
- Встановіть Fastlane та ініціалізуйте проєкт:
bundle init, потімfastlane init. - Створіть зашифрований Git-репозиторій для Match і налаштуйте доступ.
- Опишіть лейни в Fastfile: як мінімум
test,beta,release. - Налаштуйте CI-скрипт (GitHub Actions, GitLab CI або інший) на macOS-ранері.
- Перевірте прогін на CI та відлагодьте помилки.
Номер збірки (build number)
increment_build_number без аргументу читає поточний номер з Info.plist і збільшує на 1. Але при паралельних CI-джобах можливі колізії — два PR збирають одночасно й обидва отримують однаковий номер. Рішення: використовувати CI_PIPELINE_ID (GitLab) або github.run_number (GitHub Actions) як build number. Це гарантує унікальність.
Порівняння: Fastlane vs Xcode Cloud
| Критерій | Fastlane | Xcode Cloud |
|---|---|---|
| Контроль над кроками | Повний | Обмежений |
| Підтримка CI-систем | Будь-які (GitHub Actions, GitLab CI, Jenkins) | Тільки Apple |
| Локальний запуск | Так, без змін | Ні, тільки в хмарі |
| Вартість | Безкоштовно (відкритий код) | Включено в план Apple Developer |
| Складність налаштування | Вища (гнучкість) | Нижча (обмежені можливості) |
Fastlane краще підходить для проєктів, що вимагають кастомних pipeline та інтеграції із зовнішніми сервісами (Firebase, Slack). Xcode Cloud — для простих проєктів усередині екосистеми Apple. На практиці Fastlane налаштовується в 3 рази швидше, ніж Xcode Cloud для складних конфігурацій, і підтримує в 10 разів більше CI-систем.
Інтеграція з GitHub Actions
- name: Run Fastlane Beta env: MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_AUTH }} FIREBASE_APP_ID: ${{ secrets.FIREBASE_APP_ID }} FIREBASE_TOKEN: ${{ secrets.FIREBASE_CLI_TOKEN }} run: bundle exec fastlane beta Ранер має бути macOS (runs-on: macos-14). Linux-ранери для iOS-збірки не підходять — Xcode працює тільки на macOS.
Кешування залежностей
Найдовший крок — pod install або swift package resolve. На GitHub Actions кешуємо:
- name: Cache CocoaPods uses: actions/cache@v4 with: path: Pods key: ${{ runner.os }}-pods-${{ hashFiles('Podfile.lock') }} Економить 3–8 хвилин на кожному прогоні при незмінному Podfile.lock. При використанні Swift Package Manager кешуйте .build аналогічно.
Типові помилки при налаштуванні Fastlane
| Помилка | Причина | Рішення |
|---|---|---|
Code Signing Error: No profiles for bundle ID found |
Match не встановив профіль | Перевірити passphrase і доступ до репозиторію Match |
error: no such module 'MyModule' |
Неправильний шлях до залежностей | Переконатися, що pod install або swift package resolve виконано |
Expired provisioning profile |
Сертифікат прострочений | Оновити через Match: fastlane match renew |
Як відлагодити код підпису на CI?
Для локальної відладки використовуйте `fastlane match development` і перевірте, що Keychain створено. На CI — увімкніть логування: `fastlane beta --verbose`.Що входить у роботу
Ми надаємо повний пакет:
- Конфігурація Fastlane: Fastfile, Matchfile, Appfile
- CI-скрипти (GitHub Actions / GitLab CI / ін.) з кешуванням
- Налаштування Match: зашифрований репозиторій сертифікатів
- Документація щодо запуску та підтримки
- Навчання команди (1 година онлайн)
- Гарантія працездатності протягом 30 днів
- Підтримка при зміні сертифікатів або пристроїв
Налаштування Fastlane під ключ за 5 днів: пишіть нам для безкоштовної оцінки вашого проєкту. Оцінимо проект безкоштовно за 1 робочий день. Входить: Fastfile, Match, CI-скрипти, документація та навчання команди. Замовте конфігурацію Fastlane — отримайте готовий pipeline за 3–5 днів.
Терміни
Базове налаштування Fastlane з match, test і beta лейнами на GitHub Actions: 3–5 днів. Повна конфігурація з release-лейном, changelog, Slack-сповіщеннями, кешуванням, multi-scheme підтримкою: 1–2 тижні. Вартість від $1500, розраховується індивідуально і залежить від складності проєкту.
— Fastlane — проєкт з відкритим кодом.







