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

## 背景

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

[Android での設定はこちら](https://qiita.com/xxminamixx/items/b569311050fb42859e56)

## 前提

* iOS プロジェクトにFatlaneを導入していること
* Bitriseを利用していること
  * Distribution証明書の用意などができていて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の設定

Fastlaneを採用しているプロジェクトディレクトリで以下を実行します。
App Distributionのプラグインを導入できるようです。

```shell

fastlane add_plugin firebase_app_distribution
```

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

```
firebase login:ci
```

Fastfileに配布用のlaneを追加します。

```rb

  platform :ios do
      desc "StagingアプリをFirebase経由で配布"
      lane :distribute do
        build_ios_app(...) # gymなどでipaを作る処理をしてください
        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-01 11.02.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127713/d9834ebf-d04d-8fdc-3267-0c79d1d20ef0.png)

### Script step に書くこと

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

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

### fastlane に書くこと

`fastlane lane`に実行したいlaneを記述します。今回はFastfileの方に`distribute`というlaneを作成したので、
`ios distribute`と記述します。
ローカルでlaneを叩くときは`fastlane distribute`と叩いて動いていたのですが、iosをつけないと動作しないみたいでした。

![スクリーンショット 2019-10-01 11.11.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127713/fe0dcfbf-0d54-e97d-0346-295ca57e6e41.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)`に設定します。

fastfileを設定したブランチをpushしてbitriseでビルドすれば配布ができると思います。

## 参考

[Firebase App Distribution](https://firebase.google.com/docs/app-distribution/?hl=ja)
[[iOS] Firebase App Distributionを使用してiOSアプリを配布する](https://dev.classmethod.jp/smartphone/ios-firebase-distribution/)
[CircleCI + fastlane で Firebase App Distribution に ipa をアップロードする](https://qiita.com/koogawa/items/fb89c1ae8ff6913a184d)