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

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.

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

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

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

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

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

Этапы разработки

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

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    495

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

GitHub Actions — наиболее гибкий вариант CI/CD для мобильной разработки при условии, что репозиторий уже на GitHub. Для iOS нужен macOS-раннер, для Android — Linux. Оба доступны в облаке GitHub или как self-hosted.

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.

Полный 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: testdeploy-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 минут на прогоне.

Матрица устройств для тестов

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 }}"

Параллельно запускает тесты на трёх устройствах — суммарное время не увеличивается, покрытие расширяется.

Сроки

Базовые workflows (test + build) для iOS и Android: 3–5 дней. Полная конфигурация с code signing, матрицей устройств, кэшированием, деплоем в TestFlight/Firebase: 1–2 недели. Стоимость рассчитывается индивидуально.