Как раскатывал тестовые сборки на Android
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Управление тестовыми сборками Android: от CI/CD до раздачи
Раскатка тестовых сборок на Android — это критически важный процесс в конвейере доставки, требующий автоматизации, контроля версий и удобного доступа для всех участников команды (разработчики, тестировщики, продакт-менеджеры, дизайнеры). За свою практику я выстроил и поддерживал несколько подходов, эволюционирующих от ручных методов до полностью автоматизированных CI/CD-пайплайнов, которые являются сегодня стандартом индустрии.
Инфраструктура и инструменты автоматической сборки (CI)
Первым и главным шагом является настройка непрерывной интеграции (Continuous Integration).
- Система контроля версий (VCS): Весь код, включая основной проект, тесты и конфигурации сборки, хранится в Git (GitHub, GitLab, Bitbucket). Используется модель ветвления, например, Git Flow или GitHub Flow.
- CI-сервер: Настраивается Jenkins, GitLab CI/CD, GitHub Actions или Bitrise. Он реагирует на события в репозитории (
push,pull request,merge,tag). - Конфигурация сборки (build.gradle): В файле
app/build.gradleнастраиваются разные build variants (продукционные флейворы, типаprodDebug/prodRelease, и тестовые, типаstagingDebug). Для тестовых сборок часто:
* Используется другое **Application ID** (например, `.app.staging`), чтобы позволить установить две версии приложения одновременно.
* Настраивается отдельный **backend endpoint** (через **buildConfigField**).
* Включается логирование и отладка, которые отключены в продакшене.
Пример конфигурации флейвора в build.gradle:
android {
flavorDimensions "environment"
productFlavors {
staging {
dimension "environment"
applicationIdSuffix ".staging"
buildConfigField("String", "API_URL", '"https://api.staging.example.com"')
resValue "string", "app_name", "MyApp (Staging)"
}
production {
dimension "environment"
buildConfigField("String", "API_URL", '"https://api.example.com"')
}
}
}
Скрипт CI-сервера запускает сборку (обычно по нотации assembleStagingRelease), создавая APK или AAB файлы.
Распределение и доставка сборок (CD)
После успешной сборки артефакт необходимо раздать команде. Здесь используются специализированные сервисы, интегрируемые в CI-пайплайн.
- Внутреннее тестирование (Alpha): Для быстрой раздачи внутри команды разработки и QA.
* **Firebase App Distribution:** Позволяет загружать сборки и рассылать инвайты по email или через группы. Можно интегрировать прямо в **GitHub Actions** или **Jenkins**.
* **Отправка в Slack/Telegram:** Простой скрипт может загружать собранный APK в канал команды. Удобно для мгновенных сборок с фичей.
Пример этапа в **GitHub Actions** для отправки в Firebase:
```yaml
- 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,developers
file: app/build/outputs/apk/staging/release/app-staging-release.apk
```
2. Закрытое бета-тестирование: Для расширенного круга тестировщиков (Early Access Program).
* **Google Play Console (Внутренний/Закрытый трек):** Самый интегрированный способ. Сборка подписывается релизным ключом и загружается в закрытый трек. Тестировщики получают обновления через официальный магазин.
* **Microsoft App Center:** Альтернатива Firebase с богатыми возможностями по распределению, crash-репортам и аналитике.
- Автоматизация и нотификации: Любой успешный билд должен сопровождаться автоматическим уведомлением. В сообщении (email, Slack) обязательно указывается:
* Номер сборки (версия из `BuildConfig.VERSION_NAME`).
* Ссылка на скачивание.
* Ссылка на **changelog** (например, коммиты с момента предыдущего билда, которые автоматически извлекаются из git).
* Ссылка на задачу в **Jira** или **YouTrack**.
Сопровождение и мониторинг
Просто раздать сборку недостаточно. Важно поддерживать порядок:
- Версионирование артефактов: Каждая сборка имеет уникальный номер (
versionCode), часто привязанный к номеру билда в CI (например,Jenkins BUILD_ID). - Хранение артефактов: CI-сервер или облачное хранилище (например, Google Cloud Storage) сохраняют не только конечный APK, но и mapping-файлы для декодирования crash-логов. Последние 20-30 сборок обычно хранятся, более старые архивируются.
- Информационная панель (Dashboard): Для наглядности можно создать простую веб-страницу со списком последних доступных сборок, их статусом (прошел smoke-тесты/не прошел) и ссылками. Это может быть статическая страница, генерируемая CI-скриптом.
Заключение
В итоге, идеальный процесс раскатки выглядит так: разработчик создает pull request -> CI запускает сборку и unit-тесты -> после мержа в ветку develop автоматически собирается staging-сборка -> она загружается в Firebase App Distribution и закрытый трек Google Play -> уведомление со ссылками и списком изменений приходит в чат команды. Это обеспечивает непрерывную доставку (Continuous Delivery) тестовых сборок с минимальными задержками и максимальной прозрачностью, что напрямую влияет на скорость разработки и качество продукта.