CodeBuildの実行結果をブランチやGitハッシュ情報などを含めてSlackに投稿する


# はじめに

AWS公式では [Chatbotを利用してCodeBuildの結果をSlackに通知する](https://aws.amazon.com/jp/blogs/news/receive-aws-developer-tools-notifications-over-slack-using-aws-chatbot/) 方法が紹介されています
これは簡単に正否結果だけをSlack通知をするには良いのですが、2022年8月現在、通知内容をカスタマイズする方法がありません。

運用的にブランチ名やGitハッシュの情報などが欲しかったため改善することにしました


![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f393436382f61623165633937322d643665342d313262612d366461652d6663663636373434366362612e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9468/92ed0dca-3de6-710b-525b-a9f0349843e8.png) <img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9468/82ff8ce1-c618-15ca-250d-c00fdf8665b6.png">
　　図. 有効な情報が無いのでSlack通知を無視するようになるエンジニア


# 手順

## SlackAPI用のWebHookUrlを発行する

[Slack公式サイト](https://slack.com/intl/ja-jp/help/articles/115005265063-Slack-%E3%81%A7%E3%81%AE-Incoming-Webhook-%E3%81%AE%E5%88%A9%E7%94%A8) を参照して、API実行用のWebHookUrlを発行します

## Slack通知用スクリプトの作成

発行したWebHookUrlを使って通知用スクリプトを作成します

curlコマンドを叩いてるだけなので直接buildspec.ymlに埋め込んでも良いのですが、汎用性を持たせるためスクリプト化しました

```sh:使い方
$ scripts/send_slack_message.sh ${SLACK_HOOK_URL} ${SLACK_CHANNEL} "${MESSAGE}" ${BRANCH_NAME} ${GIT_HASH}
```

```scripts/send_slack_message.sh
#!/bin/bash
SLACK_HOOK_URL=${1}
CHANNEL=${2}
OPTION_TEXT=${3}
BRANCH_NAME=${4}
GIT_HASH=${5}

RESULT=`curl -X POST --data-urlencode \
  'payload={
    "channel": "#'"$CHANNEL"'",
    "username": "codebuild",
    "text": "'"$OPTION_TEXT"'",
    "attachments": [
      {
        "color": "good",
        "fields": [
          {
            "title": "Project Name",
            "value": "xxx-server",
            "short": "true"
          },
          {
            "title": "Branch Name",
            "value": "'"$BRANCH_NAME"'",
            "short": "true"
          },
          {
            "title": "Git Hash",
            "value": "'"$GIT_HASH"'"
          }
        ]
      }
    ],
    "icon_emoji": ":aws:"
  }' \
$SLACK_HOOK_URL`

echo $RESULT
```

## パラメータストアにWebHookUrlを設定する

WebHookUrlはセキュアなデータのため、直接buildspec.ymlに埋め込むのはセキュリティ上推奨されません
そのためパラメータストアに格納して運用します
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9468/853ae108-4cf6-8b76-271e-e08a411d2442.png">

## buildspec.ymlの調整
buildspec.yml内では簡単にパラメータストアの値やブランチ名、gitハッシュ値などを参照することが可能なので、
これをスクリプトに渡してSlack通知を行います

```buildspec.yml
env:
  parameter-store:
    SLACK_HOOK_URL: "deploy_slack_hook_url"
    ...

  post_build:
    on-failure: ABORT
    commands:
    ...
      - |
        # ビルドの最後に通知処理を追加
        SLACK_CHANNEL='build_chat'
        MESSAGE='CodeBuild XXX build state SUCCEEDED.'
        BRANCH_NAME=${CODEBUILD_WEBHOOK_TRIGGER#branch/}
        GIT_HASH=${CODEBUILD_RESOLVED_SOURCE_VERSION}
        scripts/send_slack_message.sh ${SLACK_HOOK_URL} ${SLACK_CHANNEL} "${MESSAGE}" ${BRANCH_NAME} ${GIT_HASH}
```

### 参考URL
* https://dev.classmethod.jp/articles/codebuild-env/
* https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-env-ref-env-vars.html


## 結果
![スクリーンショット 2022-08-05 18.46.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9468/f33a7afe-f2e7-2022-9976-4ad3659205e5.png) <img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9468/6ce03a55-befa-8d37-6cc9-9bcea55ed221.png">
　　図. 便利になって喜ぶエンジニア