Привет, Хаброжители! На днях начал изучать GitHub Actions для Android. Ранее у меня была удачная попытка настройки данного функционала для проекта на Flutter, но без деплоя, для которого полно информации и гайдов как на англоязычных ресурсах, так и на русскоязычных, а вот с нативным андроидом не всё так прозаично. И решил записать основные проблемы и их решение.
keystore.properties
, который позволяет нам добавить ключ разработчика в папку проекта, не светя при этом паролями от него, делается это так:apply plugin: ...
def keystorePropertiesFile = rootProject.file("keystore.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
android {
...
signingConfigs {
release {
storeFile file("../MyKey.jks")
storePassword keystoreProperties['RELEASE_STORE_PASSWORD']
keyAlias keystoreProperties['RELEASE_KEY_ALIAS']
keyPassword keystoreProperties['RELEASE_KEY_PASSWORD']
}
debug {
storeFile file('../debug.keystore')
}
}
buildTypes {
release {
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
minifyEnabled false
signingConfig signingConfigs.release
buildConfigField "String", "PIN_ALIAS", keystoreProperties['PIN_ALIAS']
buildConfigField "String", "DB_PASS_ALIAS", keystoreProperties['DB_PASS_ALIAS']
}
debug {
minifyEnabled false
signingConfig signingConfigs.debug
buildConfigField "String", "PIN_ALIAS", keystoreProperties['PIN_ALIAS']
buildConfigField "String", "DB_PASS_ALIAS", keystoreProperties['DB_PASS_ALIAS']
}
}
}
dependencies {
...
}
${{ secrets.MY_KEY }}
и при этом градл понимал, если у нас есть keystore.properties, то берём из него, если нет то берём из секретов? Решение нашлось на одном из гайдов для флаттера, где для этого они использую окружения (Кстати, здесь классный подход, чтобы не светить нашим ключём разработчика), но проблему это не решило. Перепробовав несколько вариантов с введением дополнительных файлов и т.п., остановился на самом простом: мы вводим дополнительно несколько переменных(в зависимости от нужного нам количества), и проверяем наличие файла keystore.properties:def release_store_password
def release_key_password
def release_key_alias
def pin_alias
def db_pass_alias
def keystoreProperties = new Properties()
if (rootProject.file("keystore.properties").exists()) {
keystoreProperties.load(new FileInputStream(rootProject.file("keystore.properties")))
release_store_password = keystoreProperties['RELEASE_STORE_PASSWORD']
release_key_password = keystoreProperties['RELEASE_KEY_PASSWORD']
release_key_alias = keystoreProperties['RELEASE_KEY_ALIAS']
pin_alias = keystoreProperties['PIN_ALIAS']
db_pass_alias = keystoreProperties['DB_PASS_ALIAS']
} else {
release_store_password = System.env.RELEASE_STORE_PASSWORD
release_key_password = System.env.RELEASE_KEY_PASSWORD
release_key_alias = System.env.RELEASE_KEY_ALIAS
pin_alias = System.env.PIN_ALIAS
db_pass_alias = System.env.DB_PASS_ALIAS
}
android {
signingConfigs {
release {
storeFile file("../my_key.jks")
storePassword = release_store_password
keyAlias = release_key_alias
keyPassword = release_key_password
}
buildType{
release {
buildConfigField "String", "PIN_ALIAS", "\"$pin_alias\"" //если вам нужно ввести некоторые
buildConfigField "String", "DB_PASS_ALIAS", "\"$db_pass_alias\"" // дополнительные данны.
}
}
}
BUILD_NUMBER
, но тут я наткнулся на параметр у для GitHub actions: ${{ github.run_number }}.def versionPropsFile = rootProject.file('version.properties')
Properties versionProps = new Properties()
versionProps.load(new FileInputStream(versionPropsFile))
def verCode = versionProps['VERSION_CODE'].toInteger()
android {
defaultConfig {
versionCode verCode
versionName "1.1.$verCode"
}
}
//version.properties файл
VERSION_CODE=1
- name: Output version code
run: echo VERSION_CODE=${{ github.run_number }} > ./version.properties
- name: Upload to PlayMarket
uses: r0adkll/upload-google-play@v1
with:
serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}
packageName: com.guralnya.notification_tracker
releaseFile: app/build/outputs/apk/release/notification_tracker.release.apk
track: beta
userFraction: 0.33
whatsNewDirectory: distribution/whatsnew
notification_tracker.release.*.apk
, где у меня стоит время сборки. Хотя в другом экшене, который у меня используется для загрузки файла (actions/upload-artifact@v2), такой подход работал отлично.
name: Android_CI
on:
push:
branches:
- beta_release
jobs:
build:
runs-on: ubuntu-latest
name: Build release-apk and deploy to PlayMarket
steps:
- uses: actions/checkout@v2
- name: set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
# Without NDK not compile and not normal error message. NDK is required
- name: Install NDK
run: echo "y" | sudo ${ANDROID_HOME}/tools/bin/sdkmanager --install "ndk;20.0.5594570" --sdk_root=${ANDROID_SDK_ROOT}
# Some times is have problems with permissions for ./gradle file. Then uncommit it code
# - name: Make gradlew executable
# run: chmod +x ./gradlew
- name: Output version code
run: echo VERSION_CODE=${{ github.run_number }} > ./version.properties
- name: Build with Gradle
run: ./gradlew assemble
env:
RELEASE_STORE_PASSWORD: ${{ secrets.RELEASE_STORE_PASSWORD }}
RELEASE_KEY_PASSWORD: ${{ secrets.RELEASE_KEY_PASSWORD }}
RELEASE_KEY_ALIAS: ${{ secrets.RELEASE_KEY_ALIAS }}
PIN_ALIAS: ${{ secrets.PIN_ALIAS }}
DB_PASS_ALIAS: ${{ secrets.DB_PASS_ALIAS }}
- name: Upload APK
uses: actions/upload-artifact@v2
with:
name: notification_tracker
path: app/build/outputs/apk/release/notification_tracker.release.apk
- name: Upload to PlayMarket
uses: r0adkll/upload-google-play@v1
with:
serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}
packageName: com.guralnya.notification_tracker
releaseFile: app/build/outputs/apk/release/notification_tracker.release.apk
track: beta
userFraction: 0.33
whatsNewDirectory: distribution/whatsnew
Task :app:stripDebugDebugSymbols FAILED
. После гуглинга и экспериментов, оказалось что нет NDK. Делаем так:- name: Install NDK
run: echo "y" | sudo ${ANDROID_HOME}/tools/bin/sdkmanager --install "ndk;20.0.5594570" --sdk_root=${ANDROID_SDK_ROOT}
defaultConfig {
ndkVersion '21.2.6472646'
}
К сожалению, не доступен сервер mySQL