【簡単】GitHub ActionsでGoogle Play Consoleへのアプリリリースを自動化してみよう！

# はじめに
この記事では、GitHub ActionsでGooge Play ConsoleにAndroidアプリをアップロード・内部テスト公開をし、内部テスターがテストできるようにする方法について記載します。
ライブラリのオプションに指定する値を変えれば、製品版へのリリースも可能です。
ストア情報の作成やビルドなどを手動で行うのは手間もかかる上ミスも発生しやすいので、できる限り自動化をしていきましょう。

# 前提
* 内部テストへのリリースについて記載します
* ビルド物(apk, aab)はPlay Storeにアップロードするstepの前にビルドされており、任意のディレクトリに保存できていること（つまりビルド方法については割愛します）
  * ジョブが異なる場合はArtifactを利用するなどして、 ビルド物を参照できるようにしてください。
* ライブラリはapkにも対応しているようですが、ここではaabとして記載していきます。


# 今回使うライブラリ
[r0adkll/upload-google-play](https://github.com/r0adkll/upload-google-play)というGitHub Actionsで利用できるライブラリを使用します。
このライブラリはGoogle Play Developer API v3を内部的に利用しており、現在もメンテナンスが続いているようです。
また、個人的な感想ですが直感的に利用でき、TypeScriptで書かれているのでライブラリ内部のコードも読みやすかったです。
必要な情報やファイルを用意すれば、簡単にGoogle Play Consoleにデプロイすることができます。


# 用意するもの
## GCPのサービスアカウント
認証なしでアップロードすることはできませんので、サービスアカウントが必要になります。
サービスアカウントの作成手順は[こちら](https://techblog.zozo.com/entry/google-play-upload#:~:text=Google%20Cloud%20Platform%E3%81%A7%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)が参考になりました。
今回は`serviceAccountJsonPlainText`プロパティを利用するので、JSONをダウンロードしたら`GCP_SERVICE_ACCOUNT_JSON`という名前のSercretsを作成し、JSONの中身をそのままペーストしてください。

# ワークフローファイル
`.github/workflows`ディレクトリに`deploy_to_google_play_console.yml`というファイルを作成し、下記をコピペしてください。


```yml:.github/workflows/deploy_to_google_play.yml

name: Deploy To Google Play

on:
  workflow_dispatch:

jobs:
  deploy_to_google_play:
    runs-on: ubuntu-latest
    timeout-minutes: 30
    steps:
      - name: checkout
        uses: actions/checkout@v4
        
      - name: Deploy to Google Play
        uses: r0adkll/upload-google-play@v1
        with:
          serviceAccountJsonPlainText: ${{ secrets.GCP_SERVICE_ACCOUNT_JSON }}
          packageName: com.example.MyApp
          releaseFiles: ./app-release.aab
          track: internal
          status: completed

```
要所を解説します。
* `serviceAccountJsonPlainText`...GitHub Secretsに保存してある、GCPのサービスアカウントのJsonの中身（文字列）です。代わりに`serviceAccountJson`という直接ファイルを指定するプロパティもあります。
* `packageName`...デプロイ対象のアプリのパッケージ名（アプリケーションID）です。
* `releaseFiles`...リリース対象となるビルド物のパスです。
* `track`...アップロードする際に割り当てたいトラックを指定します。
  * 製品版...production（デフォルト）
  * 内部テスト...internal
  * 他にもalphaやbetaも指定できます。詳細は[こちら](https://developers.google.com/android-publisher/tracks?hl=ja#adding_and_modifying_apks)
* `status`...リリースのステータスです。今回は内部テスト全ユーザーに公開したいので、「completed」を選択しました。選択肢は[こちら](https://developers.google.com/android-publisher/api-ref/rest/v3/edits.tracks?hl=ja#status)を参照ください。



ここには書きませんが、下記も可能です。
* `status`がinProgressまたはhaltedの時のみ、`userFraction`で何%のユーザーに公開するか段階リリースの調整


詳しくは[README](https://github.com/r0adkll/upload-google-play?tab=readme-ov-file#upload-android-release-to-the-play-store)をご覧ください。

# 実行！
今回はworkflow_dispatchを設定しているので、GitHub ActionsのGUIから実行します。
実行が成功したら、Google Play Consoleでストア情報が作成され、内部テストユーザーに公開されていることを確認してください。

# おまけ： リリースノートを指定する
リリースノートの指定の仕方が少し癖があったので、日本語のリリースノートを指定してアップロードする方法を紹介します。
まず、`distribution/whatsnew`ディレクトリを作成、その中に`whatsnew-ja-JP`というファイルを作成します。この時文章内に`<ja-JP>`のようなタグは不要で、リリースノートに指定したい文章をそのまま記述します。


```:distribution/whatsnew/whatsnew-ja-JP
軽微な修正をしました。
```

詳細は、[testディレクトリ配下](https://github.com/r0adkll/upload-google-play/tree/master/__tests__/whatsnew)が参考になります。
また、ファイルの命名規則などはライブラリの[このファイル](https://github.com/r0adkll/upload-google-play/blob/master/src/whatsnew.ts#L11)で行っているので、気になる方はご覧ください。


下記の通り、`whatsNewDirectory: distribution/whatsnew`を追加します。

```yml
      - name: Deploy to Google Play Console
        uses: r0adkll/upload-google-play@v1
        with:
          serviceAccountJsonPlainText: ${{ secrets.GCP_SERVICE_ACCOUNT_JSON }}
          packageName: com.example.MyApp
          releaseFiles: ./app-release.aab
          track: internal
          status: completed
          whatsNewDirectory: distribution/whatsnew #追記

```

以上です。

# 参考
https://techblog.zozo.com/entry/google-play-upload

https://qiita.com/mangano-ito/items/c8de5d602928101238ca