📦

Firebase App Distribution で簡単テストアプリ配布

2023/12/19に公開

開発したネイティブアプリをテスト配布したい場合、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 でアプリを作成したリポジトリを公開していますので、適宜ご参照ください。

https://github.com/suzukalight/study-firebase-app-distribution

App Distribution を利用開始する前に、以下の情報が正しく設定されているか、チェックしておきます;

  • iOS アプリへ、有効なバンドル ID を設定する
  • Android アプリへ、有効なパッケージ名を設定する
  • 配布に適したビルド(staging など)を生成できるようにしておく
    • iOS アプリの場合、ad-hoc 配布のための証明書を作成する
    • Android アプリの場合、署名用のキーストアを作成する

Firebase App Distribution を利用できるようにする

Firebase のコンソールから、App Distribution の設定を行います。

アプリ用のプロジェクトを追加

  1. 「Firebase プロジェクト」から「プロジェクトを追加」します。
  2. 任意のプロジェクト名を入力し、「続行」をクリックします。
  3. Google アナリティクスの設定を行います。いったん無効で大丈夫です。「プロジェクトを作成」をクリックします。
  4. 少し待つと、プロジェクトが作成されます。作成されたら、「続行」をクリックします。

アプリを追加

  1. iOS アプリを追加します。iOS+ アイコンをクリックします。
  2. Apple バンドル ID を入力します。この ID は、Xcode のプロジェクト設定で設定したものと同じものを入力します。入力後「アプリを登録」をクリックします。
  3. 残りは現時点では不要なので、「続行」をクリックし、ウィザードを完了させます。
  4. Android アプリも追加します。画面上部の 「+アプリを追加」をクリックし、そこから Android アプリを選択します
  5. Android パッケージ名を入力します。この ID は、Android Studio のプロジェクト設定で設定したものと同じものを入力します。入力後「アプリを登録」をクリックします。
  6. 残りは現時点では不要なので、「続行」をクリックし、ウィザードを完了させます。

App Distribution を利用開始

  1. 左メニューの「リリースとモニタリング」から「App Distribution」をクリックします。
  2. 開始」をクリックします。
  3. プルダウンメニューから「iOS+ のアプリ」を選択します
  4. ふたたび「開始」をクリックします。

これで、App Distribution の利用開始設定は完了です。

テスターの設定

配布対象となるテスターを設定します。テスターグループを設定すると、対象のテスターへ一括配信が可能になりますので、これを利用していきます。

テスターグループの作成と、テスターの登録

  1. 「テスターとグループ」タブをクリックします。
  2. テスターグループタブから、「グループを追加」をクリックします。
  3. グループ名を入力し、「保存」をクリックします。
  4. テスターを追加」をクリックし、テスターのメールアドレスを入力して、テスターを追加します。

配布されたアプリを受け取るための、デバイス側への設定

Android アプリの場合は、「App Tester」アプリをインストールします。App Tester は、App Distribution から配布されたアプリをインストールするためのアプリです。このアプリへ必要な情報を設定することで、App Distribution から配布されたアプリをインストールすることができます。

iOS アプリの場合は、テスターのメールアドレスへ配布されたアプリのリンクをクリックすることで、配布されたアプリをインストールするための手順を開始できます。証明書のダウンロードや、設定の変更などが必要になります。

GitHub Actions の記述と環境構築

GitHub Actions でビルドと配布を自動化します。ここでは Android アプリのビルドと配布を行う方法を紹介します。

必要な情報

  1. Firebase のアプリ ID
  2. Firebase のサービスアカウントの JSON ファイル
  3. Android アプリの署名用のキーストア
  4. Android アプリの署名用のキーストア情報が記載された signingConfigs

各情報を生成する方法については、以下のアコーディオンにまとめましたので、必要に応じて参照ください。

Firebase のアプリ ID

Firebase のコンソールから確認できます。
「プロジェクトの概要」のギアボタン → プロジェクトの設定 → 全般 → Android アプリ → アプリ ID

Firebase のサービスアカウントの JSON ファイル

以下の手順書をもとに、鍵情報を含む JSON ファイルを作成しておいてください。
https://github.com/wzieba/Firebase-Distribution-Github-Action/wiki/FIREBASE_TOKEN-migration

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 へ登録します。

  1. GitHub のリポジトリの Settings から、Secrets へ移動します。
  2. New repository secret」をクリックします。
  3. Name に FIREBASE_SERVICE_CREDENTIALS_JSON と入力し、Value に Firebase サービスアカウントの JSON ファイルの内容を貼り付けます。
  4. 同様の処理を FIREBASE_APP_ID_STAGINGANDROID_SIGNING_CONFIGS_RELEASE に対して行います。
  5. 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 と連携することで、自動ビルドと自動配布を行うことができます。ぜひ、利用してみてください。

すべてのデモが含まれたリポジトリはこちらです。
https://github.com/suzukalight/study-firebase-app-distribution

CureApp テックブログ

Discussion