В процессе разработки React Native приложений может быть неудобно каждый раз вручную выполнять процесс сборки. Однако, с использованием инструментов GitHub Actions и отправки полученной сборки в Telegram, можно значительно упростить этот процесс. В данной статье мы рассмотрим, как автоматизировать сборку React Native приложения на этапе разработки и передавать полученные сборки тестировщикам через Telegram, обеспечивая более удобное и эффективное развертывание мобильных приложений.
1. Создать внутри репозитория Secrets
Открываем репозиторий своего проекта в Github,переходим по следующему пути Settings → Secrets and variables → Actions → New repository secret. И создаем следуюущие записи
KEYSTORE_B64
# Генерирует из файла хранилища ключей (*.keystore, *.jks)
# текстовый документ (*.txt), который содержит base64
# представление хранилища ключей, именно его и надо записать
# в secret
openssl base64 < playstore.keystore | tr -d '\n' | tee playstore_base64_encoded.txt
KEYSTORE_PASSWORD - Пароль для хранилища ключей
KEY_ALIAS - Псевдоним ключа подписи
KEY_PASSWORD - Пароль ключа подписи
TELEGRAM_CHAT_ID - ID чата с ботом телеграм
TELEGRAM_TOKEN - Токен бота телеграм для отправки файлов и сообщений
ENV_FILE (optional) - Если в проекте используется библиотека react-native-dotenv либо подобная, то необходимо добавить в этот secret содержимое файла .env
2. Создать новый action
Создаем yml файл описывающий наш action /.github/workflows/build_apk.yml со следующим содержимым
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
apk:
name: Generate APK
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup JDK
uses: actions/setup-java@v3
with:
distribution: temurin
# Нужно выбрать нужную версию java
java-version: '17'
- name: Setup Node
uses: actions/setup-node@v4
with:
# Нужно выбрать нужную версию Node
node-version: '19'
- name: NPM install
run: npm i
# Если используется .env
- name: Create .env
run: echo "${{secrets.ENV_FILE}}" > .env
- name: Create keystore file
run: echo "${{secrets.KEYSTORE_B64}}" | base64 -d > android/app/signing-key.keystore
- name: Set execution flag for gradlew
run: chmod +x android/gradlew
- name: Build APK
env:
KEY_ALIAS: ${{secrets.KEY_ALIAS}}
KEY_PASSWORD: ${{secrets.KEY_PASSWORD}}
KEYSTORE_PASSWORD: ${{secrets.KEYSTORE_PASSWORD}}
run: cd android && ./gradlew assembleRelease && cd ../
- name: Upload APK
uses: actions/upload-artifact@v3
with:
name: apk
path: android/app/build/outputs/apk/release/app-release.apk
- name: Send to telegram
run: curl -s -X POST https://api.telegram.org/bot${{secrets.TELEGRAM_TOKEN}}/sendDocument -F chat_id=${{secrets.TELEGRAM_CHAT_ID}} -F document=@android/app/build/outputs/apk/release/app-release.apk -F caption="${{github.event.head_commit.message}}"
- name: Delete keystore file
run: rm android/app/signing-key.keystore
# Если используется .env
- name: Delete .env
run: rm .env
3. Изменить build.gradle
Изменить файл /app/build.gradle по примеру ниже
android {
// ...
defaultConfig {
// ...
}
signingConfigs {
release {
storeFile file("signing-key.keystore")
storePassword System.getenv("KEYSTORE_PASSWORD")
keyAlias System.getenv("KEY_ALIAS")
keyPassword System.getenv("KEY_PASSWORD")
}
}
buildTypes {
release {
// ...
signingConfig signingConfigs.release
}
}
}