В мобильной разработке сборка и доставка обновлений в стора вручную занимает часы. Мы настраиваем 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 под ключ — свяжитесь с нами для оценки вашего проекта. Получите консультацию по автоматизации сборки прямо сейчас.







