Github Actionsで自動的にAndroidアプリをビルドした後にFirebase App Distributionに配布する

Androidアプリの開発において [Github Actionsにて自動的にビルドする環境作成](https://qiita.com/taptappun/items/92ec63b7e89e53b68efa) について紹介しました。
今回ビルドが完了した後、[Firebase App Distribution](https://firebase.google.com/docs/app-distribution)にアプリを配布する方法(CD環境の構築)について紹介していきます。
具体的に実際にアプリを自動的に配布している様子は以下のプロジェクトで公開しています。
[github-actions-examples](https://github.com/TakuKobayashi/github-actions-examples)
実際にGithub Actionsで自動的に配布を行なっている実行フローについてはこちらに記述しています。

* [android-release-build.yml](https://github.com/TakuKobayashi/github-actions-examples/blob/master/.github/workflows/android-release-build.yml)

# モチベーション

Github Actionsのみで運用していく場合、以下のような課題があります

* Github Actionsにてビルドした成果物をアップロードする場合、無料プランでは500MB/月までしかアップロードすることができない
* 非開発者にとってGithub Actionsの成果物を端末にダウンロードしてアプリをインストールするフローは使いづらく、運用するハードルが高い

このような課題を解決する方法として、[Firebase App Distribution](https://firebase.google.com/docs/app-distribution) などのSaaSを使用し、組み合わせることで課題を解決することができる。

# 実行フロー

Github Actionsで実際に実行されるフローの様子について以下に図示します

```plantuml
@startuml
actor 開発者
database Github
database Firebase

== アプリを配布するまでのフロー ==
開発者 -> Github: git push
Github -> Github: Github Actions起動、Androidビルド開始
Github -> Firebase: ビルド済みapkアップロード
Firebase -> 開発者: apkアップロード完了通知

== アプリ配布後 ==
開発者 -> Firebase: アクセス
Firebase -> 開発者: アプリダウンロード

@enduml
```

今回、紹介するフローは上記の「アプリを配布するまでのフロー」について紹介していきます

# [Firebase App Distribution](https://firebase.google.com/docs/app-distribution)

## [Firebase App Distribution](https://firebase.google.com/docs/app-distribution) とは?

手順の紹介の前に [Firebase App Distribution](https://firebase.google.com/docs/app-distribution) について紹介します。
[Firebase App Distribution](https://firebase.google.com/docs/app-distribution) はFirebaseの中の機能の一つです。
[Firebase App Distribution](https://firebase.google.com/docs/app-distribution) を使用することで、アプリをストアに公開前のクローズドな環境下でテストを行うことができます。
また、いくらアプリを配布しても全て無料で利用することができます。詳しくは [こちら](https://firebase.google.com/pricing) を参照してください。

## Firebaseプロジェクトにアプリを登録する

Firebaseにて[Firebase App Distribution](https://firebase.google.com/docs/app-distribution) などの各種ネイティブアプリの機能を使う場合、Firebaseにアプリを登録することでそれぞれの機能を使用することができるようになる。

1.1 初回利用開始画面からアプリの登録を行う

![firebase-register-app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72596/c57f77db-9384-22c2-bb0f-350e25fc2f18.png)

1.2 またはプロジェクト設定からアプリを追加する(すでにアプリが登録されている場合もこちらより)

![firebase-project-settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72596/7374a9f5-7795-2441-3285-502c27644f29.png)

![firebase-add-app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72596/54e7f12f-8f17-9ed4-1848-b1c4dbfe4e0d.png)

今回はAndroidアプリなのでAndroidを選択する

![firebase-add-app-popup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72596/94c82003-326f-4519-56ef-bbc7e9b99c51.png)

2. パッケージ名などの必要な情報を入力する

![new-android-app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72596/73b2ee4c-20c4-20fa-ecb9-b45305ef1f2a.png)

※パッケージ名とはAndroidプロジェクトにおける `app/build.gradle` 内に記載されている `applicationId` に記載されている値を使用します。(こちらの [build.gradle](https://github.com/TakuKobayashi/github-actions-examples/blob/master/Android/app/build.gradle) に記載されている部分)

```app/build.gradle
...
android {
  ...
  defaultConfig {
    applicationId "net.taptappun.taku.kobayashi.githubactionsexamples" // パッケージ名
    ...
  }
}
```

または `app/src/main/AndroidManifest.xml` 内に記載されている `<manifest package` に記載されている値を使用します。(こちらの [AndroidManifest.xml](https://github.com/TakuKobayashi/github-actions-examples/blob/master/Android/app/src/main/AndroidManifest.xml) に記載されている部分)


```app/src/main/AndroidManifest.xml
...
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.taptappun.taku.kobayashi.githubactionsexamples">
  ...
</manifest>
```

3. アプリの登録完了すると「マイアプリ」よりアプリIDなどの確認ができるようになります

![check-app-id.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72596/8f7e88ed-f957-f711-92e8-43538fff0aef.png)

※ 今回は [Firebase App Distribution](https://firebase.google.com/docs/app-distribution) の使用なので「構成ファイルの追加」や「Firebase SDKの追加」などは不要

## [Firebase App Distribution](https://firebase.google.com/docs/app-distribution) アプリを配信する

Firebaseプロジェクトにアプリを登録することができたら [Firebase App Distribution](https://firebase.google.com/docs/app-distribution) アプリを配信することができます。
以下の手順でアプリを配信していきます。

1. firebase-toolsというCLIツールをインストールする

```
npm install -g firebase-tools
```

2. 以下のコマンドを実行して、Github Actionsで使用するFirebase Tokenを取得する

```
firebase login:ci
```

3. Firebase AppId を確認する

![check-app-id.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72596/8f7e88ed-f957-f711-92e8-43538fff0aef.png)

4. コマンドを実行して、[Firebase App Distribution](https://firebase.google.com/docs/app-distribution) にアプリを配信する

```
firebase appdistribution:distribute [APKファイルが置いてある場所のファイルパス] --app [FirebaseAppId] --token [取得したFirebaseToken]
```

## [Firebase App Distribution](https://firebase.google.com/docs/app-distribution) からアプリをダウンロードする

アプリが配信されるとリリースのリストに新しいリリースが追加されます

![distribution-list.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72596/af13f07c-bb78-a215-c734-71ca0ebbcdcb.png)

リリースの詳細を開くことでapkのダウンロードすることができます。

![distribution-detail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72596/dd07c2b8-2cbe-c71e-75b7-956e19732337.png)

またプロジェクトオーナー以外の人からもアプリのダウンロードを行いたい場合は以下の方法にて招待することで利用することができるようになります。

1. プロジェクトに招待する
1.1 「プロジェクト設定」を開き「ユーザーと権限」を選択し、「メンバーの追加」をおこなう。(付与する権限に注意)

![invite-project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72596/835c211b-763d-f9cb-fbc6-ed094e255bb4.png)

2. テスターとして招待リンクを共有する
2.1 「招待リンク」から「招待リンクを作成」を選択

![tester-links.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72596/3132219f-1612-e0ba-1931-1485ed6de20b.png)

2.2 「リンクを作成」を選択

![generate-distribution-link.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72596/bfb1d430-d8ad-1eb1-99ec-30995e72bda0.png)

2.3 作成された「リンクをコピー」してURLを共有する

![firebase-generate-link.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72596/72ad2ce1-832f-ed37-4c5e-b665c1f7e346.png)

2.4 リンクが作成されると一覧からも確認することができます。

![tester-link.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72596/f54bf34d-f425-1bac-2cfe-60241069beb9.png)

2.5 作成されたリンクより登録した人たちは「テスターとグループ」より確認することができます。

![firebase-distribution-tester.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72596/04ba0395-9dc9-9c3d-19c3-9a4c5b24ea86.png)

## Github Actionsの中に組み込む

Github Actions上でAndroidアプリをビルドするまでの流れについては [Github Actionsにて自動的にビルドする環境作成](https://qiita.com/taptappun/items/92ec63b7e89e53b68efa) にて紹介していますので、そちらを参照してください。
ビルドが完了した後、上記の[Firebase App Distribution](https://firebase.google.com/docs/app-distribution)に配布するコマンドをレシピに追加することで自動的に配信が可能です。
この時、Firebase TokenとFirebase AppIdの情報は公開したくない情報なのでGithub Secretsに登録して、登録した値を参照するようにします。

![github-actions-secrets.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72596/49aea814-bcbc-ea48-0d44-f7d8e16567fe.png)

![github-actions-add-secrets.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72596/50ab2431-a4ce-8a25-6973-6abf916701da.png)

# 最後に

Github Actionsで自動的にAndroidアプリをビルドした後にFirebase App Distributionに配布する環境を構築する方法について紹介しました。この環境を構築することで便利になり、開発〜テストの速度の向上につながります。
ぜひこのようなCD環境の導入に役立ててください。