Cloud Buildの進行状況をSlackに通知する

# はじめに

[前回の記事](https://qiita.com/tnagao3000/items/d9ef6dceac1d34a46564) で Cloud Build を使ったデプロイが出来るようになりました。
今回は Cloud Build の進行状況を Slack に通知してみます。

# 通知のトリガー

通知のトリガーとして使えそうなのは次の２パターンになります。

- (a) ビルド構成ファイルの好きな個所に通知を行うビルドステップを追記する
- (b) [Cloud Build がパブリッシュするメッセージ](https://cloud.google.com/cloud-build/docs/send-build-notifications?hl=ja) を拾う

(a)はビルド中の好きなタイミングに仕込めますが、ステップにたどり
着く前にビルドがコケた場合は通知できません。

(b)はビルドがコケた際もそのことをメッセージで拾えます。

# Incoming Webhooks の URL を取得する
いずれの方法でもまずは Slack から 通知用URL を取得する必要があります。
[公式のこのへん](https://cloud.google.com/cloud-build/docs/configure-third-party-notifications?hl=ja#slack_notifications) 等を参考に取得してください。

次のような感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26808/05ce95d3-df7b-784d-aa65-f60df4a7e0d7.png)

# (a) ビルド構成ファイルにビルドステップを追記する
好きな個所に通知のビルドステップを追加します。
[公式のこれ](https://github.com/GoogleCloudPlatform/cloud-builders/tree/master/curl) を使って次のようにすればいいようです。

```yaml:cloudbuild.yaml（抜粋）
- name: gcr.io/cloud-builders/curl
  args:
  - -X
  - POST
  - --data-urlencode
  - "payload={\"text\":\"Cloud Build $BUILD_ID いつやるか？今でしょ\"}"
  - https://hooks.slack.com/services/T78RGFXHD/BM1JWA874/ALmDvClLO5....
```

実行結果は次のような感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26808/b10d169b-8278-8df4-f5af-8556220b0457.png)

# (b) Cloud Build がパブリッシュするメッセージを拾う
[公式のここ](https://cloud.google.com/cloud-build/docs/send-build-notifications?hl=ja) に記載されていますが、Cloud Build API を有効にすると
自動でビルド状態の変化を通知する Pub/Sub トピックも作られます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26808/e63ee36a-3563-91ac-e726-b5e32f488baf.png)

上記を [公式のここ](https://cloud.google.com/cloud-build/docs/configure-third-party-notifications?hl=ja#writing_the_cloud_function) を参考に Cloud Functions でサブスクライブしてSlack に通知します。
次の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26808/19aba001-61f3-0c12-86f7-ba3142472024.png)

functionの中身（前半）は次のような感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26808/e38b03c8-3536-8ff2-260e-c3ce64dd2a37.png)

※ index.js はコピペ時に次の２箇所を修正
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26808/84ad079b-9aca-e1ba-dde3-3fec53198955.png)

functionの中身（後半）は次のような感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26808/903d1048-51bf-79a7-fcd4-9def1ecc9bfb.png)

function が作成されるとビルド完了時に Slack に通知が行われるようになります。
自分の環境では何故かビルドが２つに分かれるが次のような感じ・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26808/a06f809c-26a3-8111-2aaa-2521157d662f.png)

# (b)の別のやり方
(b)と似たようなことはコミュニティから提供されている [こちらのイメージ](https://github.com/GoogleCloudPlatform/cloud-builders-community/tree/master/slackbot) でも出来ます。 
これは Dockerfile で提供されているため、利用前にイメージを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26808/640e22fd-0608-116d-9a66-943d28958c21.png)

上記が成功すると次のような感じに。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26808/0605e99a-7cf7-a012-1158-985f66f28b4c.png)

イメージが出来たらビルド構成ファイルの先頭に１ステップ追加します。

```yaml:cloudbuild.yaml（抜粋）
- name: 'gcr.io/$PROJECT_ID/slackbot'
  args: [ '--build', '$BUILD_ID',
          '--webhook', 'https://hooks.slack.com/services/T78RGFXHD/BM1JWA874/ALmD....' ]
```

以上で導入完了です。
そしてビルドすると次のような感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26808/582bf59e-fb9a-52cb-92b7-cfc9dc1e42c3.png)


以上です。