はじめに
弊社では、開発中のアプリをテスターへ簡単に配布できる「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への実行結果通知
導入方法
1. ワークフローファイルの配置
以下のYAMLファイルを [プロジェクト名]/.github/workflows/ に配置します。
ワークフローファイル全体を表示
# 出力した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. ビルドバリアントを設定する
プロジェクトで利用したいビルドバリアントに合わせて、以下の箇所を適宜変更してください。
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の署名設定を環境変数にも対応させます。以下のように設定してください。
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」のシークレットに設定します。
Google Cloud Platformのサービスアカウントキー取得
こちらを参考に取得したキーを「CREDENTIAL_FILE_CONTENT」のシークレットに設定します。
簡易手順
- 設定したいFirebaseプロジェクトのGoogleCloudにログイン
- 「Firebase App Distribution Admin」の権限を持ったサービスアカウントを作成(既にあればそちらを使用)
- キーを作成し、作成したキーの内容をコピーして設定する(作成したキーは再発行できないため、安全な場所に保管してください)
テスターグループを設定する
Firebase Consoleの「App Distribution」>「テスターとグループ」でテスターグループ名を確認し、YAMLファイル内の該当箇所に設定します。
使用箇所
groups: <YOUR_TESTER_GROUP> # 例: qa-testers
6. 認証が必要なライブラリに環境変数を設定する
※社内ライブラリなど認証が必要なライブラリを使用している場合のみこの手順が必要です。
settings.gradle.ktsでGitHub Packagesなどから社内ライブラリを取得している場合、GitHub Actionsで設定した環境変数をビルド時に参照できるよう、以下のようにSystem.getenvを追加します。
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")
}
}
使用箇所
- 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の作成/設定手順
-
https://api.slack.com/apps?new_app=1 にアクセスし、「Create New App」より配信用のSlack Botを作成する。
-
「OAuth & Permissions」から「Bot Token Scopes」に
Chat:Writeの権限を追加する -
「Install App」にてインストールしたいワークスペースにインストールする
-
「Install App」に
xoxb-から始まるトークンが記載されているため、それをシークレットの「SLACK_BOT_TOKEN」に設定する -
シークレットの「SLACK_CHANNEL」に通知したいSlackチャンネルのIDを設定する
チャンネルIDの確認方法 -
通知したいSlackチャンネルに作成したBOTを追加するために、設定したいチャンネルで「三点リーダー」>「設定を編集する」>「インテグレーション」>「アプリを追加する」をクリック
実際の動作の流れ
1.導入したリポジトリの「Actions」にて①~④を選択し、実行する
FirebaseへのアップロードはAABでも可能ですが、別途Firebase側でGoogle Playとリンクする設定などが必要なためご注意ください
2.実行結果がSlackに通知される
注意事項
- 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: pushやon: pull_requestトリガーを追加 - リリースノートの自動生成: コミットログやPRタイトルから自動生成
- 複数環境への同時配信: matrixビルドを活用した並列配信
プロジェクトの運用に合わせて、ぜひカスタマイズしてみてください。
最後までお読みいただきありがとうございました。
質問やご指摘などありましたら、コメントいただけると嬉しいです!
参考リンク







