Как организовать CI/CD для Android-проектов?android-244

1. Основные компоненты CI/CD системы

1.1 Непрерывная интеграция

  • Автоматическая сборка при каждом коммите
  • Запуск unit- и интеграционных тестов
  • Статический анализ кода

1.2 Непрерывная доставка

  • Автоматическое создание APK/AAB
  • Развертывание на тестовые устройства
  • Публикация в магазины приложений

2. Популярные CI/CD инструменты

Инструмент Особенности
GitHub ActionsИнтеграция с GitHub, бесплатен для OSS
BitriseСпециализирован для мобильных приложений
JenkinsГибкость, требует самохостинга
GitLab CI/CDВстроен в GitLab, хорош для enterprise
CircleCIПростота настройки, кэширование

3. Пример настройки GitHub Actions

3.1 Базовый workflow

name: Android CI

on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2

    - name: Set up JDK
      uses: actions/setup-java@v1
      with:
        java-version: '11'

    - name: Build with Gradle
      run: ./gradlew assembleDebug

    - name: Run tests
      run: ./gradlew test

3.2 Продвинутый вариант с кэшированием

- name: Cache Gradle
  uses: actions/cache@v2
  with:
    path: |
      ```/.gradle/caches
      ```/.gradle/wrapper
    key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }}
    restore-keys: |
      ${{ runner.os }}-gradle-

4. Ключевые этапы пайплайна

4.1 Сборка

  • Сборка debug/release версий
  • Генерация разных flavor (dev, staging, prod)
  • Подписание APK/AAB
./gradlew assembleRelease

4.2 Тестирование

  • Unit тесты
  • Инструментальные тесты (на эмуляторах/реальных устройствах)
  • UI тесты с Firebase Test Lab
./gradlew connectedCheck

4.3 Анализ кода

  • Проверка стиля (ktlint, detekt)
  • Статический анализ (Android Lint)
  • Проверка уязвимостей (OWASP Dependency Check)
./gradlew ktlintCheck
./gradlew lint

4.4 Публикация

  • Внутренний тестинг (Firebase App Distribution)
  • Альфа/бета каналы (Google Play Internal/Closed testing)
  • Продакшн релиз (Google Play Production)

5. Настройка подписания приложения

5.1 Хранение ключей

  • Использование GitHub Secrets
  • Шифрование через Google Play App Signing
  • Хранение в защищенном хранилище (AWS Secrets Manager, HashiCorp Vault)

5.2 Пример подписания в CI

- name: Sign APK
  run: |
    echo "${{ secrets.RELEASE_KEYSTORE }}" > keystore.jks
    ./gradlew assembleRelease \
      -Pandroid.injected.signing.store.file=keystore.jks \
      -Pandroid.injected.signing.store.password=${{ secrets.KEYSTORE_PASSWORD }} \
      -Pandroid.injected.signing.key.alias=${{ secrets.KEY_ALIAS }} \
      -Pandroid.injected.signing.key.password=${{ secrets.KEY_PASSWORD }}

6. Автоматизация тестирования на устройствах

6.1 Firebase Test Lab

- name: Run Instrumentation Tests
  run: |
    gcloud firebase test android run \
      --app app/build/outputs/apk/debug/app-debug.apk \
      --test app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk \
      --device model=Pixel2,version=30

6.2 Эмуляторы в CI

- name: Run emulator
  uses: reactivecircus/android-emulator-runner@v2
  with:
    api-level: 30
    script: ./gradlew connectedCheck

7. Мониторинг и нотификации

  • Отправка уведомлений в Slack/Telegram
  • Отчеты о покрытии кода (Codecov, SonarQube)
  • Визуализация метрик (Grafana, BuildDash)

8. Best Practices

  1. Параллельный запуск тестов
  2. Инкрементальная сборка с кэшированием
  3. Fastlane для автоматизации публикации
  4. Feature flags для безопасного деплоя
  5. Rollback стратегии на случай проблем

Резюмируем:

организация CI/CD для Android требует настройки автоматизированной сборки, тестирования и публикации с использованием специализированных инструментов. Оптимальный пайплайн включает стадии проверки кода, запуска тестов и контролируемого деплоя с возможностью быстрого отката.