Workload Identity 連携で認証する、Google Play Store へのアプリのデプロイ【GitHub Actions】

2025/10/25 22:17公開

この記事では、Google Cloud の Workload Identity 連携を活用し、シークレット情報を直接 GitHub 上に置かずに GitHub Actions から Google Play Store へのアプリデプロイを実現する方法を解説します。

Table of Contents
  1. 今回の方法の概要
  2. 事前準備:Google Cloudのプロジェクトを作成する
  3. サービスアカウントを作成する
  4. サービスアカウントにアクセス権を与える
  5. Workload Identity 連携の設定をする
  6. Google Play Android Developer APIを有効化する
  7. プロジェクトの中身を編集する
  8. ワークフローを修正する
    1. JSON形式のサービスアカウントキーを配置するアクションを削除する
    2. ジョブに権限を追加
    3. ステップを追加
  9. GitHubでリポジトリの設定を編集する

今回の方法の概要

  • 今回は、CI上でのデプロイに Fastlane を使用します。プロジェクトでAndroid用にFastlaneがセットアップされている前提となります。2025/10/24現在の最新版は Workload Identity 連携を使用した認証に対応していない ため、私がフォークして修正したバージョンを利用します。本番で利用したい場合は、自身でフォークされることを推奨します。(本家はしばらくメンテされず放置されているようです。)
  • デプロイ先は 内部テストトラック となります。製品版のリリース作業はWeb上で行う想定です。
  • 説明にあるGoogle CloudなどのUIは、2025年10月頃のものです。今後変更される可能性があります。

事前準備:Google Cloudのプロジェクトを作成する

まず、事前準備として、Google Cloud上にアプリ用のプロジェクトを作成します。既にFirebaseの利用やSign in with Googleなどで、そのアプリ専用のプロジェクトが存在している場合は、新規に作成せず、そちらを使っても構いません。

まず、Google Cloud Console にアクセスし、左上のプロジェクト選択をクリックします。

image.webp

「新しいプロジェクト」をクリックします。

image.webp

表示されたフローに従って、プロジェクト名にアプリ名を含めて、プロジェクトを作成してください。

サービスアカウントを作成する

プロジェクトができたら、ユーザーに代わってアプリのデプロイを担うサービスアカウントを作成します。メニューから「IAMと管理」→「サービス アカウント」をクリックします。

プレビュー 2025-09-26 09.52.39.webp

上部の「サービス アカウントを作成」をクリックします。

image.webp

サービスアカウント名は「google-play-deploy」など、わかりやすい適当な名前を設定します。その少し下に メールアドレス が表示されていますが、これは後で使うため、右にある コピーボタンをクリック してコピーしておいてください。コピーし忘れても、サービスアカウントのリストから確認できます。

他は何もいじる必要はないため、「完了」をクリックして作成します。

image.webp

サービスアカウントにアクセス権を与える

サービスアカウントが出来たら、新しいタブを開き、Google Play Console にアクセスします。

メニューから「ユーザーと権限」を選択し、「新しいユーザーを招待」をクリックします。

image.webp

「メールアドレス」には先程コピーしたメールアドレスを入力します。少し下にスクロールし、「アプリの権限」で 今回デプロイするアプリのみ を選択します。

次に、サービスアカウントに与える権限を付与します。付与する権限は

  • アプリ情報の閲覧(読み取り専用)
  • テスト版トラックとしてのアプリのリリース

この2つを選択してください。

最後に、「ユーザーを招待」をクリックします。サービスアカウントにおいては、招待を承諾する必要はなく、すぐに使えるようになります。

Workload Identity 連携の設定をする

権限を付与できたら、Google Cloud Consoleに戻り、メニューから「Workload Identity 連携」をクリックします。その右にある「開始」をクリックします。

image.webp

名前 を「GitHub Actions」とし*続行 をクリックします。

* 名前は任意ですが、今後この名前に基づいて説明を行います。

プレビュー 2025-09-26 10.15.29.webp


以下のように入力し、続行 をクリックします。

フィールド名
プロバイダの選択 OpenID Connect (OIDC)
プロバイダ名 GitHub
発行元(URL) https://token.actions.githubusercontent.com
オーディエンス 許可するオーディエンス
対象1 リポジトリのあるGitHub プロフィールのURL(https://github.com/<username>の形式)

image.webp

image.webp


以下のように入力します。

フィールド名
OIDC 1 assertion.sub
マッピングを追加
Google 2 attribute.repository
OIDC 2 assertion.repository

image.webp

最後に 保存 をクリックします。

すると、プールの詳細画面に移動すると思います。少し下にある「IAMプリンシパル」の文字列のうち、下の画像で選択されている部分は後で使うため、コピーしておいてください。「projects」から「actions」までです。

image.webp

次に、画面上部の アクセスを許可 をクリックします。

image.webp

サービス アカウントの権限借用を使用してアクセス権を付与する を選択し、先程作成したサービスアカウントを選択します。プリンシパルの属性名を repository を選択し、属性値には <GitHubユーザー名>/<リポジトリ名>の形式で入力します。そして 保存 をクリックします。

image.webp

Google Play Android Developer APIを有効化する

https://console.cloud.google.com/marketplace/product/google/androidpublisher.googleapis.com

こちらにアクセスし、Google Cloudからアプリの管理を行うための API を有効化します。これをやらないと失敗します。

image.webp

プロジェクトの中身を編集する

次に、デプロイしたいアプリのプロジェクトの fastlane ディレクトリを確認します。Appfile の中身を以下のようにしてください。

json_key_file(ENV["GOOGLE_GHA_CREDS_PATH"])
package_name("<package name>")

現在、Fastlaneで、Workload Identity連携を用いて作成されたサービスアカウントキーを使用して認証を行おうとすると、エラーが発生するようです。この問題を修正したフォークを用意したので、Fastlaneをこちらに差し替えます。Gemfileを編集します。

source "https://rubygems.org"

gem "fastlane", git: "https://github.com/chika3742/fastlane-workload-support.git", branch: "support-workload"

ワークフローを修正する

次に、GitHub Actionsのワークフローを修正していきます。既にFastlaneを用いた自動化は実装が完了していると仮定し、変更が必要な箇所のみ説明します。

JSON形式のサービスアカウントキーを配置するアクションを削除する

JSON形式のサービスアカウントキーをsecretsなどから読み取って配置するアクションを削除します。同様に、GitHub上でリポジトリの設定から該当するリポジトリシークレットも削除してください。

ジョブに権限を追加

ジョブの設定に、permissionsを追加します。

jobs:
  play-store-deploy:
    # ...
    permissions:
      contents: read
      id-token: write

ステップを追加

Google Cloudの認証用のステップを Fastlaneを実行するステップより上 (checkoutよりは下)に追加します。

- name: Authenticate to Google Cloud
  uses: google-github-actions/auth@v3
  with:
    workload_identity_provider: ${{ secrets.WIF_PROVIDER }}
    service_account: ${{ secrets.WIF_SERVICE_ACCOUNT }}
    audience: ${{ vars.WIF_AUDIENCE }}

GitHubでリポジトリの設定を編集する

次に、リポジトリシークレットに「Workload Identity プロバイダーID」「サービスアカウントID」の2つを追加します。これらは機密情報ではありませんが、公開するのはあまり好ましい部類の情報ではありませんので、シークレットとすることを推奨します。

image.webp

変数名
WIF_PROVIDER Workload Identity プロバイダーID(詳細は下記)
WIF_SERVICE_ACCOUNT 先程コピーした、サービスアカウントのメールアドレス

Workload Identity プロバイダーIDは、以下の形式で構成されます。

projects/123456789/locations/global/workloadIdentityPools/my-pool/providers/my-provider

この中の123456789はGCPプロジェクト番号、my-poolはWIFプールID、my-providerはWIFプロバイダーIDです。先程「IAMプリンシパル」からコピーした文字列の末尾に/providers/githubを追加すると、この形式になります。

続いて、オーディエンス、つまりユーザープロフィールのURLをリポジトリ変数に追加します。これはあまり秘匿すべき情報ではないので、シークレットでなくても構わないかと思います。Variablesから同様に追加してください。

image.webp

変数名
WIF_AUDIENCE https://github.com/<ユーザー名>