ビルドの完了をSlackで通知するシェルスクリプトを雑に書いた


概要

シェルスクリプトからSlackに通知を送りたいときのメモ。
シェルからAttachment(JSON)を扱うのが結構面倒くさい。

詳細

  • AWS CodeBuild でビルドの完了を通知するスクリプト
  • 通知投げるスクリプトとテンプレート相当のスクリプトを作った

コード

notify.sh

#!/bin/sh

set -eu

SLACK_WEBHOOK_URL=""

usage_exit() {
echo "Usage: $0 [message]" 1>&2
exit 0
}

case $1 in
build_start)
ATTACHMENTS=$(sh ./lib/scripts/notify/templates/build.sh start)
;;
build_complete)
ATTACHMENTS=$(sh ./lib/scripts/notify/templates/build.sh complete)
;;
\?)
usage_exit
;;
esac

curl -X POST $SLACK_WEBHOOK_URL -d "$ATTACHMENTS"

templates/build.sh

#!/bin/sh

set -eu

SLACK_CHANNEL="#notice"
SLACK_USERNAME="AWS CodeBuild"
SLACK_ICON=":yuki:"

BUILD_ID=${CODEBUILD_BUILD_ID:-"BUILD_ID"}
BUILD_LOG_URL=""
SOURCE_REPOSITORY_NAME=""
SOURCE_VERSION=`git ls-remote https://github.com/${SOURCE_REPOSITORY_NAME} | cut -f 1`
BUILD_ARN=${CODEBUILD_BUILD_ARN:-"BUILD_ARN"}

case $1 in
  start)
    MESSAGE="イメージのビルドが開始されました"
    COLOR="#2d9ee0"
    ;;
  complete)
    MESSAGE="イメージのビルドが完了しました"
    COLOR="#7CD197"
    ;;
esac

ATTACHMENTS=`cat << EOS
  {
    "channel": "${SLACK_CHANNEL}",
    "username": "${SLACK_USERNAME}",
    "icon_emoji": "${SLACK_ICON}",
    "attachments": [
      {
        "fields": [
          {
            "title": "${MESSAGE}",
            "short": true
          }
        ],
        "actions": [
          {
            "type": "button",
            "name": "build_log",
            "text": "Build Log 🛫",
            "url": "${BUILD_LOG_URL}",
            "style": "primary"
          }
        ],
        "color": "${COLOR}"
      },
      {
        "fields": [
          {
            "title": "Source Repository",
            "value": "${SOURCE_REPOSITORY_NAME}",
            "short": true
          },
          {
            "title": "Source Version",
            "value": "${SOURCE_VERSION}",
            "short": true
          },
          {
            "title": "Build ARN",
            "value": "${BUILD_ARN}",
            "short": false
          }
        ]
      }
    ]
  }
EOS`
echo $ATTACHMENTS