Firebase App Distribution を使ってみた

## Firebase App Distributionとは
Firebase App Distributionは開発途中のアプリケーションをテスターに配布するプラットフォームで、AndroidとiOSに対応しています。

今回はFirebaseコンソールとGradleを使用したapkファイルの配信方法を紹介します。

## 特徴
- クロスプラットフォーム
    - AndroidとiOSに対応しています
- テスターの管理
    - テストチームをグループにまとめて管理できます
    - 招待メールを作成したり招待リンクを作成できます
    - 招待した人数、招待を承認した人数、インストール数など把握できます
- テストアプリの配信方法が豊富なのでお使いのCI環境に合わせてすぐ導入できます
    - Firebaseコンソールから配布
    - firebaseコマンドから配布
    - gradleから配布(Android)
    - fastlaneから配布
- Crashlyticsを組み合わせるとビルドで安定性の指標を自動的に取得できます
- 新しいアプリを配信すると準備ができたことがテスターに通知されます

## Firebase コンソールを使用して配信
Firebaseコンソールを使用すると気軽にアプリを配信できます。

### 下準備
- apkファイルを作成します
- FirebaseコンソールにAndroidのプロジェクトを追加します
    -  https://firebase.google.com/docs/android/setup#console

### 配信

App Distributionのページを開き利用契約を確認&チェックし開始を押します

<img width="500" alt="Screen Shot 0031-12-03 at 20.45.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114922/54d06d52-e28d-b970-da7f-3f7fc23b13ae.png">

予め用意したapkファイルをアップロードします

<img width="500" alt="Screen Shot 0031-12-03 at 21.02.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114922/80fabb42-d136-ea1d-d860-548458d6ab31.png">

アップロード完了後、リリースノートを書きテスターを追加します

<img width="500" alt="Screen Shot 0031-12-03 at 21.02.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114922/d4ef573a-6e32-4fae-99a0-4a7b8d35608d.png">

テスターに追加すると、招待メールがテスターに届きメールにあるリンクにアクセスするとアプリをダウンロードできます。なおFirebase App Distributionコンソール上では、招待済、承認済、ダウンロード済の数字が状況に合わせて変化するのでテスターの動向を確認できます。

<img width="500" alt="Screen Shot 0031-12-03 at 21.03.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114922/283f75c9-bb45-044d-1de3-cb2ef2a83e35.png">

以上でアプリを配信できました。しかしこれだと毎回手動でアップロードすることになるので、CI等に組み込み自動化したいところです。次にGradleを使用した配信方法を紹介します。今回はGradleを使用しましたが、Firebase CLIやfastlaneにも対応しており、使い方も大きく変わらないので、ご自身の環境に合わせ使い分けていただければと思います。

## Gradle を使用して Android アプリをテスターに配布する

### app/build.gradleを編集
app/build.gradleにFirebase App Distributionのスクリプトを追加します。

```
apply plugin: 'com.android.application'

apply plugin: 'com.google.firebase.appdistribution'

buildscript {
    repositories {
        google()
    }
    dependencies {
        classpath 'com.google.firebase:firebase-appdistribution-gradle:1.2.0'
    }
}
```

### 認証
appDistributionLoginコマンドまたはサービスアカウントを使用し認証します。

#### appDistributionLoginでOAuth認証

```
$ ./gradlew appDistributionLogin
```

実行すると認証用ページのURLが表示されるのでアクセスし認証します。

```
Please open the following address in your browser:
  https://accounts.google.com/o/oauth2/......
```

下記のメッセージがでれば認証完了です。

```
BUILD SUCCESSFUL in 49s
1 actionable task: 1 executed
```

Refresh tokenがでるので `FIREBASE_TOKEN` 環境変数にtokenをセットします。

```
Refresh token: hogehogehoge

export FIREBASE_TOKEN=hogehogehoge
```

#### サービスアカウントで認証したいひとへ
サービスアカウントで認証する場合はこちらをご参考ください。

https://firebase.google.com/docs/app-distribution/android/distribute-gradle#authenticate_using_a_service_account

### 配布プロパティを構成する
次にリリースノートとテスターを指定します。今回はシンプルに下記のような構成にしました。

```
 buildTypes {
        release {
            firebaseAppDistribution {
                releaseNotes="テスト配信" // リリースノート
                testers="ali@example.com, bri@example.com, cal@example.com" //テスター
            }
        }
        debug {
            firebaseAppDistribution {
                ...
            }
            testCoverageEnabled true
        }
    }
```

プロパティのパラメータは releaseNotesやtesters以外にも下記のようなパラメータや「デモ版」と「完全版」のプロダクトフレーバーを設定できます。詳しくは[公式ドキュメント](https://firebase.google.com/docs/app-distribution/android/distribute-gradle#3_configure_your_distribution_properties
)をご参考ください。

- appId
    - FirebaseのアプリID
- serviceCredentialsFile
    - サービスアカウントのパス
- releaseNotes
    - リリースノートを文字で指定できます
- releaseNotesFile
    - リリースノートが書かれたテキストファイルをパスで指定できます
- testers
    - テスターのメールアドレスを文字で指定できます
- testersFile
    - テスター情報が書かれたテキストファイルを指定できます

### アプリを配信
app/build.gradleに追加したので app/ 配下でコマンドを実行します。
アップロードコマンドは名はパラメータやプロダクトフレーバーの設定で名称が変わるので下記で名前を確認します。

```
コマンドを確認
./gradlew tasks --all

Other tasks
-----------
appDistributionLogin
appDistributionUploadDebug
appDistributionUploadRelease
```

下記コマンドでapp-debug.apk を作成しFirebaseコンソールにアップロードします

```
$ ./gradlew assembleDebug appDistributionUploadDemoDebug
```

アップロードが成功するとテスターにアプリが配信されます

<img width="500" alt="Screen Shot 0031-12-04 at 8.34.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114922/c6912ef4-5116-c63c-c29b-1edb215b94d4.png">


## 招待リンクの作成
招待リンクを作成するとテストアプリを広く通知できます

新しい招待リンクをクリック（グループやドメイン制限は特にかけることもできる）

<img width="500" alt="Screen Shot 0031-12-04 at 8.35.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114922/fc01160f-a4d5-c59d-6fd8-738619fcff1e.png">

copy linkからURLを取得し招待リンクにアクセスします

<img width="500" alt="Screen Shot 0031-12-04 at 8.36.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114922/5430962d-86cc-48ed-9f5b-fa6ee071047d.png">

メールアドレスを入力しサインアップするとテスターに招待されます

## GitHub Actionsと連携
こちらを使用すればGitHub ActionsにFirebase App Distributionを組み込みできます。

https://github.com/marketplace/actions/firebase-app-distribution