В мобильной разработке сборка и доставка обновлений в стора вручную занимает часы. Мы настраиваем CI/CD на CircleCI — облачном сервисе с macOS-раннерами m2pro.medium, собирающими проект за 6–8 минут. Наш опыт показывает: автоматизация сокращает время релиза с нескольких дней до получаса. Конфигурация описывается в .circleci/config.yml, все ресурсы хранятся в облаке — серверы администрировать не нужно.
Почему выбирают CircleCI для iOS?
CircleCI — один из немногих облачных CI с нативными macOS-экзекьюторами. В отличие от GitHub Actions (ограниченные macOS-раннеры) или GitLab CI (требуется собственный раннер), CircleCI даёт выбор ресурсных классов (m2pro.medium, m1.large) и встроенные orbs для Ruby, Fastlane, Firebase. Это ускоряет конфигурацию в разы. По тестам нашей команды, CircleCI собирает iOS-проект в среднем в 1,5 раза быстрее GitHub Actions на аналогичном тарифе.
Конфигурация для 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 и iOS
Для Android используем Docker-образ cimg/android:stable с предустановленным Android SDK, JDK 17, Gradle. resource_class: large (4 CPU, 8 GB RAM) — с medium (2 CPU) время сборки Gradle увеличивается вдвое. Экономия времени на каждой сборке — до 50%.
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
Как работает test splitting?
CircleCI поддерживает параллельное выполнение тестов с автоматическим распределением по временным данным предыдущих прогонов. Один из наших проектов имел 800 unit-тестов, выполнявшихся 35 минут. После внедрения test splitting с 5 параллельными контейнерами время сократилось до 8 минут — ускорение в 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+ проектов по внедрению CI/CD. Обеспечиваем стабильную работу пайплайна. По вопросам настройки CI/CD обращайтесь к нам — мы поможем оптимизировать ваш пайплайн.
Сроки и как начать
Базовая конфигурация CircleCI для iOS (test + deploy) — 2–3 дня. Полная настройка с Android, test splitting, Contexts, Slack-нотификациями — 1–1,5 недели. Стоимость рассчитывается индивидуально. Закажите настройку CI/CD под ключ — свяжитесь с нами для оценки вашего проекта. Получите консультацию по автоматизации сборки прямо сейчас.







