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







