Налаштування CI/CD для мобільного додатку через CircleCI
CircleCI—хмарний CI з одними з найкращих macOS-раннерів на ринку серед SaaS-рішень. Для iOS-розробки важлива швидкість: m2pro.medium исполнитель збирає середній Swift-проект за 6–8 хвилин. Конфігурація через .circleci/config.yml, ресурси зберігаються в хмарі CircleCI без необхідності управляти власними серверами.
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
Кодування підписів: два підходи
fastlane match (рекомендується): секрет MATCH_PASSWORD додається в CircleCI Project Settings → Environment Variables. На кожному прогоні fastlane match adhoc --readonly забирає профіль з Git-репозиторія.
CircleCI Contexts: можна винести спільні змінні (MATCH_PASSWORD, Firebase Token) у Context—групу змінних, яка шарится між проектами. Корисно для команд з кількома iOS-додатками.
jobs:
ios-deploy:
context:
- mobile-signing-context
Android у тому ж config.yml
android-test:
docker:
- image: cimg/android:2024.01
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
Docker-образ cimg/android:2024.01—офіційний CircleCI Android-образ з предустановленим Android SDK, JDK 17, Gradle. resource_class: large (4 CPU, 8 GB RAM) потрібен для Gradle—з medium (2 CPU) час сборки збільшується вдвічі.
Test Splitting для довгих тест-сюитів
CircleCI підтримує паралельне виконання тестів з автоматичним розподілом за історичними даними попередніх прогонів:
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 паралельні контейнери, кожен запускає ¼ тестів за історичним часом виконання. Загальний час для тест-сюиту з 400 тестів скорочується з 18 до 6 хвилин.
Обмеження CircleCI для iOS
- Немає доступу до реальних пристроїв з коробки (тільки симулятори). Для device testing—інтеграція з Firebase Test Lab через CLI
- Ціна macOS-хвилин значно вище за Linux: m2pro.medium ~$0.02/хв. При активній розробці—важливо обмежувати workflows тригерами
Часова шкала
Базова конфігурація CircleCI для iOS (test + deploy): 2–3 дні. Повна настройка з Android, test splitting, Contexts, Slack-нотифікаціями: 1–1.5 тижня. Стоимость рассчитывается индивидуально.







