LoginSignup
24
11

More than 3 years have passed since last update.

GitHub Actions で Android アプリのリリース署名をする

Last updated at Posted at 2020-06-19

リリース用の証明書やそれらのパスワード類は、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 に設定しておきます。

スクリーンショット 2020-06-19 21.16.47.png

証明書は上図の 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 で扱う場合、シングルクォートだと文字によってはエラー(例えば <など)になってしまうので、ダブルクォートを利用しています。

24
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
11