CI/CD для Android‑проекта в Termux позволяет собрать единый контур разработки: вы храните код в GitLab, собираете артефакты с помощью Gradle или Maven, запускаете тесты и автоматически формируете подписанные релизы для последующей загрузки в Play Console. Ниже — практический сценарий, который можно развернуть на локальном устройстве (смартфон/мини‑ПК), с GitLab‑Runner, конфигурациями пайплайнов и публикацией релиза через официальные механизмы.
Статья ориентирована на корректное использование штатных возможностей Android‑сборки и безопасное хранение секретов в GitLab CI/CD. Все шаги описаны так, чтобы вы могли адаптировать их под свой проект и структуру репозитория.
Архитектура решения
Рассмотрим компоненты:
- Termux — среда для запуска GitLab‑Runner и вспомогательных инструментов (SDK/Java/Gradle или Maven).
- GitLab Runner — агент, исполняющий job’ы из .gitlab-ci.yml.
- Android build — сборка через Gradle (типично для Android) или через Maven (если ваш проект/модули так устроены).
- Play Console — публикация сборок (обычно через загрузку подписанного AAB или APK с помощью инструмента, поддерживаемого Google).
- Секреты — храните в GitLab CI/CD Variables (например, ключ подписи, service account для загрузки в Play).
Требования и подготовка Termux
Убедитесь, что на устройстве доступны:
- Установленный Termux.
- Java JDK (обычно 17 для современных Android проектов).
- Android SDK (через command line tools) и нужные платформы/системные образы.
- Gradle или Maven (в большинстве случаев Gradle лучше подходит для Android).
- Доступ к интернету для скачивания зависимостей и SDK.
Базовая установка пакетов в Termux (пример):
pkg update
pkg install -y git wget tar zip unzip openjdk-17 curlПроверьте Java:
java -versionРекомендуется создать отдельный каталог для runner и окружения:
mkdir -p ~/gitlab-runner && cd ~/gitlab-runnerУстановка Android SDK в Termux
Обычно удобнее поставить Android SDK в домашнюю директорию Termux и зафиксировать переменные окружения в профиле. Примерная структура:
mkdir -p ~/android-sdk/cmdline-tools
mkdir -p ~/android-sdk/platform-tools
mkdir -p ~/android-sdk/platforms
mkdir -p ~/android-sdk/build-toolsДальше скачайте command line tools (выберите актуальную версию на стороне Google). В Termux выполните загрузку и распаковку в нужную структуру. Формат разнится по версиям, поэтому ориентируйтесь на структуру папок, где должен появиться каталог cmdline-tools/latest/bin.
После установки настройте переменные окружения (в ~/.bashrc или ~/.zshrc):
export ANDROID_HOME="$HOME/android-sdk"
export PATH="$PATH:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/build-tools"Пример установки нужных компонентов через SDK Manager (используйте актуальные пакеты для вашей версии проекта):
sdkmanager --list
sdkmanager "platform-tools" "platforms;android-34" "build-tools;34.0.0"Согласуйте версию compileSdk/targetSdk в проекте с установленными платформами.
Настройка GitLab Runner в Termux
Скачивание GitLab Runner
Скачайте бинарник GitLab Runner для вашей архитектуры (arm/arm64). В Termux корректнее использовать официальный runner под Linux‑ARM. После загрузки:
chmod +x gitlab-runner
mv gitlab-runner /data/data/com.termux/files/usr/bin/gitlab-runnerРегистрация runner
В GitLab проекта (или группы) создайте Runner и получите регистрационный токен. Затем зарегистрируйте агент в Termux:
gitlab-runner registerВо время регистрации укажите:
- GitLab URL
- Registration token
- Description (например,
termux-android-runner) - Tags (например:
android,termux) - Executor. Для Android сборок обычно подходит
shell(проще). В вариантах с контейнерами требуется дополнительная инфраструктура.
Пример (как текстовые значения в подсказках), без жесткой привязки:
gitlab-runner register
# URL: https://gitlab.example.com/
# Token: <registration-token>
# Executor: shell
# Tags: android, termux
# Run untagged: false
# Lock to current project: falseЗапуск runner
Запустите runner. В зависимости от того, как вы установили бинарник, используйте:
gitlab-runner runДля более удобного управления можно поднять запуск в фоне и логирование через termux-services или screen/tmux (без изменения функционала, только удобство).
CI/CD переменные: как хранить секреты
Для подписи сборок и загрузки в Play Console вам почти наверняка понадобятся секреты:
- Keystore (файл) + пароль + alias + пароль ключа.
- Либо конфигурация на основе Google Play App Signing (в зависимости от процесса релизов).
- Service account для доступа к Play Developer API (если используете загрузку через официальные инструменты).
Рекомендуемая практика: хранить секреты в GitLab как CI/CD Variables:
KEYSTORE_B64(keystore, закодированный в base64)KEYSTORE_PASSWORDKEY_ALIASKEY_PASSWORDPLAY_SERVICE_ACCOUNT_B64(json ключ, base64)PLAY_PACKAGE_NAME(com.your.app)
И добавьте маскирование/защиту (Protected) для релиз‑пайплайнов.
Пример .gitlab-ci.yml для Android (Gradle)
Ниже — каркас пайплайна: сборка, (опционально) тесты и подготовка артефакта AAB для релиза. Пример рассчитан на shell executor и runner с тегами android.
stages:
- build
- test
- release
variables:
GRADLE_USER_HOME: "$CI_PROJECT_DIR/.gradle"
ANDROID_HOME: "$HOME/android-sdk"
# PATH можно расширить в before_script, если нужно
before_script:
- export PATH="$PATH:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools"
- chmod +x ./gradlew || true
build_aab:
stage: build
tags: ["android", "termux"]
script:
- ./gradlew --version
- ./gradlew clean bundleRelease
artifacts:
when: always
paths:
- app/build/outputs/bundle/release/.aab
expire_in: 14 days
unit_tests:
stage: test
tags: ["android", "termux"]
script:
- ./gradlew testDebugUnitTest
artifacts:
when: always
reports:
junit: app/build/test-results/testDebugUnitTest/.xml
expire_in: 7 days
release_upload:
stage: release
tags: ["android", "termux"]
rules:
- if: '$CI_COMMIT_TAG' # пример: релиз по тегу
script:
- echo "Preparing Google Play service account..."
- echo "$PLAY_SERVICE_ACCOUNT_B64" | base64 -d > "$CI_PROJECT_DIR/play-service-account.json"
- export PLAY_PACKAGE_NAME="$PLAY_PACKAGE_NAME"
- ls -la app/build/outputs/bundle/release || true
- AAB_PATH="$(ls app/build/outputs/bundle/release/.aab | head -n 1)"
- test -f "$AAB_PATH"
- echo "Uploading: $AAB_PATH"
# Здесь подставьте команду загрузки в Play Console (официальный инструмент/скрипт)
# Например, через Google Play Developer API tooling:
# - bundletool / googleapis / upload script (зависит от выбранного метода)
artifacts:
when: always
paths:
- "$CI_PROJECT_DIR/play-service-account.json"
expire_in: 1 dayВажно: конкретная команда загрузки зависит от выбранного вами инструмента. Универсальный принцип — использовать подписанный релиз‑артефакт и service account с минимальными правами. Не выводите секреты в лог.
Подпись релиза в CI (Gradle)
Подпись обычно настраивается в app/build.gradle через signingConfigs. В CI вы подставляете keystore и пароли. Вариант через параметры окружения:
// app/build.gradle (фрагмент, пример идеи)
android {
signingConfigs {
release {
storeFile file(System.getenv("KEYSTORE_FILE") ?: "")
storePassword System.getenv("KEYSTORE_PASSWORD")
keyAlias System.getenv("KEY_ALIAS")
keyPassword System.getenv("KEY_PASSWORD")
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}А в job добавьте создание keystore из base64:
echo "$KEYSTORE_B64" | base64 -d > "$CI_PROJECT_DIR/release.keystore"
export KEYSTORE_FILE="$CI_PROJECT_DIR/release.keystore"
export KEYSTORE_PASSWORD="$KEYSTORE_PASSWORD"
export KEY_ALIAS="$KEY_ALIAS"
export KEY_PASSWORD="$KEY_PASSWORD"Если keystore уже используется в проекте локально, в CI его не коммитьте и не храните в репозитории.
Вариант пайплайна для Maven (если нужен)
Android‑проекты чаще собираются через Gradle. Однако, если ваш пайплайн использует Maven (например, отдельные модули/артефакты, или вы публикуете библиотеку), вы можете сделать стадию сборки через Maven. Принцип тот же: отдельный build job, затем публикация артефакта.
stages:
- build
- release
maven_build:
stage: build
tags: ["android", "termux"]
script:
- mvn -v
- mvn -B -DskipTests package
artifacts:
when: always
paths:
- target/.jar
- target/*.aar
expire_in: 14 daysПубликация в Play Console для Android‑приложений обычно всё равно требует корректных apk/aab. Если вы делаете это через Maven‑профили — убедитесь, что результат соответствует требованиям Play (подписан, нужные форматы, версия и package name корректны).
Автоматическая публикация в Play Console: практические нюансы
Чтобы автоматизация прошла гладко:
- Используйте release‑ветку/теги для запуска release_upload.
- Проверьте, что собранный артефакт — именно AAB для App Bundle (часто предпочтительнее для новых релизов).
- Убедитесь в согласованности versionCode/versionName. Play требует уникальности versionCode.
- Не печатайте секреты в лог job’а. В GitLab переменные можно сделать masked.
- Настройте rollout/track в Play Console (например, internal testing). Это зависит от API и сценария загрузки.
При локальном запуске на Termux обязательно следите за стабильностью сети и тайм‑аутами скачивания зависимостей. Для ускорения можно кэшировать .gradle и зависимости, используя cache в GitLab (по желанию добавьте, например, кэш Gradle).
Кэширование и ускорение сборок на Termux
Для снижения времени сборки добавьте кэширование Gradle:
cache:
key: "gradle-cache"
paths:
- .gradle/wrapper
- .gradle/cachesРасположения путей подстройте под ваш workspace. В примере выше мы использовали GRADLE_USER_HOME внутри проекта.
Рекомендованный workflow для релизов
- Merge request в основную ветку запускает build и test.
- После успешного тестирования создавайте тег (или релиз‑флаг) — запускается release_upload.
- В Play Console загружайте релиз в нужный трек (internal/closed/open) и отслеживайте результаты.
Частые ошибки
- Runner не находит команды: проверьте
PATHдляsdkmanager/platform-toolsи наличие JDK. - Ошибка подписи: убедитесь, что keystore и пароли реально подставляются в job, а путь
storeFileкорректный. - Несовпадение SDK: сборка падает из‑за отсутствия нужных platform/build-tools — установите нужные версии на Termux.
- Ошибка versionCode: Play отклоняет повторно используемый versionCode — добавьте автоинкремент через Gradle task или скрипт.
Заключение
CI/CD для Android‑проекта в Termux реально построить на базе GitLab Runner: вы поднимаете runner в Termux, настраиваете сборку через Gradle (или Maven для отдельных артефактов), безопасно храните секреты в GitLab CI/CD Variables и автоматизируете загрузку подписанных сборок в Play Console по тегам/релизам. Такой подход ускоряет разработку, уменьшает ручные действия и повышает воспроизводимость релизов.
Если хотите, чтобы мы помогли вам спроектировать пайплайн под ваш проект (Gradle-модули, подпись, tracks в Play, кэширование и надежность runner в Termux), обратитесь в РыбинскЛАБ — услуги по внедрению и сопровождению CI/CD для Android и инфраструктуры DevOps.