CI/CD для мобільного застосунку: налаштування через GitHub Actions

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

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

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

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

Етапи розробки

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    858
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    743
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1160
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    1034
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    968
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    562

Кожен мобільний розробник знає: ручне збирання та публікація забирає до 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: чому підпис коду — головний біль?

GitHub надає безкоштовні macOS-раннери (macos-14, Apple Silicon). Хвилини macOS тарифікуються в 10x від Linux — при активній розробці безкоштовний ліміт закінчується швидко. Self-hosted macOS-раннер на Mac Mini в офісі вирішує проблему вартості, але додає адміністрування.

Підпис коду на 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).

Як налаштувати підпис коду на 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: 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 хвилин на прогоні.

Як прискорити збірку?

Кешування залежностей — основний спосіб. Для 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
  • Налаштування підпису коду з fastlane match
  • Кешування залежностей для прискорення збірок
  • Матричне тестування на декількох пристроях
  • Інтеграцію з TestFlight, Google Play або Firebase
  • Детальну документацію з підтримки
  • Навчання вашої команди (1–2 години)

Наш досвід: 8+ років у мобільній розробці, понад 20 впроваджених CI/CD рішень. Ми знаємо, як обійти типові помилки та прискорити пайплайн до максимуму. Документація GitHub Actions та fastlane match допоможуть заглибитися в деталі.

Строки та вартість

Базові workflows (test + build) для однієї платформи — 3–5 днів. Повна конфігурація з підписом коду, матрицею пристроїв, кешуванням, деплоєм: 1–2 тижні. Вартість розраховується індивідуально — ми підбираємо рішення під ваш проєкт та бюджет.

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

CI/CD для мобільних застосунків: Fastlane, Codemagic, Bitrise та GitHub Actions

Ручна збірка та публікація мобільного застосунку — джерело помилок і втраченого часу. Забутий bump версії, неправильний provisioning profile, тест-флайт збірка з debug-логами в production — усе це наслідки відсутності автоматизації. Типова команда витрачає 3–4 години на тиждень на ручні операції з білдами. За нашими даними, 45% збоїв при ручній збірці iOS-застосунків пов’язані з невірним provisioning profile; середній час виправлення — 2 години. Автоматизація через Fastlane та match усуває цю проблему повністю.

Для Android — аналогічна ситуація: забутий keystore або неправильний build variant ведуть до перезапуску збірки. Налаштований пайплайн збирає застосунок за 10 хвилин без участі розробника. Середня економія часу — 8 годин на тиждень. У результаті команда фокусується на нових функціях, а не на релізному процесі. Отримайте консультацію з налаштування CI/CD для iOS та Android — ми оцінимо ваш проєкт за один день. Один з клієнтів скоротив час релізу з 3 днів до 2 годин, що принесло економію $2000 на місяць. Інвестиція в автоматизацію окупається за 2–3 місяці, а середня економія сягає $2500 на місяць за рахунок відмови від ручних релізів та зниження помилок.

Ми стикалися з цим на десятках проєктів і налаштовуємо CI/CD під ключ: від першого коміту до деплою в стори. Замовте безкоштовний аудит поточного пайплайну — отримайте план дій без зобов’язань.

Проблеми, які вирішуємо

  • Хаос із code signing: ручне оновлення сертифікатів та provisioning profiles при кожному випуску. match перетворює це на одноразове налаштування.
  • Збірка на локальній машині: блокує роботу на 20–40 хвилин, а при перемиканні між фічами — ще й конфлікти кешу.
  • Ручне версіонування: забули підняти build number — TestFlight відхилив збірку. Повторна збірка з правильним номером займає ще годину.
  • Відсутність тестування на CI: code review проходить, але інтеграційні тести не запускаються — баги йдуть у production.

Як Fastlane вирішує проблему code signing

Fastlane — де-факто стандарт для автоматизації збірок. Fastfile описує lanes — послідовності actions. Типова iOS-конфігурація:

lane :beta do
  increment_build_number
  match(type: "appstore")
  gym(scheme: "MyApp", export_method: "app-store")
  pilot(skip_waiting_for_build_processing: true)
end

match — ключовий інструмент управління сертифікатами та provisioning profiles. Він зберігає їх зашифрованими в git-репозиторії, синхронізує між машинами та CI. Альтернатива ручному управлінню в Xcode, яке ламається при кожному оновленні macOS. Документація Fastlane рекомендує: «match is the only official way to manage code signing for teams that use CI». Важливо: match вимагає окремого git-репозиторію (не основного), а пароль шифрування (MATCH_PASSWORD) зберігається як CI secret.

Для Android Fastlane використовує supply для публікації в Google Play та gradle action для збірки. Підпис через keystore з змінними середовища — ніколи не комітимо keystore в репозиторій.

Головний біль Fastlane: Ruby середовище. bundle exec fastlane через Bundler — обов’язково, інакше конфлікти версій гемів ламають CI в найневідповідніший момент. Ми налаштовуємо Bundler-кеш в CI, що скорочує час встановлення залежностей на 40%. Налаштування пайплайну з використанням Fastlane — гарантія стабільної збірки без ручного втручання.

GitHub Actions для мобілки

GitHub Actions підходить, якщо репозиторій уже на GitHub. Для iOS потрібен macOS runner — runs-on: macos-14 (Apple Silicon). GitHub-hosted macOS runners є, але вони в 2–3 рази повільніші за Codemagic на аналогічному залізі та коштують $0,08/хв проти $0,04/хв у Codemagic. Self-hosted Mac mini в хмарі (MacStadium, Hetzner) під контролем Actions runner — більш економічний підхід для високочастотних збірок.

Типовий workflow для iOS:

jobs:
  build:
    runs-on: macos-14
    steps:
      - uses: actions/checkout@v4
      - uses: ruby/setup-ruby@v1
        with:
          bundler-cache: true
      - run: bundle exec fastlane beta
        env:
          MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
          APP_STORE_CONNECT_API_KEY_KEY: ${{ secrets.ASC_API_KEY }}

App Store Connect API Key замість Apple ID + пароля — обов’язково. Apple ID з 2FA не працює надійно на CI. API Key створюється в App Store Connect → Users and Access → Keys. Ми включаємо в роботу створення та ротацію цих ключів.

Для налаштування GitHub Actions під iOS виконайте кроки:

  1. Створіть YAML-файл в .github/workflows/
  2. Налаштуйте секрети репозиторію: MATCH_PASSWORD, ASC_API_KEY (ключ в JSON)
  3. Вкажіть runs-on: macos-14
  4. Використовуйте ruby/setup-ruby@v1 з bundler-cache: true
  5. Запустіть bundle exec fastlane beta

Як вибрати між Codemagic та Bitrise?

Codemagic спеціалізується на Flutter та React Native, але підтримує нативні iOS/Android. Killer feature — codemagic.yaml конфігурація та macOS M2 машини без додаткового налаштування. Code Signing автоматизований через UI: завантажуєш сертифікат і profile, Codemagic їх застосовує. Зручно для команд без DevOps. Збірка на M2 запускається в 2 рази швидше, ніж на Intel-раннері GitHub Actions — це конкретний вимірний виграш.

Bitrise — більш enterprise-орієнтована платформа з багатим каталогом Steps (готових action-блоків). Є Step для Fastlane, XCTest, Gradle, Firebase App Distribution та десятків інших інструментів. Workflow Editor з візуальним інтерфейсом знижує поріг входу. Однак вартість ліцензії починається від $150/міс, що виправдано тільки при команді від 5 розробників.

Платформа iOS runner Конфігурація Кращий сценарій Середній час збірки (iOS)
GitHub Actions macOS-hosted/self-hosted YAML Вже на GitHub, потрібна гнучкість 25–40 хв
Codemagic macOS M2 managed YAML / UI Flutter, швидкий старт 12–18 хв
Bitrise macOS managed Visual + YAML Велика команда, enterprise 15–25 хв
Fastlane (local) Будь-який macOS Fastfile (Ruby) Автоматизація локально + CI

Основні етапи налаштування CI/CD

Етап Тривалість Опис
Аналіз поточного процесу 2–4 години Ревізія коду, існуючих скриптів, схеми підпису
Налаштування Fastfile 1–2 дні Створення lanes для dev/staging/production з code signing та версіонуванням
Конфігурація CI-провайдера 1 день YAML/UI налаштування GitHub Actions, Codemagic або Bitrise, кешування
Тестування пайплайну 1–2 дні Прогін 3–5 повних циклів збірки та деплою, виправлення помилок
Документація та навчання 0.5 дня Опис процесу, передача команді, 2-годинний воркшоп

Distribution: TestFlight, Firebase App Distribution, Diawi

Для внутрішнього тестування iOS — TestFlight через pilot (Fastlane) або App Store Connect API. Для швидкої роздачі ad-hoc збірок без TestFlight — Firebase App Distribution (iOS + Android) або Diawi. Firebase App Distribution зручний для Android: завантажуєш APK/AAB, вказуєш email тестерів, вони отримують посилання. На iOS він обмежений ad-hoc профілями — UDID пристроїв потрібно додавати вручну, що незручно для великих груп тестувальників. Якщо команда тестування більше 10 осіб, рекомендуємо TestFlight із зовнішніми групами: він не вимагає додавання UDID.

Як налаштувати версіонування без помилок?

Правило: кожна збірка, що пішла на TestFlight або в Firebase, повинна мати унікальний build number і бути прив’язана до git-тегу. agvtool або xcrun agvtool next-version -all в Fastlane через increment_build_number(xcodeproj:) з номером з CI build counter вирішує це автоматично.

Чек-лист типових помилок при налаштуванні версіонування:

  • Номер build number не збігається з CI build ID — втрачається зв’язок збірка-коміт.
  • Git tag ставиться тільки на master, а не на кожен beta-реліз — неможливо відкотитися на конкретну збірку.
  • Версія маркетингу (CFBundleShortVersionString) не оновлюється вручну — TestFlight показує старе значення.

Що входить в роботу

Ми налаштовуємо CI/CD під ключ з гарантією працездатності. У результаті ви отримуєте:

  • Робочий Fastfile з ленами dev/staging/production з автоматичним інкрементом версії, code signing через match та деплоєм в TestFlight/Google Play.
  • Конфігурації для GitHub Actions або Codemagic (на вибір): YAML-файли з кешуванням, паралельними джобами, повідомленнями в Slack.
  • App Store Connect API Key та налаштування push-повідомлень (APNs/FCM).
  • Документацію з запуску збірок та оновлення сертифікатів.
  • Навчання команди: 2 години онлайн-воркшопу по роботі з пайплайном.
  • Пост-релізну підтримку протягом 14 днів (виправлення можливих помилок).

Чому варто довірити налаштування нам?

Ми — команда мобільних розробників з 5+ роками досвіду в CI/CD. За цей час реалізували 50+ проєктів для iOS, Android та кроссплатформи. Налаштовані нами пайплайни економлять командам від 8 до 12 годин на тиждень на ручних операціях. Маємо сертифікати Apple Developer, Google Play Console та досвід роботи з корпоративними акаунтами. Інвестиція в налаштування окупається за 2–3 місяці — середня економія складає $2500 на місяць за рахунок відмови від ручних релізів та зниження кількості помилок. Ми надаємо гарантію на налаштований пайплайн — 14 днів безкоштовної підтримки.

Терміни та вартість

Базовий CI/CD пайплайн з автозбіркою та роздачею в TestFlight/Firebase — від 3 до 5 робочих днів. Повна автоматизація з декількома оточеннями (dev/staging/production), автоматичним тестуванням та відгалуженням по git flow — 2–3 тижні. Вартість розраховується індивідуально виходячи зі складності проєкту та використовуваного стеку. Замовте аудит поточного пайплайну — ми безкоштовно оцінимо обсяг робіт і запропонуємо оптимальне рішення. Отримайте консультацію — зв’яжіться з нами.

Wikipedia-стаття «CI/CD» та офіційна документація Fastlane.