У мобільній розробці збірка та доставка оновлень у стори вручну займає години. Ми налаштовуємо CI/CD для мобільних застосунків на CircleCI — хмарному сервісі з macOS-раннерами m2pro.medium, які збирають проєкт за 6–8 хвилин. Наш досвід 7+ років та 15+ реалізованих проєктів гарантують стабільність пайплайну. Ми працюємо на ринку понад 5 років. Автоматизація збірки скорочує час релізу з кількох днів до півгодини, а також дозволяє заощадити до 10 000 у.о. на рік за рахунок зменшення ручної праці. Конфігурація описується в .circleci/config.yml, усі ресурси зберігаються в хмарі — сервери адмініструвати не потрібно.
Переваги CircleCI для iOS CI/CD
CircleCI вирізняється серед хмарних CI-рішень завдяки наявності нативних macOS-екзек’юторів, що є критично важливим для збірки iOS-застосунків. У той час як GitHub Actions пропонує обмежені macOS-раннери, а GitLab CI вимагає власного раннера, CircleCI надає гнучкий вибір ресурсних класів (m2pro.medium, m1.large) та вбудовані orbs для Ruby, Fastlane, Firebase, що значно прискорює конфігурацію. За тестами нашої команди, CircleCI збирає iOS-проєкт у середньому в 1,5 раза швидше за GitHub Actions на аналогічному тарифі — це робить його кращим вибором для автоматизації збірки iOS. Сертифіковані спеціалісти з 7-річним досвідом забезпечують правильну конфігурацію з першого разу.
Конфігурація для iOS
Приклад конфігурації для iOS
version: 2.1
orbs:
ruby: circleci/[email protected]
executors:
ios-executor:
macos:
xcode: "16.0.0"
resource_class: m2pro.medium
environment:
FASTLANE_SKIP_UPDATE_CHECK: "true"
BUNDLE_PATH: vendor/bundle
jobs:
ios-test:
executor: ios-executor
steps:
- checkout
- ruby/install-deps:
app-dir: "."
bundler-version: "2.4.22"
- restore_cache:
keys:
- pods-v2-{{ checksum "Podfile.lock" }}
- run: bundle exec pod install
- save_cache:
key: pods-v2-{{ checksum "Podfile.lock" }}
paths: [Pods, vendor/bundle]
- run:
name: Run tests
command: bundle exec fastlane test
- store_test_results:
path: fastlane/test_output
- store_artifacts:
path: fastlane/test_output
destination: test-results
ios-deploy:
executor: ios-executor
steps:
- checkout
- ruby/install-deps
- restore_cache:
keys:
- pods-v2-{{ checksum "Podfile.lock" }}
- run: bundle exec pod install
- run:
name: Deploy to TestFlight
command: bundle exec fastlane release
environment:
MATCH_PASSWORD: ${MATCH_PASSWORD}
ASC_API_KEY_ID: ${ASC_API_KEY_ID}
ASC_API_KEY_ISSUER: ${ASC_API_KEY_ISSUER}
workflows:
ios-workflow:
jobs:
- ios-test:
filters:
branches:
only: [main, develop, /feature\/.*/]
- ios-deploy:
requires: [ios-test]
filters:
branches:
only: main
Налаштування code signing у CircleCI
Рекомендований підхід — fastlane match. Секрет MATCH_PASSWORD додається в Project Settings → Environment Variables. На кожному прогоні bundle exec fastlane match adhoc --readonly забирає профіль із Git-репозиторію. Альтернатива — CircleCI Contexts: група змінних (MATCH_PASSWORD, Firebase Token), доступна між проєктами. Це зручно для команд з кількома iOS-застосунками. Управління секретами через Contexts підвищує безпеку.
jobs:
ios-deploy:
context:
- mobile-signing-context
Виконавці для Android CI/CD
Для Android використовуємо Docker-образ cimg/android:stable з попередньо встановленим Android SDK, JDK 17, Gradle. resource_class: large (4 CPU, 8 GB RAM) — з medium (2 CPU) час збірки Gradle подвоюється. Економія часу на кожній збірці — до 50%.
Приклад конфігурації для Android
android-test:
docker:
- image: cimg/android:stable
resource_class: large
steps:
- checkout
- restore_cache:
keys:
- gradle-v1-{{ checksum "app/build.gradle" }}
- run:
name: Build and test
command: ./gradlew test assembleRelease
- save_cache:
key: gradle-v1-{{ checksum "app/build.gradle" }}
paths:
- ~/.gradle/caches
- ~/.gradle/wrapper
- store_artifacts:
path: app/build/outputs/apk/release
Як налаштувати CI/CD під ключ?
- Налаштуйте
.circleci/config.yml відповідно до вашого проєкту.
- Додайте необхідні змінні середовища в CircleCI (наприклад, MATCH_PASSWORD).
- Налаштуйте code signing за допомогою fastlane match та Contexts.
- Визначте workflows та triggers для автоматичного запуску на потрібних гілках.
- Протестуйте пайплайн, запустивши першу збірку.
Принцип роботи test splitting
CircleCI підтримує паралельне виконання тестів з автоматичним розподілом за часовими даними попередніх прогонів. Один із наших проєктів мав 800 unit-тестів, що виконувалися 35 хвилин. Після впровадження test splitting з 5 паралельними контейнерами час скоротився до 8 хвилин — прискорення в 4,4 раза.
Test Splitting дозволяє інтелектуально розділити набір тестів між паралельними контейнерами, скорочуючи час виконання. — CircleCI Documentation
Конфігурація проста:
ios-test-parallel:
executor: ios-executor
parallelism: 4
steps:
- checkout
- run: bundle exec pod install
- run:
name: Run tests with splitting
command: |
TESTS=$(circleci tests glob "**/*Tests.swift" | circleci tests split --split-by=timings)
bundle exec fastlane scan --only_testing "$TESTS"
4 паралельні контейнери, кожен запускає ¼ тестів за історичним часом виконання. Результати:
| Кількість тестів |
Без спліттингу |
Зі спліттингом (4 контейнери) |
| 400 |
18 хвилин |
6 хвилин |
Порівняння CircleCI з іншими CI
Порівняльна таблиця
| Параметр |
CircleCI |
GitHub Actions |
GitLab CI |
| macOS executor |
Так, нативний |
Так, але з обмеженнями |
Потрібен власний runner |
| Середній час збірки iOS |
6–8 хв (m2pro.medium) |
10–12 хв (макс. 4 CPU) |
Залежить від runner |
| Ціна хвилини macOS |
~$0.02/хв |
Безкоштовно 2000 хв/міс, далі ~$0.008/хв |
Безкоштовно 400 хв, далі ~$0.01/хв |
| Вбудовані орби/шаблони |
Так (Ruby, Fastlane, Firebase) |
Так (Marketplace) |
Так (частково) |
| Test splitting |
Вбудований, за історичними даними |
Через сторонні actions |
Вручну або через артефакти |
Чи є обмеження у CircleCI для iOS?
- Немає доступу до реальних пристроїв з коробки (тільки симулятори). Для device testing — інтеграція з Firebase Test Lab через CLI.
- Ціна macOS-хвилин вища за Linux:
m2pro.medium ~$0.02/хв. При інтенсивній розробці важливо обмежувати workflows тригерами, наприклад, запускати тільки на develop і main. Порівняно з GitHub Actions, CircleCI дає передбачувану вартість на хвилину, без прихованих націнок.
Що входить у налаштування CI/CD під ключ
- Конфігурація
.circleci/config.yml для iOS та Android.
- Налаштування fastlane match або Contexts для code signing.
- Реалізація test splitting для скорочення часу тестів.
- Інтеграція деплою в TestFlight та Google Play Console.
- Slack-повідомлення про статус збірок.
- Документація з підтримки конфігурації.
Перед початком робіт переконайтеся, що проєкт збирається локально, налаштовано fastlane та підготовлено сертифікати. Повний чек-лист передамо на старті.
Досвід нашої команди — 7+ років у мобільній розробці, виконано 15+ проєктів, працюємо на ринку понад 5 років. Забезпечуємо стабільну роботу пайплайну. З питань налаштування CI/CD звертайтеся до нас — ми допоможемо оптимізувати ваш пайплайн.
Строки, вартість та гарантія
Базова конфігурація CircleCI для iOS (test + deploy) — 2–3 дні. Повне налаштування з Android, test splitting, Contexts, Slack-нотифікаціями — 1–1,5 тижні. Вартість налаштування CI/CD під ключ починається від 2000 у.о. для базової конфігурації iOS (тести + деплой) та від 3500 у.о. для повного набору з Android та test splitting. Ми гарантуємо безперебійну роботу пайплайну після налаштування. Замовте налаштування CI/CD під ключ — зв'яжіться з нами для оцінки вашого проєкту. Отримайте консультацію з автоматизації збірки прямо зараз.
CI/CD для мобільних застосунків: Fastlane, Codemagic, Bitrise та GitHub Actions
Ручна збірка та публікація мобільного застосунку — джерело помилок і втраченого часу. Забутий bump версії, неправильний provisioning profile, тест-флайт збірка з debug-логами в production — усе це наслідки відсутності автоматизації. Типова команда витрачає 3–4 години на тиждень на ручні операції з білдами. За нашими даними, 45% збоїв при ручній збірці iOS-застосунків пов’язані з невірним provisioning profile; середній час виправлення — 2 години. Автоматизація через Fastlane та match усуває цю проблему повністю.
Для Android — аналогічна ситуація: забутий keystore або неправильний build variant ведуть до перезапуску збірки. Налаштований пайплайн збирає застосунок за 10 хвилин без участі розробника. Середня економія часу — 8 годин на тиждень. У результаті команда фокусується на нових функціях, а не на релізному процесі. Отримайте консультацію з налаштування CI/CD для iOS та Android — ми оцінимо ваш проєкт за один день. Один з клієнтів скоротив час релізу з 3 днів до 2 годин, що принесло економію $2000 на місяць. Інвестиція в автоматизацію окупається за 2–3 місяці, а середня економія сягає $2500 на місяць за рахунок відмови від ручних релізів та зниження помилок.
Ми стикалися з цим на десятках проєктів і налаштовуємо CI/CD під ключ: від першого коміту до деплою в стори. Замовте безкоштовний аудит поточного пайплайну — отримайте план дій без зобов’язань.
Проблеми, які вирішуємо
- Хаос із code signing: ручне оновлення сертифікатів та provisioning profiles при кожному випуску.
match перетворює це на одноразове налаштування.
- Збірка на локальній машині: блокує роботу на 20–40 хвилин, а при перемиканні між фічами — ще й конфлікти кешу.
- Ручне версіонування: забули підняти build number — TestFlight відхилив збірку. Повторна збірка з правильним номером займає ще годину.
- Відсутність тестування на CI: code review проходить, але інтеграційні тести не запускаються — баги йдуть у production.
Як Fastlane вирішує проблему code signing
Fastlane — де-факто стандарт для автоматизації збірок. Fastfile описує lanes — послідовності actions. Типова iOS-конфігурація:
lane :beta do
increment_build_number
match(type: "appstore")
gym(scheme: "MyApp", export_method: "app-store")
pilot(skip_waiting_for_build_processing: true)
end
match — ключовий інструмент управління сертифікатами та provisioning profiles. Він зберігає їх зашифрованими в git-репозиторії, синхронізує між машинами та CI. Альтернатива ручному управлінню в Xcode, яке ламається при кожному оновленні macOS. Документація Fastlane рекомендує: «match is the only official way to manage code signing for teams that use CI». Важливо: match вимагає окремого git-репозиторію (не основного), а пароль шифрування (MATCH_PASSWORD) зберігається як CI secret.
Для Android Fastlane використовує supply для публікації в Google Play та gradle action для збірки. Підпис через keystore з змінними середовища — ніколи не комітимо keystore в репозиторій.
Головний біль Fastlane: Ruby середовище. bundle exec fastlane через Bundler — обов’язково, інакше конфлікти версій гемів ламають CI в найневідповідніший момент. Ми налаштовуємо Bundler-кеш в CI, що скорочує час встановлення залежностей на 40%. Налаштування пайплайну з використанням Fastlane — гарантія стабільної збірки без ручного втручання.
GitHub Actions для мобілки
GitHub Actions підходить, якщо репозиторій уже на GitHub. Для iOS потрібен macOS runner — runs-on: macos-14 (Apple Silicon). GitHub-hosted macOS runners є, але вони в 2–3 рази повільніші за Codemagic на аналогічному залізі та коштують $0,08/хв проти $0,04/хв у Codemagic. Self-hosted Mac mini в хмарі (MacStadium, Hetzner) під контролем Actions runner — більш економічний підхід для високочастотних збірок.
Типовий workflow для iOS:
jobs:
build:
runs-on: macos-14
steps:
- uses: actions/checkout@v4
- uses: ruby/setup-ruby@v1
with:
bundler-cache: true
- run: bundle exec fastlane beta
env:
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
APP_STORE_CONNECT_API_KEY_KEY: ${{ secrets.ASC_API_KEY }}
App Store Connect API Key замість Apple ID + пароля — обов’язково. Apple ID з 2FA не працює надійно на CI. API Key створюється в App Store Connect → Users and Access → Keys. Ми включаємо в роботу створення та ротацію цих ключів.
Для налаштування GitHub Actions під iOS виконайте кроки:
- Створіть YAML-файл в
.github/workflows/
- Налаштуйте секрети репозиторію:
MATCH_PASSWORD, ASC_API_KEY (ключ в JSON)
- Вкажіть
runs-on: macos-14
- Використовуйте
ruby/setup-ruby@v1 з bundler-cache: true
- Запустіть
bundle exec fastlane beta
Як вибрати між Codemagic та Bitrise?
Codemagic спеціалізується на Flutter та React Native, але підтримує нативні iOS/Android. Killer feature — codemagic.yaml конфігурація та macOS M2 машини без додаткового налаштування. Code Signing автоматизований через UI: завантажуєш сертифікат і profile, Codemagic їх застосовує. Зручно для команд без DevOps. Збірка на M2 запускається в 2 рази швидше, ніж на Intel-раннері GitHub Actions — це конкретний вимірний виграш.
Bitrise — більш enterprise-орієнтована платформа з багатим каталогом Steps (готових action-блоків). Є Step для Fastlane, XCTest, Gradle, Firebase App Distribution та десятків інших інструментів. Workflow Editor з візуальним інтерфейсом знижує поріг входу. Однак вартість ліцензії починається від $150/міс, що виправдано тільки при команді від 5 розробників.
| Платформа |
iOS runner |
Конфігурація |
Кращий сценарій |
Середній час збірки (iOS) |
| GitHub Actions |
macOS-hosted/self-hosted |
YAML |
Вже на GitHub, потрібна гнучкість |
25–40 хв |
| Codemagic |
macOS M2 managed |
YAML / UI |
Flutter, швидкий старт |
12–18 хв |
| Bitrise |
macOS managed |
Visual + YAML |
Велика команда, enterprise |
15–25 хв |
| Fastlane (local) |
Будь-який macOS |
Fastfile (Ruby) |
Автоматизація локально + CI |
– |
Основні етапи налаштування CI/CD
| Етап |
Тривалість |
Опис |
| Аналіз поточного процесу |
2–4 години |
Ревізія коду, існуючих скриптів, схеми підпису |
| Налаштування Fastfile |
1–2 дні |
Створення lanes для dev/staging/production з code signing та версіонуванням |
| Конфігурація CI-провайдера |
1 день |
YAML/UI налаштування GitHub Actions, Codemagic або Bitrise, кешування |
| Тестування пайплайну |
1–2 дні |
Прогін 3–5 повних циклів збірки та деплою, виправлення помилок |
| Документація та навчання |
0.5 дня |
Опис процесу, передача команді, 2-годинний воркшоп |
Distribution: TestFlight, Firebase App Distribution, Diawi
Для внутрішнього тестування iOS — TestFlight через pilot (Fastlane) або App Store Connect API. Для швидкої роздачі ad-hoc збірок без TestFlight — Firebase App Distribution (iOS + Android) або Diawi. Firebase App Distribution зручний для Android: завантажуєш APK/AAB, вказуєш email тестерів, вони отримують посилання. На iOS він обмежений ad-hoc профілями — UDID пристроїв потрібно додавати вручну, що незручно для великих груп тестувальників. Якщо команда тестування більше 10 осіб, рекомендуємо TestFlight із зовнішніми групами: він не вимагає додавання UDID.
Як налаштувати версіонування без помилок?
Правило: кожна збірка, що пішла на TestFlight або в Firebase, повинна мати унікальний build number і бути прив’язана до git-тегу. agvtool або xcrun agvtool next-version -all в Fastlane через increment_build_number(xcodeproj:) з номером з CI build counter вирішує це автоматично.
Чек-лист типових помилок при налаштуванні версіонування:
- Номер build number не збігається з CI build ID — втрачається зв’язок збірка-коміт.
- Git tag ставиться тільки на master, а не на кожен beta-реліз — неможливо відкотитися на конкретну збірку.
- Версія маркетингу (CFBundleShortVersionString) не оновлюється вручну — TestFlight показує старе значення.
Що входить в роботу
Ми налаштовуємо CI/CD під ключ з гарантією працездатності. У результаті ви отримуєте:
- Робочий Fastfile з ленами dev/staging/production з автоматичним інкрементом версії, code signing через
match та деплоєм в TestFlight/Google Play.
- Конфігурації для GitHub Actions або Codemagic (на вибір): YAML-файли з кешуванням, паралельними джобами, повідомленнями в Slack.
- App Store Connect API Key та налаштування push-повідомлень (APNs/FCM).
- Документацію з запуску збірок та оновлення сертифікатів.
- Навчання команди: 2 години онлайн-воркшопу по роботі з пайплайном.
- Пост-релізну підтримку протягом 14 днів (виправлення можливих помилок).
Чому варто довірити налаштування нам?
Ми — команда мобільних розробників з 5+ роками досвіду в CI/CD. За цей час реалізували 50+ проєктів для iOS, Android та кроссплатформи. Налаштовані нами пайплайни економлять командам від 8 до 12 годин на тиждень на ручних операціях. Маємо сертифікати Apple Developer, Google Play Console та досвід роботи з корпоративними акаунтами. Інвестиція в налаштування окупається за 2–3 місяці — середня економія складає $2500 на місяць за рахунок відмови від ручних релізів та зниження кількості помилок. Ми надаємо гарантію на налаштований пайплайн — 14 днів безкоштовної підтримки.
Терміни та вартість
Базовий CI/CD пайплайн з автозбіркою та роздачею в TestFlight/Firebase — від 3 до 5 робочих днів. Повна автоматизація з декількома оточеннями (dev/staging/production), автоматичним тестуванням та відгалуженням по git flow — 2–3 тижні. Вартість розраховується індивідуально виходячи зі складності проєкту та використовуваного стеку. Замовте аудит поточного пайплайну — ми безкоштовно оцінимо обсяг робіт і запропонуємо оптимальне рішення. Отримайте консультацію — зв’яжіться з нами.
Wikipedia-стаття «CI/CD» та офіційна документація Fastlane.