Вступление
Часовая ручная сборка мобильного приложения с последующей загрузкой в 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 сборок?
Пошаговая инструкция по настройке агента:
- Установите Xcode 16 и Command Line Tools на Mac.
- Настройте Keychain с сертификатами code signing (убедитесь, что Keychain разблокирован).
- Установите fastlane через
gem install fastlaneилиbrew install fastlane. - Настройте CocoaPods или Swift Package Manager (зависимости будут кэшироваться).
- Подключите агент к Jenkins Controller через SSH (режим LaunchDaemons не подходит — используйте
launchctlдля GUI-сессии). - Добавьте 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. Получите консультацию: оценим ваш проект и расскажем, сколько времени сэкономит автоматизация. Закажите настройку пайплайна под ключ — напишите нам.







