Bitrise + Firebaes App Distribution で Android アプリを配布して Slack で通知する

## 背景

Bitrise + Deploygate でいままではAndroidの開発環境アプリの配布をしていたのですが、Deploygateはそこそこコストが掛かるので移行することにしました。
iOSでDeploygate から App Distributionに移行することができたので Android 版の知見も残します。

[iOSでの設定方法はこちら](https://qiita.com/xxminamixx/items/2d21bdb729d5c5d6717c)

## 前提

* Bitriseを利用していること
  * KeyStoreの用意などができていてBitriseに設定できていること
* Firebaseを利用していること
* Slackを利用している(配布通知が必要なければいらない)

## Firebase 側でアプリ配布用のグループを作成する

Firebase Console から `App Distribution`を選択します。
初めて開くと`開始`ボタンがあるとおもいますのでそちらを押下して次に進みます。

`テスターとグループ`タブを開いて`グループを追加`を押下します。
任意の名前でiOSアプリを配布するグループを作成してください。
![スクリーンショット 2019-10-01 10.53.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127713/cea90595-e7b1-3a10-cff1-dc72035340c9.png)

あとは、グループに招待したい人のメールアドレスを追加するだけです。

## Fastlaneの導入

Androidでの開発ではFastlaneを採用していることは少ないかと思いますので[Fastlaneの導入](https://docs.fastlane.tools/getting-started/android/setup/)からやります。

Bundlerを利用した方が各プロジェクトでgemの管理がしやすいのでBundler経由でFastlaneも導入します。

```shell

$ gem install bundler
$ bundler init
```

ここまででBundlerの導入はできました。
生成された`Gemfile`を編集していきます。

```ruby

source "https://rubygems.org"

gem 'fastlane'
```
上記を記述して保存したら、以下でgemのinstallをします。

```shell

$ bundle install --path vendor/bundle
```
これでFastlaneは導入できました。


プロジェクト直下にfastlaneファイルが生成されていると思いますので、`Fastfile`を編集します。


## Fastlaneの導入

今回はBundler配下なので`bundler exec`でfastlaneを使います。
以下でFastlaneの初期化を行います。いくつか`y/n`で質問がありますが、各自プロジェクトに見合った設定を行なってください。(Google Playでのメタデータ扱うのかとかそういうやつ)

```shell

$ bundle exec fastlane init
```


以下で App Distributionのプラグインを導入します。

```shell

$ bundle exec fastlane add_plugin firebase_app_distribution
```

Bitriseでfirebaseを利用できるようにするためにtokenを取得します。
ここで取得したtokenはのちにBitriseで設定するのでメモしておいてください。

```
$ firebase login:ci
```

Fastfileに配布用のlaneを追加します。
gradleを使ってapkに固めてからApp Distributionで配布するlaneを今回は`distribute`とします。

```ruby

platform :android do
    desc "Stagingアプリを配布"
    lane :distribute do
      gradle(
        task: "assemble",
        flavor: "staging",
        build_type: "debug"
      )
      firebase_app_distribution(
        app: "Firebase App ID をここにペースト",
        groups: "Firebaseで作成したグループ名をここにペースト",
        release_notes: last_git_commit[:message],
        firebase_cli_path: "./node_modules/.bin/firebase"
      )
    end
  end
```

Firese App IDはFirebase Consoleの `Settings > 全般 > マイアプリ > アプリ ID` で確認することができます。
groupsには作成したグループ名を指定します。

## Bitriseで設定

以下のようなワークフローを作成しました。
今回主要な部分としては赤線を引いた部分になります。

![スクリーンショット 2019-10-18 10.47.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127713/bc60ea14-a52f-f834-da9e-25cc3a618c85.png)

### Script step に書くこと

以下を記述して`Firebase CLI`を利用できるようにします。
Bitriseは元からnpm使えるみたいでしたので別途Node.jsのインストールは不要です。

```shell
## firebase tools DL
npm install firebase-tools
```

### fastlane に書くこと

`fastlane lane`に実行したいlaneを記述します。今回はFastfileの方に`distribute`というlaneを作成したので、
`android distribute`と記述します。

![スクリーンショット 2019-10-18 10.50.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127713/4c1cecc3-8cc9-a478-9580-f2a2a481faf4.png)



### Send a Slack message に書くこと

`Slack Webhook URL (Webhook or API token is required)`に Slackで生成したWebhook URLを設定します。(次のセクションで詳細書きます)

`Target Slack channel, group or username`で投稿したいチャンネルを指定します。形式は`#general`のような形で通知できました。
Slackへの通知メッセージを`Text of the message to send.`で設定しても良いかもしれません。

### Firebase token を設定する

Bitriseのアプリページから`Workflow > Env vars`タブを開いて対象のworkflowの環境変数にFirebase tokenを設定します

![スクリーンショット 2019-10-01 12.38.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127713/efbc916f-0d73-eab3-236b-2aa9d2526329.png)


## Slack側でWebhook URLを生成する

[Slackアプリを作成します](https://api.slack.com/apps?new_app=1)
任意のアプリ名と追加したいワークスペースと指定すると作成完了です。

![スクリーンショット 2019-10-01 11.19.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127713/87f77513-9ed6-d099-3e69-b673d04924fd.png)

作成できたら`Incoming Webhooks`という項目があるのでそちらに遷移します。
`Webhook URL`が生成されているのでコピーしてBitriseの`Slack Webhook URL (Webhook or API token is required)`に設定します。

以上で設定は終わりです！
このワークフローを使ってビルドすればApp Distributionで配布できると思います。
GithubのWebhoocをして自動Deployもできるので是非利用してください。