Firebase App Distributionの特徴とCLIの使い方

この記事は、[Firebase \#2 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/firebase_2)の3日目の記事です。

今年の9月下旬ごろにリリースされた新機能、App Distributionについて解説します。

## App Distributionとはなにか

Firebaseが提供する、テスター向けのアプリ配信ツールです。同様のツールとして[DeployGate](https://deploygate.com/)やFabric betaが有名です。ちなみにFabricは、Googleが2017年にTwitterから買収しています。

はっきりと明言していませんが、[Fabricは2020年3月末にサービスが終了する](https://get.fabric.io/roadmap)こともあり、App DistributionはFabric betaの代替として用意されたものとして考えればいいと思います。実際に使い方も機能も、ほぼほぼ違いがありません。

なお、この記事を執筆時点ではまだベータ版となっています。

## App Distributionの使い方（配信側）

![ad001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4560/fc7cd1ea-d8b8-01cd-afad-295f0f8527c1.png)

GUIでの操作はFirebaseのコンソールサイト上から行います。配信したいアプリのapkをドラッグし、配信したいユーザーのメールアドレスを設定するだけです。予めテスターのグループを作成することで一括配信もできますし、招待リンクを作成して不特定のユーザーに配信することも可能です。

![ad002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4560/af7e452a-a823-f88f-b8f1-02d511240e2a.png)

招待リンクでは、メールアドレスのドメインに制限をかけることができます。

![ad003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4560/7d98809e-16b5-b5b0-d6a4-af092f21b435.png)

Fabric betaにもあった、ユーザーごとの招待からの進捗も確認可能です。ただし、インストールしたアプリを起動したかどうかのチェックまでは実装されていません。

## App Distributionの使い方（テスター側）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4560/57a6e285-6b9c-abb2-5409-9eff1630ab97.png" width="360">

アプリが配信されると、テスターのメールアドレスに上記のメールが送信されます。「Download the latest build」ボタンをタップすることで、インストールするためのWebサイトへ遷移します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4560/849c0cce-cc97-4ab0-984f-4c82152075eb.png" width="360">

初めてアクセスすると、利用するGoogleアカウントを聞かれるので、メールが届いたアカウントで登録を行ってください。
以降はFabric betaとほぼほぼ同様です。インストールしたいバージョンを選び、Downloadボタンをタップしてダウンロードとインストールを行います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4560/bfaa52c8-8a9a-81a7-a9cf-7cfb0f5fcf0f.png" width="360">

ちなみに遷移直後に「App Tester」というアプリのインストールを進められますが、これをいれなければインストールできないというわけではありません。Fabric betaではアプリが必須であったことと、現在どのアカウントでログイン中か分かりづらいという問題点がありましたが、この辺りはApp Distributionの方が便利だと感じました。

## CLIからApp Distributionにapkをアップロードする

App DistributionではGradleを使ってapkをアップロードすることも可能です。これによって、CLI上から簡単にapkをアップロードできますし、Firebaseプロジェクトのデプロイ周りの設定が整っていれば、CIを使ってアップロードを自動化することも可能です。

### App Distributionのgradle対応を追加する

**（注意）すでにFirebaseプロジェクトが組み込まれていることを前提に記述しています。**

rootプロジェクトのbuild.gradleに必要なライブラリを追加します。

```gradle:build.gradle
buildscript {
    repositories {
        google()
        jcenter()        
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.2'
        classpath 'com.google.gms:google-services:4.3.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

        // これを追加
        classpath 'com.google.firebase:firebase-appdistribution-gradle:1.2.0'
    }
}
```

これだけで対応完了です。`./gradlew appDistributionUpload[BUILD-VARIANT]` で指定したBUILD-VARIANTのapkをビルドしてApp Distributionにアップロードしてくれます。

公式のドキュメントでは`assemble[BUILD-VARIANT]`もセットでやるように書かれていますが、試しに無しでやってみたところ、`appDistributionUpload[BUILD-VARIANT]`でビルドもやってくれたので不要な気がします。
が、よほどビルドに時間のかかるアプリでなければ、ドキュメント通りに両方とも記載するのをおすすめします。


`./gradlew assemble[BUILD-VARIANT] appDistributionUpload[BUILD-VARIANT]`

### アップロード時にテスターやリリースノートを自動で設定する

apkを自動でアップロードしても、テスターを都度コンソールから設定したのではあまり嬉しさがありません。ですので、デフォルトのテスターを設定するようにしてみます。合わせてリリースノートにも必要な情報を予め記述するようにします。

```gradle:app/build.gradle

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

// リリースノートにビルド時のブランチ情報などを記載するために取得
def gitSha = 'git rev-parse --short HEAD'.execute([], project.rootDir).text.trim()
def gitBranch = (System.getenv("CIRCLE_BRANCH") != null) ? System.getenv("CIRCLE_BRANCH") :
        'git rev-parse --abbrev-ref HEAD'.execute([], project.rootDir).text.trim()
def buildTime = new Date().format("yyyy-MM-dd'T'HH:mm'Z'", TimeZone.getTimeZone("JST"))

// ...

android {
    buildTypes {
        release {
            // ...

            firebaseAppDistribution {
                releaseNotes = "${gitBranch}(${gitSha}) - ${buildTime}"
                groups = "group-xxx"
            }
        }
        stage {
            // ...

            firebaseAppDistribution {
                releaseNotes = "stage / ${gitBranch}(${gitSha}) - ${buildTime}"
                groups = "group-xxx"
            }
        }
}
```

これでGradleからアップロードするたびに、ブランチ情報がリリースノートに予め記述された状態で、テスターグループの「group-xxx」に自動的に送信されるようになりました。

## まとめ

最初にも記載しましたが、Fabric betaと大きな違いは少ないため、こちらを利用していた方は比較的簡単に移行できる印象を持ちました。
ただしまだベータ版ではあるため、正式版の時点で機能がいくつか変わる可能性もります。十分留意するようにしてください。

## ありがちな疑問など

### サイトやApp Testerは日本語化されてるの？

されていません。ですがUI自体はとても単純なので、ある程度フォローすれば問題はなさそうな気がします。
よほど英語にアレルギーがある相手がテスターである場合はDeploygateを採用するのも有りだと思います。

### .aabではアップロードできないの？

できません。apkとaabによる挙動の違いが心配だというのであれば、Google Playのテスター機能を使うべきだと思います。

### アップロードしてもApp TesterがPush通知してくれない？

現時点ではApp TesterはPush通知をサポートしていないようです。ユーザーへの配信通知は、Fabric beta同様にメールによって伝えられます。

### ひとつのFirebaseプロジェクトで複数のアプリをApp Distributionに登録できるの？

そのFirebaseプロジェクトに登録しているアプリであれば可能です。プラットフォームやapplicationIdごとに分けられていて、App Distribution横のコンボボックスから切り替えることになります。

![ad004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4560/497ef0ed-a5b3-057a-7f72-cb4d8a89335a.png)

## 参考

- [Firebase App Distribution  \|  Firebase](https://firebase.google.com/docs/app-distribution/)
- [Distribute Android apps to testers using Gradle  \|  Firebase](https://firebase.google.com/docs/app-distribution/android/distribute-gradle)