Вступ
Годинна ручна збірка мобільного додатку з подальшим завантаженням в 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. Отримайте консультацію: оцінимо ваш проект і розкажемо, скільки часу заощадить автоматизація. Замовте налаштування пайплайну під ключ — напишіть нам.







