目標
- リリースビルドのバージョンを自動的に設定する。
- 同じコミットが同じバージョンになる ("再現できるビルド")。
- サインキーなどをコミットに残さない。
- これらの設定を必須としない: 開発者がcloneしてからすぐ実行できる。
原理
- コミット自身の情報で、バージョンを生成する
- バージョンとサイン設定を環境変数としてインジェクトする
- 上記環境変数がない場合、暗黙的にデフォルト設定を使う
コード
build.gradle
:
// 環境変数をString / Integerに読み込む関数
def env = { System.getenv it }
def envInt = { Integer.parseInt(env(it)) }
android {
defaultConfig {
if (env("ANDROID_VERSION_CODE")) {
// 環境変数のバージョンを優先に使う
versionCode envInt("ANDROID_VERSION_CODE")
versionName env("ANDROID_VERSION_NAME")
} else {
// 環境変数がなければデフォルト設定を使う
versionCode 1
versionName "1.0"
}
}
}
if (env("ANDROID_SIGN_APK"))
// サイン設定: 環境変数がある場合のみ適用される
android {
signingConfigs {
releaseSigning {
storeFile file(env("ANDROID_KEYSTORE_PATH"))
storePassword env("ANDROID_KEYSTORE_PASS")
keyAlias env("ANDROID_KEY_ALIAS")
keyPassword env("ANDROID_KEY_PASS")
}
}
buildTypes {
release {
signingConfig signingConfigs.releaseSigning
}
}
}
CIサーバのビルドコマンド:
#!/bin/bash
# JDK & SDKパス
export ANDROID_HOME=/somewhere/android-sdk-linux
export JAVA_HOME=/somewhere/jdk1.8.0_65
# サイン設定
export ANDROID_KEYSTORE_PATH=/somewhere/keys.jks
export ANDROID_SIGN_APK=yes
export ANDROID_KEYSTORE_PASS=secret
export ANDROID_KEY_ALIAS=secret
export ANDROID_KEY_PASS=secret
# バージョン設定
# versionCode: 現在のコミットからたどり着けるコミットの数 (=== 先祖コミット数+1)。
# リリースブランチであればたいてい単調増加する。連続ではないが。
export ANDROID_VERSION_CODE="$(git rev-list HEAD --count)"
# versionName: 現在のコミットSHA1の最初の8文字
export ANDROID_VERSION_NAME="${GIT_COMMIT:0:8}"
exec sh gradlew assembleRelease