Firebase App Distribution で簡単テストアプリ配布
開発したネイティブアプリをテスト配布したい場合、GooglePlayConsole や AppStoreConnect からテスター設定をしても良いのですが、別の選択肢としてアプリ配布機能を持った SaaS を利用する方法もあります。選択肢の 1 つとして Firebase App Distribution があり、簡単に利用開始することができたので、特徴やセットアップ方法などを紹介します。
特徴
- iOS, Android 双方とも配布可能(iOS は ad-hoc 配布なので、100 人制限がある)
- 配布対象テスターは web コンソール上から簡単に追加や編集が可能
- CI と連携して自動配布が可能(GitHub Actions との連携を紹介します)
前提条件
Firebase App Distribution を利用するためには、Firebase のアカウントが必要です。無償プランから利用可能ですので、まだ Firebase を利用していない方は、アカウント開設をお願いします。
この記事では、React Native でアプリを作成し、GitHub Actions で自動ビルドと配布を行う方法を紹介します。こちらについては、ほかのアプリ開発環境や CI 環境でも利用は可能です。
配布までの流れ
配布可能なビルドを生成
以下に React Native でアプリを作成したリポジトリを公開していますので、適宜ご参照ください。
App Distribution を利用開始する前に、以下の情報が正しく設定されているか、チェックしておきます;
- iOS アプリへ、有効なバンドル ID を設定する
- Android アプリへ、有効なパッケージ名を設定する
-
配布に適したビルド(staging など)を生成できるようにしておく
- iOS アプリの場合、ad-hoc 配布のための証明書を作成する
- Android アプリの場合、署名用のキーストアを作成する
Firebase App Distribution を利用できるようにする
Firebase のコンソールから、App Distribution の設定を行います。
アプリ用のプロジェクトを追加
- 「Firebase プロジェクト」から「プロジェクトを追加」します。
- 任意のプロジェクト名を入力し、「続行」をクリックします。
- Google アナリティクスの設定を行います。いったん無効で大丈夫です。「プロジェクトを作成」をクリックします。
- 少し待つと、プロジェクトが作成されます。作成されたら、「続行」をクリックします。
アプリを追加
- iOS アプリを追加します。iOS+ アイコンをクリックします。
- Apple バンドル ID を入力します。この ID は、Xcode のプロジェクト設定で設定したものと同じものを入力します。入力後「アプリを登録」をクリックします。
- 残りは現時点では不要なので、「続行」をクリックし、ウィザードを完了させます。
- Android アプリも追加します。画面上部の 「+アプリを追加」をクリックし、そこから Android アプリを選択します。
- Android パッケージ名を入力します。この ID は、Android Studio のプロジェクト設定で設定したものと同じものを入力します。入力後「アプリを登録」をクリックします。
- 残りは現時点では不要なので、「続行」をクリックし、ウィザードを完了させます。
App Distribution を利用開始
- 左メニューの「リリースとモニタリング」から「App Distribution」をクリックします。
- 「開始」をクリックします。
- プルダウンメニューから「iOS+ のアプリ」を選択します。
- ふたたび「開始」をクリックします。
これで、App Distribution の利用開始設定は完了です。
テスターの設定
配布対象となるテスターを設定します。テスターグループを設定すると、対象のテスターへ一括配信が可能になりますので、これを利用していきます。
テスターグループの作成と、テスターの登録
- 「テスターとグループ」タブをクリックします。
- テスターグループタブから、「グループを追加」をクリックします。
- グループ名を入力し、「保存」をクリックします。
- 「テスターを追加」をクリックし、テスターのメールアドレスを入力して、テスターを追加します。
配布されたアプリを受け取るための、デバイス側への設定
Android アプリの場合は、「App Tester」アプリをインストールします。App Tester は、App Distribution から配布されたアプリをインストールするためのアプリです。このアプリへ必要な情報を設定することで、App Distribution から配布されたアプリをインストールすることができます。
iOS アプリの場合は、テスターのメールアドレスへ配布されたアプリのリンクをクリックすることで、配布されたアプリをインストールするための手順を開始できます。証明書のダウンロードや、設定の変更などが必要になります。
GitHub Actions の記述と環境構築
GitHub Actions でビルドと配布を自動化します。ここでは Android アプリのビルドと配布を行う方法を紹介します。
必要な情報
- Firebase のアプリ ID
- Firebase のサービスアカウントの JSON ファイル
- Android アプリの署名用のキーストア
- Android アプリの署名用のキーストア情報が記載された signingConfigs
各情報を生成する方法については、以下のアコーディオンにまとめましたので、必要に応じて参照ください。
Firebase のアプリ ID
Firebase のコンソールから確認できます。
「プロジェクトの概要」のギアボタン → プロジェクトの設定 → 全般 → Android アプリ → アプリ ID
Firebase のサービスアカウントの JSON ファイル
以下の手順書をもとに、鍵情報を含む JSON ファイルを作成しておいてください。
Android アプリの署名用のキーストア
リリースビルド用のキーストアを作成しておいてください。以下のコマンドで作成できます。
cd android/app
keytool -J-Dkeystore.pkcs12.legacy -genkey -v -keystore release.keystore -keyalg RSA -storepass {Keystore password} -alias {Alias name} -validity 9125 -dname "CN={CommonName}, O={OrganizationName}"
Android アプリの署名用のキーストア情報が記載された signingConfigs
リリースビルド用のキーストア情報は、git へコミットしないほうが望ましいため、alias や password を外部化することが望ましいです。
そこでまず以下のような記述を持った android/app/signingConfigs/release.gradle
を作成します。
signingConfigs {
release {
keyAlias '{Alias name}'
keyPassword '{Keystore password}'
storeFile file('../release.keystore')
storePassword '{Keystore password}'
}
}
このファイルを .gitignore
へ追加し、git へコミットしないようにします。
次に android/app/build.gradle
に以下のような記述を追加し、外部化した signingConfigs
を読み込めるようにします。
android {
apply from: 'signingConfigs/release.gradle', to: android
signingConfigs {
// ...
}
}
上記のようにしておくことで、git へ release.keystore をコミットすることなくリリースビルドができるようになり、かつ GitHub Actions からは secrets 経由で利用できるようになります。
GitHub の Secrets へ登録
これらの情報を、GitHub の Secrets へ登録します。
- GitHub のリポジトリの Settings から、Secrets へ移動します。
- 「New repository secret」をクリックします。
- Name に
FIREBASE_SERVICE_CREDENTIALS_JSON
と入力し、Value に Firebase サービスアカウントの JSON ファイルの内容を貼り付けます。 - 同様の処理を
FIREBASE_APP_ID_STAGING
、ANDROID_SIGNING_CONFIGS_RELEASE
に対して行います。 -
ANDROID_KEYSTORE_RELEASE
については、base64 エンコードした値を貼り付けますcat android/app/release.keystore| base64
でエンコードできます。
以上で、GitHub Actions を利用する準備が整いました。
GitHub Actions の記述
以下のような記述を ./github/workflows/distribute.yml
として作成しました。
name: Distribute Android Staging App with App Distribution
on:
workflow_dispatch:
push:
branches:
- main
jobs:
distribute:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
distribution: 'zulu'
java-version: '17'
cache: 'gradle'
- name: Install dependencies
run: yarn install --frozen-lockfile --network-timeout 300000
- name: Build packages
run: yarn build
- name: Grant execute permission for gradlew
run: cd android && chmod +x gradlew
- name: Write release.keystore and Signing Config
env:
ANDROID_SIGNING_CONFIGS_RELEASE: ${{ secrets.ANDROID_SIGNING_CONFIGS_RELEASE }}
ANDROID_KEYSTORE_RELEASE: ${{ secrets.ANDROID_KEYSTORE_RELEASE }}
run: |
mkdir -p android/app/signingConfigs
echo "$ANDROID_SIGNING_CONFIGS_RELEASE" > android/app/signingConfigs/release.gradle
echo "$ANDROID_KEYSTORE_RELEASE" | base64 --decode > android/app/release.keystore
- name: Bump gradle version code
uses: chkfung/android-version-actions@v1.2.1
with:
gradlePath: android/app/build.gradle
versionCode: ${{github.run_number}}
- name: Build with Gradle
run: cd android && ./gradlew assembleStagingRelease
- name: Upload a Build Artifact
id: upload_artifact
uses: actions/upload-artifact@v3
with:
name: app-staging-release
path: android/app/build/outputs/apk/staging/release/app-staging-release.apk
- name: Deploy to Firebase App Distribution
uses: wzieba/Firebase-Distribution-Github-Action@v1
with:
appId: ${{ secrets.FIREBASE_APP_ID_STAGING }}
serviceCredentialsFileContent: ${{ secrets.FIREBASE_SERVICE_CREDENTIALS_JSON }}
groups: my-first-testers
file: android/app/build/outputs/apk/staging/release/app-staging-release.apk
一連の流れのうち、特徴的なものは、以下のとおりです。
release.keystore と signingConfigs を作成:
Secrets から keystore と password を生成しています。git へコミットしていない情報を利用するため、このような記述になっています。
gradle のバージョンコードを GitHub Actions の run_number に合わせてインクリメント:
chkfung/android-version-actions
を利用しています。GitHub Actions の run_number は、ワークフローの実行回数を表すものです。この値を gradle のバージョンコードに利用しています。
Firebase App Distribution でアプリを配布:
wzieba/Firebase-Distribution-Github-Action
を利用して、Firebase App Distribution へアプリを配布しています。配布対象のテスターは、groups
で指定しています。
Actions の実行と、アプリの自動配布
GitHub の main ブランチへ push すると、distribute Action が実行されます。実行が完了すると、テスターへメール通知され、App Tester などからアプリをインストールすることができるようになります。
まとめ
Firebase App Distribution を利用することで、簡単にテストアプリの配布ができるようになりました。さらに GitHub Actions と連携することで、自動ビルドと自動配布を行うことができます。ぜひ、利用してみてください。
すべてのデモが含まれたリポジトリはこちらです。
Discussion