GitHub ActionsによるGoogle Play Consoleへのアプリ自動アップロードの取り組み

ogp

はじめに

こんにちは、ブランドソリューション開発本部 WEAR部 Androidブロックの武永です。普段はファッションコーディネートWEARのAndroidアプリを開発しています。

みなさん、GitHub Actionsでの自動化進めてますか?

毎回ローカルでパッケージをビルドしストアに上げその際に人為的ミスが起こったり、担当者の作業が止まってしまっていませんか?GitHub Actionsを使えば、Google Play Console上に自動アップロードを行うことができます。

導入方法

使用するライブラリはr0adkll/upload-google-playです。

github.com

選定理由は次の通りです。

  1. GitHub Actionsで利用できる
  2. 段階的公開や、クローズドテストにも対応している

それでは実際に見ていきましょう。

.github/workflows直下にファイルを追加

workflows

実行ファイルを.github/workflows直下に作成します。.githubとworkflowsのディレクトリがない場合は作成します。

リポジトリから参照するsecretの追加

次にリポジトリから参照するシークレットを追加します。

  • GITHUB_TOKEN
    • GitHubの設定から追加します
    • 既に作成済みの場合は同じものを流用できます
  • ENCODED_RELEASE_KEYSTORE
    • キーストア
    • Base64形式のテキストにエンコードします
  • KEYSTORE_PASSWORD
    • キーストアのパスワード
  • KEY_PASSWORD
    • キーのパスワード
  • SERVICE_ACCOUNT_JSON
    • サービスアカウントを参照します
    • 次の項目で説明します

上記のシークレットは必須項目です。

Google Cloud Platformでサービスアカウントを作成する

gcp

Google Cloud Platformに移動し、プロジェクト内でサービスアカウントの作成画面に移動します。サービスアカウント名、サービスアカウントID、サービスアカウントの説明(任意)を入力します。ロールは参照者以上にします。オーナー権限でも可能ですが過剰な権限になってしまうので特に必要がなければ参照者を推奨します。サービスアカウントユーザーロールに、作成したアカウントを入力します。

サービスアカウントの秘密鍵を作成する

secretKey サービスアカウントを作成したら次は秘密鍵です。サービスアカウントの詳細からキーを選択し、作成します。キーのタイプはJSONにします。

キーは再度ダウンロードできないので大事な場所に保管しておくことを推奨します。

作成したユーザーを招待する

serviceAccount

サービスアカウントの作成が完了したらGCPからGoogle Play Consoleへ作成したサービスアカウントを招待します。サービスアカウントはZOZOの集団にいるので今回はWEARのプロジェクトに招待する必要があるため権限を付与しています。ユーザーを招待する際にどの権限を付与するかチェックを入れます。

Google Play Console上で権限を付与する

console アカウントの招待後に同じ権限でアプリへの権限を付与します。

実際のコード

トリガー設定

name: Deploy Google Play Console
on:
 pull_request:
   branches:
     - main
   types: [closed]

まず、どのブランチがトリガーになるかを設定します。プルリクエストがクローズされると発火します。マージ先はmainです。ブランチをPushしたときにでも設定は可能です。

ビルド

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      
      - name: set up JDK 11
        uses: actions/setup-java@v1
        with:
          java-version: 11

Java 11でビルドします。

Keystoreをデコード

Keystoreは単純なバイナリなのでBase64形式でencodeし、文字列としてシークレットに保存する必要があります。

- name: Decode Keystore
     run: echo ${{ secrets.ENCODED_RELEASE_KEYSTORE }} | base64 --decode > ${{ test.keystore }}

シークレットから読み取る際にdecodeすることによって元のファイルに戻せます。

App Bundle作成

- name: Generate AAB
  run: ./gradlew :app:bundleRelease
  env:
       RELEASE_KEYSTORE_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }}
       RELEASE_KEYSTORE_KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}

App Bundleを作成します。apkも作成できますがApp Bundle化するに越したことないので対応しましょう。

サービスアカウント作成

- name: Create service_account.json
    id: createServiceAccount
    run: echo '${{ secrets.SERVICE_ACCOUNT_JSON }}' > service_account.json

サービスアカウントを参照します。

デプロイ

- name: Deploy to Play Store
       id: deploy
       uses: r0adkll/[email protected]
       with:
         serviceAccountJson: service_account.json
         packageName: com.test.deplaoy.app
         releaseFile: app/build/outputs/bundle/googlePlayRelease/app-googlePlay-release.aab
         track: beta
         whatsNewDirectory: whatsnew/

Google Play Consoleにデプロイします。こちらで今回採用したライブラリを使用しています。今回はbeta版にアップロードをし、releaseFileについては作成されたApp bundleが置かれる場所を指定しています。

Slack通知設定

- uses: 8398a7/[email protected]
  if: failure()
  with:
    status: ${{ job.status }}
    text: リリースビルドが失敗しました。確認をお願いします。
    mention: 'here'
  env:
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}
- uses: 8398a7/[email protected]
  if: success()
  with:
    status: ${{ job.status }}
    text: リリースビルドが完了しました!
  env:
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}

任意設定ですが、Slack通知を設定します。8398a7/[email protected]はGitHub ActionsからSlack通知するライブラリです。

アップロード後の運用

クローズドテストが優秀!

closedTest WEARの開発では上記のフローでリリースをしています。直接本番リリースも可能ですが、本番と同じ形式のクローズドテストで動作確認が行えるので確認後に本番リリースをします。クローズドテストは招待したメールアドレスのユーザーが確認可能です。

リリース前レポートで事前にエラーを発見できる

リリース前レポートも優秀で、致命的なクラッシュを事前に知ることができます。Google Play Console上でも便利な機能が多いので、ありがたいですね。

今後の課題

この自動アップロード導入により作業効率が上がりました。CIツールは多様な種類がありますが、個人的にGUIがしっかりしているものが使用しやすかったです。導入後にさまざまな課題がでてきました。例えば、他言語対応しているリリースノートをスプレッドシートで定義しておりそれをGoogle Play Cosole上で手動入力しているのですが、こちらも自動化させたいです。

また、今回は採用しなかったのですがGradleの知識があればGradle Play Publisherを使用できると良いと思いました。

最後までご覧いただきありがとうございました。ZOZOでは、各種エンジニアを採用中です。ご興味のある方は以下のリンクからご応募ください。

corp.zozo.com

カテゴリー