CircleCIで例外発生時にon_fail判定でSlackへ手軽に通知できるようにしてみた

CircleCIでの例外発生時にSlackへ通知させることを目的に作業した記録です。Slack orbがWorkSpaceやBASH_ENVの変数評価に対応していないため、Slack orbを利用中である前提で手軽く書ける方法をまとめました。
2020.03.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

CircleCIワークフローが例外の発生で中断した時、Slack等へメッセージを加工しつつ通知しておきたい時がありますが、今回利用したSlack OrbはWorkSpaceやBASH_ENVの評価に対応していませんでした。代わりにrunでcurlを用いてWEBHOOKから通知させてみました。

Slackへ通知するスクリプト

なるだけ固定値を書き込まず、色々な状況下で使いまわしが効くことを前提としてみました。

post_slack.sh

#!/bin/sh
SLACK_WEB_HOOK=$1
MESSAGE=$2
PAYLOAD=$(echo "{}" | jq ".text = \"${MESSAGE}\"")
echo $MESSAGE
curl -XPOST --data-urlencode "payload=${PAYLOAD}" ${SLACK_WEB_HOOK}

payload用のJSONデータは、直接記述すると各記号のエスケープが手間となるため、jqを用いた要素設定としています。

ワークフローからの呼び出し

${SLACK_WEBHOOK}については、Slack orbを利用中であれば設定が済んでいるはずです。この例は単純な通知だけにしていますが、必要に応じて値をWorkSpaceあるいはBASH_ENVを経由して通知させることも可能です。

      - run:
          command: |
            exit 1
      - run:
          name: image_exist_check
          when: on_fail
          command: |
            sh ./post_slack.sh ${SLACK_WEBHOOK} "master_${CIRCLE_SHA1:0:7} tags Image not found"

あとがき

知識としては判っていたものの、Orbを利用する場合は担保している範囲を正確に把握しておくべきであると実感しました。

WorkSpaceあるいはBASH_ENVを経由して状況に応じたデータを渡すことができますが、Orbによってはそれらの評価を行わないものがあります。処理の組み合わせが必要でない等、あくまでもそれ単体で完結するケースに留めておいたほうが手戻りもすくなくなるはずです。