DeployGateに配布したFlutterアプリのバージョンをSlackに通知する

# 概要
現在Flutterを用いたモバイルアプリの開発をしており、内部でのテスト時はDeployGateでアプリの配布を行っています。
特定のブランチにマージされた場合にビルド・DeployGateにアップロードするようにCIが設定されているのですが、マージされたプルリクエストとDeployGateにアップロードされたアプリのリビジョン番号がわからなくなる時があります。
CIのログを見ればわかるのですが、プルリクエストの内容とDeployGateのリビジョン番号を紐付けしてSlackに通知できるように設定してみたのでまとめたいと思います。

# 前準備(Slack)
Slackに通知するためにWebhook URLを取得します。
今回はカスタムインテグレーション(旧方式)の「Incoming Webhook」を利用しました。
はじめてSlackにインテグレーションを追加する場合はこちらを参考にした方が良いと思います。
[SlackのWebhook URL取得手順](https://qiita.com/vmmhypervisor/items/18c99624a84df8b31008)

以下は既にSlackのカスタムインテグレーションに「Incoming Webhook」が追加されている場合の手順となります。

## 1. 設定の追加
Slackを起動後ワークスペースをクリックして「以下をカスタマイズ: `ワークスペース名`」をクリック
開いたページの左側にある「App管理」をクリック
「カスタムインテグレーション」をクリックして「Incoming Webhook」をクリック
![Incoming Webhook_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340824/7f4ae2c5-233a-888e-e41e-666685ccaa3a.png)
Incoming Webhookアイコン下の「設定をリクエストする」(権限によっては設定を追加する)をクリック
![Incoming Webhook_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340824/f685abdd-2ed9-0cfa-ec65-105c074990e8.png)

## 2. 設定の編集

設定を追加するをクリック後、個別の設定画面に遷移するので以下を入力・編集する
変更した名前・アイコンはプレビューに反映される
- 投稿するチャンネル
- 説明ラベル(任意)
- 名前をカスタマイズ(任意)
- アイコンをカスタマイズする(任意)
![Incoming Webhook_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340824/26ca4a0d-3d21-1029-340d-bdea74774369.png)

## 3. 設定の保存
編集が完了したら「設定を保存する」をクリック
設定画面に表示されているWebhook URLは後で使用するので何処かにメモしておくこと

# CIの設定
自分が関わっているアプリではiOSのビルドはBitrise、AndroidのビルドはCircle CIを利用しています。
両方通知が必要なのでBitrise・Circle CIどちらも手順も記載します。

## 1. Bitrise
BitriseからDeployGateにアップロードが完了した場合は`$DEPLOYGATE_UPLOAD_APP_STEP_RESULT_JSON`内の`results`変数内、`revision`にリビジョン番号が保存されます。
この値を参照してSlackに通知するように設定します。

## 1.1 リビジョン番号保存用の環境変数を作成
Bitriseにログイン後設定したいリポジトリをクリックして「Workflow」をクリック
上側のタブの「Env Vars」をクリック
Slack通知を行いたいWorkflowのところの「Add New」をクリックして変数名と値を入力
※今回は`IOS_DEPLOY_GATE_REVISION`と設定した
![bitrise_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340824/549dc388-5afa-b31e-bfed-ca75f973a386.png)

## 1.2 Workhflowの追加(script)
上タブの「Workflows」をクリック
Slack通知を行いたいWorkflowを選択後、「DeployGate Upload」をクリック
output variablesの値を確認しておく
![bitrise_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340824/9b128df9-399d-4172-8df0-6725c99f7cff.png)
「DeployGate Upload」下の「+」ボタンをクリックして「Script」を選択
以下のコマンドを「Script content」に設定

```sh:script
#!/usr/bin/env bash
# fail if any commands fails
set -e
# debug log
set -x

IOS_DEV=`echo $DEPLOYGATE_UPLOAD_APP_STEP_RESULT_JSON | ruby -rjson -e "puts JSON.parse(STDIN.read)['results']['revision']"`
envman add --key IOS_DEPLOY_GATE_REVISION --value $IOS_DEV
```

## 1.3 Workhflowの追加(Slack message)
先程追加したscript下の「+」ボタンをクリックして「Send a Slack message」を選択
以下の値を設定する(他は任意)
設定が完了したら「Saved」をクリックして保存する

- `Slack Webhook URL`：先程メモしたWebhook URLを入力  
  ※URLを直接入力しても良いが、Webhook URLを環境変数に追加して$`環境変数名`とした方が良い
- `Text of the message to send.`：先程設定した環境変数を含むようにSlack通知したいメッセージを入力  
　例：`リビジョン番号#${IOS_DEPLOY_GATE_REVISION}`
- `If Build Failed`：横の「+」ボタンをクリックするとビルド失敗時のメッセージを編集可(任意)

## 1.4 設定の確認
設定が完了したらCIをビルドしてSlack通知が送られてくるかを確認する
![bitrise_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340824/3cb78940-3dc7-81ba-6efc-751a882aa9e0.png)

# 2. Circle CI(fastlane)
AndroidでDeployGateにアップロードするときはfastlaneから呼び出しています。
アップロード完了時は`SharedValues::DEPLOYGATE_REVISION`にリビジョン番号が挿入されますのでこちらを参照します。
本来はfastlaneの戻り値を別の環境変数に保存して別のジョブでSlack通知をしたかったのですが、別のジョブで上書きした環境変数を保持する方法がわからなかったためfastlaneで通知をするように設定しました。
https://docs.fastlane.tools/actions/deploygate/

## 2.1 Webhook URLを環境変数に追加
Circle CI ログイン後、設定したいリポジトリをクリックして「Project Settings」をクリック
左側の「Environment Variables」をクリック
「Add Variable」をクリックして変数名と先程メモしたSlackのWebhook URLを入力
※今回は変数名を`SLACK_WEBHOOK_URL`とする

## 2.2 fastlaneの修正
プロジェクトのソースコードを修正する
プロジェクトファイル内のfastlane/Fastfileを開き、定数定義部分に以下の行を追加する

```sh
# 定数定義部分に追加
ENV["SLACK_URL"] = ENV['SLACK_WEBHOOK_URL']
```

そのままDeployGateアップロード処理の行の下に以下のコードを追加する
※Androidは失敗時の処理を追加していない　いずれ失敗時の分岐も追加する
参考：https://docs.fastlane.tools/actions/slack/

```sh
# DeployGateアップロード後の行に追加
android_version=lane_context[SharedValues::DEPLOYGATE_REVISION]
slack(
  message: "ケイト様ー！Androidの開発版アプリが##{android_version}としてアップロードされましたよー！",
  use_webhook_configured_username_and_icon: true
)
```

## 2.3 設定の確認
設定が完了したらCIをビルドしてSlack通知が送られてくるかを確認する
![Circle CI_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340824/52372041-74de-6fcd-b2b0-f17dee2599c1.png)

# 総括
これでどのプルリクエストの修正がどのDeployGateのリビジョンから反映されているかがわかりやすくなりました。
CIを触れるのが初めてだったこともあり、CIについても理解が深まったのでとても勉強になりました。

# 参考
[SlackのWebhook URL取得手順](https://qiita.com/vmmhypervisor/items/18c99624a84df8b31008)
[slackのIncoming webhookが新しくなっていたのでまとめてみた](https://qiita.com/kshibata101/items/0e13c420080a993c5d16)
[envmanでBitriseの環境変数を上書きしようとしたら罠にハマった](https://qiita.com/satoshi-baba-0823/items/4387f4f11010ddda2c14)