リリース用の証明書やそれらのパスワード類は、Git リポジトリにコミットすべきではないので、 GitHub Actions のワークフロー上でこれらを用意して署名するようにします。
まずは、アプリのビルド時に自動的に署名がされるような設定を app/build.gradle
に記述します。
app/build.gradle
// ...
signingConfigs {
debug {
// デバッグ用の証明書はリポジトリににコミットしてしまってもよいと思います。
// 今回はプロジェクトのルートに debug.keystore が配置されているものとします。
// 尚、Android Studio でデフォルトで用意される証明書であれば、パスワード類の記載は必要ありません。
storeFile rootProject.file('debug.keystore')
}
release {
// GitHub Actions のワークフローで、プロジェクトのルートに release.keystore が配置され、
// パスワード類は環境変数へ設定される想定です。
storeFile rootProject.file('release.keystore')
storePassword System.getenv('KEYSTORE_PASSWORD')
keyAlias System.getenv('KEY_ALIAS')
keyPassword System.getenv('KEY_PASSWORD')
}
}
buildTypes {
debug {
signingConfig signingConfigs.debug
// ...
}
release {
// 今回は、署名なしの release ビルドも可能とする為に判定処理をいれています。
if (rootProject.file('release.keystore').exists()) {
signingConfig signingConfigs.release
}
// ...
}
}
// ...
証明書やパスワード類は、リポジトリの Secrets に設定しておきます。
証明書は上図の KEYSTORE_BASE64
です。次のように実際の証明書を Base64 エンコードした文字列を設定します。他の項目はそのまま文字列として設定できると思います。
$ cat release.keystore | base64
ここまでで事前の準備は完了です。GitHub Actions のワークフローで次のようにビルドすれば、リリース署名することが出来ます。
build:
name: Build
runs-on: ubuntu-18.04
steps:
- name: Check out
uses: actions/checkout@v2
- name: Set up JDK
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Build with Gradle
run: |
# 今回は、Secrets が設定されいなければ署名なしのapkファイルが作成されるよう判定処理をいれています。
# 確実に署名させたいのであれば、判定処理を外すことで署名エラーとしてしまってもよいと思います。
if [[ -n "${{ secrets.KEYSTORE_BASE64 }}" ]]; then
echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 -d > release.keystore
export KEYSTORE_PASSWORD="${{ secrets.KEYSTORE_PASSWORD }}"
export KEY_ALIAS="${{ secrets.KEY_ALIAS }}"
export KEY_PASSWORD="${{ secrets.KEY_PASSWORD }}"
fi
./gradlew assembleRelease
- name: Get apk path
id: apk-path
run: |
path=$(find **/build/outputs/apk -name '*.apk' -type f | head -1)
echo "::set-output name=path::$path"
# 今回は artifact へ apk ファイルをアップロードし、ワークフローの結果画面がらダウンロードできるようにします。
- name: Upload apk file
uses: actions/upload-artifact@v1
with:
name: apk
path: ${{ steps.apk-path.outputs.path }}
注意: secrets を bash で扱う場合、シングルクォートだと文字によってはエラー(例えば <
など)になってしまうので、ダブルクォートを利用しています。