Настройка 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
Code signing: два подхода
fastlane match (рекомендуется): секрет MATCH_PASSWORD добавляется в CircleCI Project Settings → Environment Variables. На каждом прогоне bundle exec 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 недели. Стоимость рассчитывается индивидуально.







