Вступление
Часовая ручная сборка мобильного приложения с последующей загрузкой в 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 минут в неделю, что при часовой ставке разработчика $36–52 даёт экономию $29–42 в неделю на одном проекте.
Что входит в работу
При заказе настройки 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. Получите консультацию: оценим ваш проект и расскажем, сколько времени сэкономит автоматизация. Закажите настройку пайплайна под ключ — напишите нам.







