Каждый мобильный разработчик знает: ручная сборка и публикация отнимает до 5 часов в неделю. На крупных проектах ошибка при подписи кода может задержать релиз на сутки. GitHub Actions автоматизирует этот конвейер: после пуша код тестируется, собирается, подписывается и публикуется без участия человека. Для iOS обязателен macOS-раннер (например, macos-14 на Apple Silicon), для Android подходит обычный Linux. Бесплатные минуты macOS тарифицируются в 10x — на активных проектах лимит заканчивается быстро. Self-hosted Mac mini в офисе решает проблему стоимости, но требует администрирования. На одном из проектов мы сократили время релиза с 3 часов до 30 минут после внедрения описанного ниже пайплайна.
Почему CI/CD критичен для мобильных приложений?
Без CI/CD каждый релиз превращается в риск: ошибки подписи, пропущенные тесты, неверные конфиги. Автоматизация гарантирует, что каждый пуш соответствует стандартам качества. После внедрения CI/CD команда может выпускать обновления ежедневно, а тестирование становится неотъемлемой частью процесса.
iOS: почему code signing — головная боль?
GitHub предоставляет бесплатные macOS-раннеры (macos-14, Apple Silicon). Минуты macOS тарифицируются в 10x от Linux — при активной разработке бесплатный лимит заканчивается быстро. Self-hosted macOS-раннер на Mac mini в офисе решает проблему стоимости, но добавляет администрирование.
Code signing на GitHub Actions — через fastlane match или импорт сертификата из secrets:
---
- name: Import certificate
run: |
echo "${{ secrets.DISTRIBUTION_CERTIFICATE_P12 }}" | base64 --decode > cert.p12
security create-keychain -p "${{ secrets.KEYCHAIN_PASSWORD }}" build.keychain
security import cert.p12 -k build.keychain -P "${{ secrets.CERT_PASSWORD }}" -T /usr/bin/codesign
security set-keychain-settings -lut 21600 build.keychain
security unlock-keychain -p "${{ secrets.KEYCHAIN_PASSWORD }}" build.keychain
security list-keychains -d user -s build.keychain login.keychain
---Это ручной подход — работает, но хрупок при обновлении сертификата. В продакшене лучше fastlane match readonly: true с MATCH_PASSWORD в secrets. Частые ошибки: сертификат истёк (обновляйте provisioning profile раз в год), пароль keychain не передан в secrets, несовместимость версий fastlane (фиксируйте в Gemfile.lock).
Как настроить code signing на GitHub Actions?
Используйте fastlane match с отдельным репозиторием для сертификатов. Добавьте в secrets переменные MATCH_PASSWORD, MATCH_GIT_BASIC_AUTHORIZATION и укажите readonly: true. Workflow импортирует профили автоматически.
Полный workflow для iOS
name: iOS CI
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
test:
runs-on: macos-14
steps:
- uses: actions/checkout@v4
- name: Select Xcode
run: sudo xcode-select -s /Applications/Xcode_16.0.app
- name: Cache CocoaPods
uses: actions/cache@v4
with:
path: Pods
key: ${{ runner.os }}-pods-${{ hashFiles('Podfile.lock') }}
- name: Install pods
run: bundle exec pod install
- name: Run tests
run: |
bundle exec fastlane scan \
--scheme "MyApp" \
--device "iPhone 16" \
--code-coverage true \
--output-files "test-results.xml"
- name: Upload test results
uses: actions/upload-artifact@v4
with:
name: test-results
path: test-results.xml
if-no-files-found: error
deploy-beta:
needs: test
runs-on: macos-14
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- name: Setup Ruby
uses: ruby/setup-ruby@v1
with:
bundler-cache: true
- name: Deploy to TestFlight
env:
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
APP_STORE_CONNECT_API_KEY: ${{ secrets.ASC_API_KEY }}
run: bundle exec fastlane release
needs: test — deploy-beta запускается только если тесты прошли. if: github.ref == 'refs/heads/main' — деплой только из main.
Android: как упростить пайплайн?
jobs:
android-build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up JDK
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Cache Gradle
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
- name: Build and test
run: ./gradlew test assembleRelease
- name: Sign APK
uses: r0adkll/sign-android-release@v1
with:
releaseDirectory: app/build/outputs/apk/release
signingKeyBase64: ${{ secrets.SIGNING_KEY }}
alias: ${{ secrets.KEY_ALIAS }}
keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }}
keyPassword: ${{ secrets.KEY_PASSWORD }}
- name: Upload to Firebase App Distribution
uses: wzieba/Firebase-Distribution-Github-Action@v1
with:
appId: ${{ secrets.FIREBASE_APP_ID }}
token: ${{ secrets.FIREBASE_TOKEN }}
groups: qa-team
file: app/build/outputs/apk/release/app-release-signed.apk
Linux-раннер для Android — бесплатно без ограничения минут (на публичных репо). Gradle-кэш экономит 3–5 минут на прогоне.
Как ускорить сборку?
Кэширование зависимостей — основной способ. Для iOS используйте actions/cache для Pods или SPM. Для Android — для Gradle cache. Также можно ограничить шаги только нужными платформами и запускать тесты параллельно.
Как протестировать приложение на нескольких устройствах?
strategy:
matrix:
device: ["iPhone 15", "iPhone SE (3rd generation)", "iPad Pro (12.9-inch)"]
jobs:
test:
runs-on: macos-14
steps:
- name: Run tests on ${{ matrix.device }}
run: xcodebuild test -scheme MyApp -destination "platform=iOS Simulator,name=${{ matrix.device }}"Параллельно запускает тесты на трёх устройствах — суммарное время не увеличивается, покрытие расширяется.
Что даёт матричное тестирование?
Матрица устройств позволяет выявить баги, специфичные для конкретных моделей и версий iOS. Без неё вы рискуете пропустить ошибки, которые проявляются только на старых девайсах. Параллельные джобы с матрицей не замедляют пайплайн — все они выполняются одновременно.
Таблица: сравнение CI/CD для iOS и Android
| Параметр | iOS | Android |
|---|---|---|
| Раннер | macOS (macos-14) | Linux (ubuntu-latest) |
| Подпись | code signing (fastlane match) | Signing APK (keystore) |
| Деплой | TestFlight / App Store | Google Play / Firebase |
| Кэширование | CocoaPods / SPM | Gradle cache |
| Тесты | XCTest | JUnit / Espresso |
Дополнительная таблица: примерные времена выполнения
| Этап | iOS | Android |
|---|---|---|
| Сборка | 15–25 мин | 10–20 мин |
| Тесты | 10–15 мин | 5–10 мин |
| Подпись | 2–5 мин | 1–2 мин |
| Деплой | 5–10 мин | 3–7 мин |
Что входит в настройку CI/CD
Наша команда подготовит:
- Рабочие workflows для iOS и Android
- Настройку code signing с fastlane match
- Кэширование зависимостей для ускорения сборок
- Матричное тестирование на нескольких устройствах
- Интеграцию с TestFlight, Google Play или Firebase
- Подробную документацию по поддержке
- Обучение вашей команды (1–2 часа)
Наш опыт: 8+ лет в мобильной разработке, более 20 внедрённых CI/CD решений. Мы знаем, как обойти типовые ошибки и ускорить пайплайн до максимума. Документация GitHub Actions и fastlane match помогут углубиться в детали.
Сроки и стоимость
Базовые workflows (test + build) для одной платформы — 3–5 дней. Полная конфигурация с code signing, матрицей устройств, кэшированием, деплоем: 1–2 недели. Стоимость рассчитывается индивидуально — мы подбираем решение под ваш проект и бюджет.
Хотите автоматизировать релизы? Свяжитесь с нами для консультации. Закажите внедрение пайплайна и освободите время разработчиков.







