5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Android】GitHub Actions × Firebase App Distributionで「環境を選べる」自動配信フローを構築する

5
Last updated at Posted at 2025-12-17

はじめに

弊社では、開発中のアプリをテスターへ簡単に配布できる「Firebase App Distribution」を活用してデバッグを行っています。

非常に便利なサービスですが、手動で配布を行うには以下のような手間が発生します。

1. Android StudioでAPKファイルを生成
2. Firebaseコンソールを開き、App Distributionに配置
3. リリースノートを記入して、テスターに配布/連絡する

そこで本記事では、GitHub Actionsを使ってAndroidアプリ(APK/AAB)をFirebase App Distributionに自動配信する仕組みを紹介します。同じような課題を抱えている方の参考になれば幸いです。

目次

構築した仕組みの概要

今回構築する仕組みの全体像は以下の通りです。

主な機能

  • ビルド/配信環境の選択(開発 / 本番)
  • 出力形式の選択(APK / AAB)
  • Firebase App Distributionへの自動配信
  • Slackへの実行結果通知

image.png

導入方法

1. ワークフローファイルの配置

以下のYAMLファイルを [プロジェクト名]/.github/workflows/ に配置します。

ワークフローファイル全体を表示
.github/workflows/output-build-to-firebase.yml
# 出力したapk or aabファイルをfirebaseにアップロードするaction
name: output-build-to-firebase

#手動で実行
on:
  workflow_dispatch:
    inputs:
      # ビルド環境を選択
      variant:
        description: 'Choose build variant'
        required: true
        type: choice
        default: release
        options:
          - develop
          - release
      # ビルド環境を選択
      extension:
        description: 'Choose extension'
        required: true
        type: choice
        default: aab
        options:
          - aab
          - apk

jobs:
  build:
    runs-on: ubuntu-latest
    timeout-minutes: 30 # 30分超えたら止める
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          ref: ${{ github.ref }} #選択したブランチ
          submodules: true
          token: ${{ secrets.PERSONAL_ACCESS_TOKEN_FOR_BUILD_CHECK }}
          
      #jdkのセットアップ
      - name: Setup JDK
        uses: actions/setup-java@v4
        with:
          distribution: adopt
          java-version: 17
          cache: gradle
      - name: Setup Gradle
        uses: gradle/gradle-build-action@v2
        
      # Gradleの実行権限を付与
      - name: Make gradlew executable 
        run: chmod +x ./gradlew
        
      # keystoreのデコード
      - name: Decode Keystore
        if: ${{ github.event.inputs.variant == 'release' }}
        run: echo '${{ secrets.RELEASE_KEYSTORE_BASE64 }}' | base64 -d> release.jks
        
      # releaseビルド
      - name: Build With Gradle
        if: ${{ github.event.inputs.variant == 'release' }}
        env:
          KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
          KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
          STORE_PASSWORD: ${{ secrets.STORE_PASSWORD }}
          USERNAME: ${{ secrets.BUILD_GITHUB_USERNAME }}
          TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN_FOR_BUILD_CHECK }}
        run: |
          if [ ${{github.event.inputs.extension}} == 'aab' ]; then
            ./gradlew bundle<YOUR_RELEASE_VARIANT>  # 例: bundleProductRelease
          else
            ./gradlew assemble<YOUR_RELEASE_VARIANT>  # 例: assembleProductRelease
          fi
          
      # developビルド
      - name: Build With Gradle (Develop)
        if: ${{ github.event.inputs.variant == 'develop' }}
        env:
          USERNAME: ${{ secrets.BUILD_GITHUB_USERNAME }}
          TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN_FOR_BUILD_CHECK }}
        run: |
          if [ ${{github.event.inputs.extension}} == 'aab' ]; then
            ./gradlew bundle<YOUR_DEBUG_VARIANT>  # 例: bundleDevelopDebug
          else
            ./gradlew assemble<YOUR_DEBUG_VARIANT>  # 例: assembleDevelopDebug
          fi
          
      # aab or apkファイルのパスを取得
      - name: Get apk path
        id: apk-path
        run: |
          if [ ${{github.event.inputs.extension}} == 'aab' ]; then
            path=$(find **/build/outputs/ -name '*.aab' -type f | head -1)
          else
            path=$(find **/build/outputs/ -name '*.apk' -type f | head -1)
          fi
          echo "path=$path" >> $GITHUB_ENV
          
      # Firebase App Distributionへのデプロイ(dev)
      - name: Deploy To Firebase App Distribution
        if: ${{ github.event.inputs.variant == 'develop' }}
        uses: wzieba/Firebase-Distribution-Github-Action@v1
        with:
          appId: ${{ secrets.FIREBASE_DEV_APP_ID }}
          serviceCredentialsFileContent: ${{ secrets.CREDENTIAL_FILE_CONTENT }}
          groups: <YOUR_TESTER_GROUP> # 例: qa-testers
          file: ${{ env.path }}
          
      # Firebase App Distributionへのデプロイ(release)
      - name: Deploy To Firebase App Distribution
        if: ${{ github.event.inputs.variant == 'release' }}
        uses: wzieba/Firebase-Distribution-Github-Action@v1
        with:
          appId: ${{ secrets.FIREBASE_RELEASE_APP_ID}}
          serviceCredentialsFileContent: ${{ secrets.CREDENTIAL_FILE_CONTENT }}
          groups: <YOUR_TESTER_GROUP> # 例: qa-testers
          file: ${{ env.path }}
          
      # Slack通知
      - name: Send Slack Notification
        if: always() && (failure() || success())
        uses: slackapi/slack-github-action@v2.0.0
        with:
          method: chat.postMessage
          token: ${{ secrets.SLACK_BOT_TOKEN }}
          payload: |
            {
              "channel" : ${{ secrets.SLACK_CHANNEL }},
              "text": "GithubActionsを実行しました。",
              "attachments": [
                {
                  "color": "${{ job.status == 'success' && 'good' || 'danger' }}",
                  "fields": [
                    {
                      "title": "実行結果",
                      "value": "${{ job.status == 'success' && ':white_check_mark:' || ':x:' }}${{ job.status }}",
                      "short": true
                    },
                    {
                      "title": "ビルド環境",
                      "value": "${{ github.event.inputs.variant }}",
                      "short": true
                    },
                  ]
                }
              ]
            }

2. ビルドバリアントを設定する

プロジェクトで利用したいビルドバリアントに合わせて、以下の箇所を適宜変更してください。

.github/workflows/output-build-to-firebase.yml
run: |
  if [ ${{github.event.inputs.extension}} == 'aab' ]; then
    ./gradlew bundle<YOUR_RELEASE_VARIANT>  # 例: bundleProductRelease
  else
    ./gradlew assemble<YOUR_RELEASE_VARIANT>  # 例: assembleProductRelease
  fi

run: |
  if [ ${{github.event.inputs.extension}} == 'aab' ]; then
    ./gradlew bundle<YOUR_DEBUG_VARIANT>  # 例: bundleDevelopDebug
  else
    ./gradlew assemble<YOUR_DEBUG_VARIANT>  # 例: assembleDevelopDebug
  fi

3. リポジトリにシークレットを設定する

今回のActionsを動かすために、以下のシークレットをリポジトリに設定します。

必要な設定

Name Detail Option
BUILD_GITHUB_USERNAME Githubのユーザ名 社内ライブラリ等、認証が必要なライブラリを導入していない場合は不要
PERSONAL_ACCESS_TOKEN_FOR_BUILD_CHECK PAT(Personal Access Token)※PATの作成方法 社内ライブラリ等、認証が必要なライブラリを導入していない場合は不要
RELEASE_KEYSTORE_BASE64 リリースのjksファイルをbase64で暗号化したもの 本番ビルドの署名時に使用
KEY_ALIAS アプリのキーエイリアス 本番ビルドの署名時に使用
KEY_PASSWORD アプリのキーパスワード 本番ビルドの署名時に使用
STORE_PASSWORD アプリのストアパスワード 本番ビルドの署名時に使用
FIREBASE_DEV_APP_ID Firebaseの開発環境にアップロードしたいアプリID Firebaseへの配信に使用
FIREBASE_RELEASE_APP_ID Firebaseの本番環境にアップロードしたいアプリID Firebaseへの配信に使用
CREDENTIAL_FILE_CONTENT Google Cloud Platformから取得したサービスアカウントキー Firebaseへの配信に使用
SLACK_BOT_TOKEN 結果を通知するボットのトークン Slackへの通知に使用
SLACK_CHANNEL 通知するSlackチャンネルのID Slackへの通知に使用

4. 本番ビルド用の署名設定をする

Keystoreファイルのエンコード

「RELEASE_KEYSTORE_BASE64」のシークレットに設定する値を作成します。以下のコマンドでjksファイルをBase64エンコードし、出力結果をコピーしてシークレットに設定してください。

openssl base64 < [jksファイルパス] | tr -d '\n' | tee some_signing_key.jks.base64.txt

※Windowsの場合、opensslコマンドがデフォルトでは入っていないので、WSLなどを利用してください。

ビルド設定をGitHub Actions用に変更する

GitHub Actions上で署名できるよう、build.gradle.ktsの署名設定を環境変数にも対応させます。以下のように設定してください。

app/build.gradle.kts
signingConfigs {
  create("release") {
    storeFile = file("<キーストアの格納場所>")
    storePassword = System.getenv("STORE_PASSWORD") ?: "your_store_password"
    keyAlias = System.getenv("KEY_ALIAS") ?: "your_key_alias"
    keyPassword = System.getenv("KEY_PASSWORD") ?: "your_key_password"
  }
}

5. Firebase用の設定をする

アプリIDを確認する

Firebase Consoleの 歯車アイコン > プロジェクトの設定 > マイアプリ からアプリIDを確認し、開発用・本番用それぞれのIDを「FIREBASE_DEV_APP_ID」「FIREBASE_RELEASE_APP_ID」のシークレットに設定します。

image.png

Google Cloud Platformのサービスアカウントキー取得

こちらを参考に取得したキーを「CREDENTIAL_FILE_CONTENT」のシークレットに設定します。

簡易手順

  1. 設定したいFirebaseプロジェクトのGoogleCloudにログイン
  2. 「Firebase App Distribution Admin」の権限を持ったサービスアカウントを作成(既にあればそちらを使用)
  3. キーを作成し、作成したキーの内容をコピーして設定する(作成したキーは再発行できないため、安全な場所に保管してください)

テスターグループを設定する

Firebase Consoleの「App Distribution」>「テスターとグループ」でテスターグループ名を確認し、YAMLファイル内の該当箇所に設定します。

image.png

使用箇所

.github/workflows/output-build-to-firebase.yml
     groups: <YOUR_TESTER_GROUP>  # 例: qa-testers

6. 認証が必要なライブラリに環境変数を設定する

※社内ライブラリなど認証が必要なライブラリを使用している場合のみこの手順が必要です。

settings.gradle.ktsでGitHub Packagesなどから社内ライブラリを取得している場合、GitHub Actionsで設定した環境変数をビルド時に参照できるよう、以下のようにSystem.getenvを追加します。

settings.gradle.kts
maven {    
    name = "GitHubPackages"    
    url = uri("https://maven.pkg.github.com/xx/xx")
    credentials {        
        username = GITHUB_USER ?: System.getenv("USERNAME")
        password = GITHUB_TOKEN ?: System.getenv("TOKEN")    
    } 
}

使用箇所

.github/workflows/output-build-to-firebase.yml
- name: Build With Gradle
    if: ${{ github.event.inputs.variant == 'release' }}
    env:
      KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
      KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
      STORE_PASSWORD: ${{ secrets.STORE_PASSWORD }}
      USERNAME: ${{ secrets.BUILD_GITHUB_USERNAME }}
      TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN_FOR_BUILD_CHECK }}

7. 配信用のSlackBotを設定する

今回はSlack公式が提供しているActionsを利用して、実行結果をSlackに通知しています。

通知の動作について

  • if: always() && (failure() || success()) により、ビルドの成功・失敗に関わらず通知されます
  • 成功時は緑色(✅)、失敗時は赤色(❌)になり、一目で結果が分かります。
  • 通知内容はpayload部分にてカスタマイズ可能です(payload の書き方
SlackBotの作成/設定手順
  1. https://api.slack.com/apps?new_app=1 にアクセスし、「Create New App」より配信用のSlack Botを作成する。

  2. 「From Scratch」を選択し、配信用のBot名とインストールするワークスペースを記述する
    image.png

  3. 「OAuth & Permissions」から「Bot Token Scopes」にChat:Writeの権限を追加する

  4. 「Install App」にてインストールしたいワークスペースにインストールする

  5. 「Install App」にxoxb-から始まるトークンが記載されているため、それをシークレットの「SLACK_BOT_TOKEN」に設定する

  6. シークレットの「SLACK_CHANNEL」に通知したいSlackチャンネルのIDを設定する
    チャンネルIDの確認方法

  7. 通知したいSlackチャンネルに作成したBOTを追加するために、設定したいチャンネルで「三点リーダー」>「設定を編集する」>「インテグレーション」>「アプリを追加する」をクリック

image.png
8. 作成したBOTを検索し、追加する
image.png

実際の動作の流れ

1.導入したリポジトリの「Actions」にて①~④を選択し、実行する

FirebaseへのアップロードはAABでも可能ですが、別途Firebase側でGoogle Playとリンクする設定などが必要なためご注意ください

image.png

2.実行結果がSlackに通知される

image.png

注意事項

  • PAT(Personal Access Token)には有効期限があります。期限切れの際は更新が必要です。
  • Firebase App DistributionでAABをアップロードする場合は、別途Firebase側の設定が必要です。
  • Slack Botを使用する場合は、通知先チャンネルにBotを追加する必要があります。
  • プライベートリポジトリの場合、ライブラリ認証のsettings.gradle.ktsの設定が必要な場合があります。
  • リリースノートは直前のコミットメッセージとなります。

おわりに

本記事では、GitHub Actionsを活用してAndroidアプリのビルドからFirebase App Distributionへの配信までを自動化する方法を紹介しました。

導入によるメリット

この仕組みを導入したことで、以下のような効果が得られました。

  • 作業時間の短縮: 手作業で10分以上かかっていた配布作業がワンクリックで完了
  • 属人化の解消: GitHubにアクセスできれば誰でも配布可能に
  • 並行作業が可能: ビルド中もローカルのAndroid Studioで開発を継続できる

発展的な使い方

今回は手動実行(workflow_dispatch)を前提に構築しましたが、以下のようなカスタマイズも可能です。

  • PRマージ時に自動実行: on: pushon: pull_request トリガーを追加
  • リリースノートの自動生成: コミットログやPRタイトルから自動生成
  • 複数環境への同時配信: matrixビルドを活用した並列配信

プロジェクトの運用に合わせて、ぜひカスタマイズしてみてください。


最後までお読みいただきありがとうございました。
質問やご指摘などありましたら、コメントいただけると嬉しいです!

参考リンク

5
0
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
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?