Настройка CI/CD для Android-приложения через Gradle

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

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

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

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

Услуги, которые мы предлагаем
Показано 1 из 1Все 1735 услуг
Настройка CI/CD для Android-приложения через Gradle
Средний
~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 для Android-приложения через Gradle

Gradle — система сборки Android, и большинство CI/CD для Android-проектов строится вокруг нескольких ключевых Gradle-команд. Но «запустить ./gradlew assembleRelease» и «настроить правильный CI/CD» — разные задачи. Подписание APK/AAB, версионирование, управление build variants, кэш зависимостей — всё это требует явной конфигурации.

Подписание в CI без хранения keystore в репозитории

Keystore в Git — критическая ошибка, даже в приватном репозитории. Правильная схема: keystore Base64-encoded → CI secret → декодируем на лету.

# GitHub Actions
- name: Decode Keystore
  run: |
    echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 --decode > app/release.keystore

- name: Build Release AAB
  run: ./gradlew bundleRelease
  env:
    SIGNING_STORE_FILE: release.keystore
    SIGNING_STORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
    SIGNING_KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
    SIGNING_KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}

В app/build.gradle.kts:

signingConfigs {
    create("release") {
        storeFile = file(System.getenv("SIGNING_STORE_FILE") ?: "debug.keystore")
        storePassword = System.getenv("SIGNING_STORE_PASSWORD") ?: ""
        keyAlias = System.getenv("SIGNING_KEY_ALIAS") ?: ""
        keyPassword = System.getenv("SIGNING_KEY_PASSWORD") ?: ""
    }
}

buildTypes {
    release {
        signingConfig = signingConfigs.getByName("release")
        isMinifyEnabled = true
        proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
    }
}

Keystore не попадает в артефакты — после сборки удаляем: rm -f app/release.keystore.

Версионирование через CI

versionCode в Android должен быть уникальным для каждой сборки. Ошибка — использовать 1, 2, 3 вручную или забыть обновить. На CI — автоматически:

// build.gradle.kts
val ciPipelineNumber = System.getenv("CI_BUILD_NUMBER")?.toIntOrNull() ?: 1
val gitCommitCount = "git rev-list --count HEAD".runCommand().trim().toIntOrNull() ?: 1

android {
    defaultConfig {
        versionCode = ciPipelineNumber.takeIf { it > 1 } ?: gitCommitCount
        versionName = "2.4.${gitCommitCount}"
    }
}

gitCommitCount как versionCode — надёжный вариант: монотонно растёт, не зависит от CI-системы.

Gradle Performance: основные рычаги

Медленный Gradle — главная жалоба Android CI. Несколько конкретных настроек в gradle.properties:

# Параллельная сборка модулей
org.gradle.parallel=true
# Конфигурирование только нужных модулей
org.gradle.configureondemand=true
# Кэш сборки
org.gradle.caching=true
# JVM heap
org.gradle.jvmargs=-Xmx4g -XX:+UseParallelGC
# Build config только для активной сборки
android.defaults.buildfeatures.buildconfig=false

org.gradle.caching=true — локальный кэш задач. При неизменном коде модуля Gradle берёт результат из кэша без перекомпиляции. На CI это работает через actions/cache (GitHub) с ключом по хэшу *.gradle* файлов.

Типичный до/после с правильным кэшированием на ubuntu-latest раннере:

  • Без кэша: ./gradlew assembleRelease — 8–12 минут
  • С Gradle daemon + dependency cache: 2–4 минуты

Build Variants и CI

Разные variant-ы для разных окружений — стандарт:

flavorDimensions += "env"
productFlavors {
    create("dev") {
        applicationIdSuffix = ".dev"
        buildConfigField("String", "API_URL", "\"https://api.dev.example.com\"")
    }
    create("prod") {
        buildConfigField("String", "API_URL", "\"https://api.example.com\"")
    }
}

На CI — separate jobs для каждого variant-а:

  • PR → assembleDevDebug + тесты
  • merge to develop → assembleDevRelease + Firebase App Distribution
  • release tag → bundleProdRelease + Google Play

Загрузка в Google Play через Gradle

gradle-play-publisher plugin:

// build.gradle.kts
plugins {
    id("com.github.triplet.play") version "3.9.1"
}

play {
    serviceAccountCredentials.set(file(System.getenv("PLAY_STORE_JSON") ?: "play-store-credentials.json"))
    track.set("internal")
    defaultToAppBundles.set(true)
}
./gradlew publishProdReleaseBundle

Credentials JSON — service account из Google Play Console с доступом Release manager. На CI — передаём через environment variable или временный файл, аналогично keystore.

Сроки

Настройка Gradle с подписанием, версионированием и базовым CI (GitHub Actions/GitLab CI): 2–4 дня. Полная конфигурация с build variants, Google Play деплоем, Gradle performance-оптимизацией, тест-раннерами: 1–1.5 недели. Стоимость рассчитывается индивидуально.