Настройка CI/CD для мобильного приложения через Jenkins под ключ

Вступление Часовая ручная сборка мобильного приложения с последующей загрузкой в App Store или Google Play — знакомая боль для каждой команды. Мы сталкиваемся с этим постоянно: разработчик отвлекается от фич, чтобы собрать релиз, а потом ещё полдня ждать, пока тестировщики проверят и согласуют. J

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Настройка CI/CD для мобильного приложения через Jenkins под ключ
Сложный
~3-5 дней

Наши компетенции:

Часто задаваемые вопросы

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    896
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    1003
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    597

Вступление

Часовая ручная сборка мобильного приложения с последующей загрузкой в App Store или Google Play — знакомая боль для каждой команды. Мы сталкиваемся с этим постоянно: разработчик отвлекается от фич, чтобы собрать релиз, а потом ещё полдня ждать, пока тестировщики проверят и согласуют. Jenkins решает эту проблему раз и навсегда. Автоматизация у нас под ключ — от настройки агентов до деплоя — и результат вы увидите уже через 1–2 недели. Свяжитесь с нами для оценки вашего проекта.

Почему Jenkins для мобильной разработки?

Jenkins выбирают, когда нужен полный контроль над инфраструктурой, уже есть on-premise Jenkins-сервер в компании, или требования безопасности запрещают передачу кода в облачные CI-системы. Для мобильной разработки это означает: Linux-мастер для Android, macOS-агент для iOS. В отличие от облачных CI (GitHub Actions, GitLab CI), Jenkins в 2 раза дешевле при большом количестве сборок за счёт отсутствия биллинга за минуты работы агентов.

Как настроить macOS-агент для iOS сборок?

Пошаговая инструкция по настройке агента:

  1. Установите Xcode 16 и Command Line Tools на Mac.
  2. Настройте Keychain с сертификатами code signing (убедитесь, что Keychain разблокирован).
  3. Установите fastlane через gem install fastlane или brew install fastlane.
  4. Настройте CocoaPods или Swift Package Manager (зависимости будут кэшироваться).
  5. Подключите агент к Jenkins Controller через SSH (режим LaunchDaemons не подходит — используйте launchctl для GUI-сессии).
  6. Добавьте stage 'Unlock Keychain' в Jenkinsfile (см. ниже).

Архитектура Jenkins для мобильной разработки

Jenkins Controller (Linux/macOS) ├── macOS Agent (для iOS) │ ├── Xcode 16 │ ├── fastlane │ └── CocoaPods / SPM └── Linux Agent (для Android) ├── JDK 17 ├── Android SDK └── Gradle 

Агенты подключаются по SSH (Launch agents via SSH) или через JNLP. Для macOS-агента — обязательно аккаунт с Keychain-доступом к code signing сертификатам.

Jenkinsfile: декларативный pipeline

pipeline { agent none environment { FASTLANE_SKIP_UPDATE_CHECK = 'true' MATCH_PASSWORD = credentials('match-passphrase') FIREBASE_TOKEN = credentials('firebase-cli-token') } stages { stage('Test iOS') { agent { label 'macos-m2' } steps { checkout scm sh 'bundle install --path vendor/bundle' sh 'bundle exec fastlane test' } post { always { junit 'fastlane/test_output/report.junit' } } } stage('Build iOS Beta') { agent { label 'macos-m2' } when { branch 'main' } steps { sh 'bundle exec fastlane beta' } } stage('Build Android') { agent { label 'linux-android' } steps { checkout scm sh './gradlew test assembleRelease' archiveArtifacts artifacts: 'app/build/outputs/apk/release/*.apk' } } } post { failure { slackSend( channel: '#mobile-ci', color: 'danger', message: "Build failed: ${env.JOB_NAME} #${env.BUILD_NUMBER}" ) } } } 

credentials('match-passphrase') — Jenkins Credentials Store. Секреты не хранятся в Jenkinsfile, только ссылки на ID.

Как избежать проблем с Keychain на macOS-агенте?

Главная боль Jenkins + iOS: при запуске как фоновый daemon codesign не может открыть Keychain без unlock. Решение — unlock в начале пайплайна:

stage('Unlock Keychain') { agent { label 'macos-m2' } environment { KEYCHAIN_PASSWORD = credentials('macos-keychain-password') } steps { sh 'security unlock-keychain -p $KEYCHAIN_PASSWORD ~/Library/Keychains/login.keychain-db' sh 'security set-keychain-settings -lut 3600 ~/Library/Keychains/login.keychain-db' } } 

set-keychain-settings -lut 3600 — keychain не блокируется 1 час (достаточно для сборки). Без этого через 5 минут idle keychain блокируется автоматически и codesign получает errSecInteractionNotAllowed. Это одна из самых частых ошибок, которую мы исправляем в 90% наших проектов.

Кэширование артефактов

Jenkins не имеет встроенного умного кэша как GitHub Actions cache. Варианты:

Метод Описание Когда подходит
Shared directory на агенте ~/.gradle или ~/Library/Caches/CocoaPods сохраняется между сборками При использовании sticky agents
Workspace Caching Plugin Кэширует по хэшу Podfile.lock/build.gradle Для небольших команд
Nexus/Artifactory Enterprise-кеш Maven/Gradle зависимостей Для крупных проектов с высокими требованиями к надёжности

Shared directory на агенте. Папка ~/.gradle или ~/Library/Caches/CocoaPods сохраняется между сборками автоматически — если всегда используется один и тот же агент (sticky agent).

Jenkins Workspace Caching Plugin. Кэширует по хэшу Podfile.lock/build.gradle, аналог GitHub Actions cache.

Artifactory/Nexus. Для enterprise — кэш Maven/Gradle зависимостей через внутренний артифакторий. GRADLE_USER_HOME=~/.gradle + зеркало Nexus.

Что даёт параллельный запуск тестов?

stage('Test Parallel') { parallel { stage('iOS Tests') { agent { label 'macos-m2' } steps { sh 'bundle exec fastlane test' } } stage('Android Tests') { agent { label 'linux-android' } steps { sh './gradlew test' } } } } 

Параллельный прогон iOS и Android тестов сокращает общее время с ~20 до ~12 минут. Экономия 8 минут на каждой сборке — при 2 сборках в день это 40 минут в неделю, что при часовой ставке разработчика 4000 рублей даёт экономию 3200 рублей в неделю на одном проекте.

Что входит в работу

При заказе настройки CI/CD под ключ вы получаете:

Deliverable Описание
Документация Описание архитектуры, Jenkinsfile, инструкция для разработчиков
Агенты macOS и Linux агенты, настроенные с нужными инструментами
Безопасность Keychain, provisioning profiles, сертификаты в Jenkins Credentials
Пайплайны Test, build, deploy для iOS и Android, параллельные стадии
Интеграции Slack/Jira уведомления, Firebase App Distribution, TestFlight
Обучение команды 2 часа воркшопа по поддержке и доработке пайплайнов
Поддержка 2 недели после сдачи для стабилизации

Типичные ошибки

  • xcodebuild не находит симулятор — нужно явно указывать xcrun simctl boot "iPhone 16" перед запуском тестов на новом агенте
  • Gradle wrapper не найден — нужен chmod +x gradlew в начале шага
  • Build number конфликтует при параллельных сборках — используем ${env.BUILD_NUMBER} как суффикс

Сроки

Настройка Jenkins Pipeline с macOS + Linux агентами, test + deploy лейнами: 1–2 недели (включая агентов). Поддержка параллельных сборок, интеграция с Slack/Jira, настройка Artifactory: ещё 1 неделя. Стоимость рассчитывается индивидуально.

За 5 лет мы настроили CI/CD для 40+ мобильных проектов — от стартапов до enterprise. Получите консультацию: оценим ваш проект и расскажем, сколько времени сэкономит автоматизация. Закажите настройку пайплайна под ключ — напишите нам.