CI/CD для мобильного приложения: настройка через GitHub Actions

Ручные сборки и публикации мобильных приложений отнимают время и повышают риск ошибок, особенно при подписи кода. Мы настраиваем CI/CD через GitHub Actions для iOS и Android, автоматизируя тестирование, сборку и выкладку. Наша команда реализует проект под ключ — от настройки пайплайна до поддержки, обеспечивая надёжные и регулярные релизы.

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
CI/CD для мобильного приложения: настройка через GitHub Actions
Средний
~2-3 дня
Часто задаваемые вопросы

Каждый мобильный разработчик знает: ручная сборка и публикация отнимает до 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 недели. Стоимость рассчитывается индивидуально — мы подбираем решение под ваш проект и бюджет.

Хотите автоматизировать релизы? Свяжитесь с нами для консультации. Закажите внедрение пайплайна и освободите время разработчиков.

Наши компетенции:

Последние работы

  • Разработка мобильного приложения для компании FEEDME
    Разработка мобильного приложения для компании FEEDME
    1009
  • Разработка мобильного приложения для компании XOOMER
    Разработка мобильного приложения для компании XOOMER
    902
  • Разработка мобильного приложения для компании RHL
    Разработка мобильного приложения для компании RHL
    1331
  • Разработка мобильного приложения для компании ZIPPY
    Разработка мобильного приложения для компании ZIPPY
    1179
  • Разработка мобильного приложения для компании Affhome
    Разработка мобильного приложения для компании Affhome
    1106
  • Разработка мобильного приложения для компании FLAVORS
    Разработка мобильного приложения для компании FLAVORS
    713