kakakakakku blog

Weekly Tech Blog: Keep on Learning!

「Slack Orb」を使って CircleCI から Slack に通知する

CircleCI のジョブ結果を Slack に通知する場合,今までは CircleCI の Webhook と Slack の Incoming WebHooks を組み合わせて実現していた.最近読んでいる「CircleCI 実践入門」「Slack Orb」を使う方法が載っていたので,プライベートで使っている GitHub リポジトリの通知を移行することにした.実際に「Slack Orb」で試した内容を整理しておきたいと思う.なお「CircleCI 実践入門」の書評記事は別途書く.

「Slack Orb」を試す

まず,CircleCI の Project SettingsSlack Integration を選択して,Webhook URL を登録しておく.

f:id:kakku22:20200925233119p:plain

次に .circleci/config.yml「Slack Orb」の設定を追加する.ポイントは version2.1 にしておくことと,orbs の設定をしておくこと.そして今回は「Slack Orb」slack/status コマンドを使う.今回は以下のように exit をするサンプルを用意した.

version: 2.1

orbs:
  slack: circleci/slack@3.4.2

jobs:
  hello:
    docker:
      - image: cimg/base:stable
    steps:
      - checkout
      - run: exit 0
      - slack/status

workflows:
  version: 2
  ci:
    jobs:
      - hello

exit 0exit 1 を使って実行すると,以下のように「成功」「失敗」も Slack に通知できるようになった.簡単!

f:id:kakku22:20200925233135p:plain

fail_only パラメータを追加する

実運用を考えると,ジョブが「失敗」したときに通知できれば十分だと思う.その場合は slack/status コマンドに fail_only パラメータを追加する.true を設定すると「失敗」したときに通知できるようになる.ドキュメントを読むと,他にもパラメータは多くある.

(中略)

jobs:
  hello:
    docker:
      - image: cimg/base:stable
    steps:
      - checkout
      - run: exit 1
      - slack/status
          fail_only: true

(中略)

「Slack Orb」コマンド slack/notify

ドキュメントを読むと「Slack Orb」には slack/status 以外にもコマンドが用意されている.特に任意の値を通知できる slack/notify コマンドは使える場面が多くあると思う.

  • slack/approval
  • slack/notify
  • slack/notify-on-failure
  • slack/status

以下のサンプルのように slack/notify コマンドを使える.今回はパラメータとして titlemessagementions を設定した.他にも colorimage_url など,パラメータは多くある.

(中略)

jobs:
  htmllint:
    docker:
      - image: cimg/base:stable
    steps:
      - checkout
      - run: exit 0
      - slack/notify:
          title: 🚨
          message: アプリケーションエラー⚡
          mentions: kakakakakku

(中略)

実行すると,以下のように任意の値を通知できるようになった.簡単!

f:id:kakku22:20200925233239p:plain

疑問 1 : Alpine

Alpine で作った Docker イメージを CircleCI のジョブで使う場合,slack/status コマンドを実行するときに Bashcurl がなく,エラーになってしまう.ワークアラウンドとして .circleci/config.yml の中で run: apk add bash curl を追加して,一時的に Bashcurl をインストールすることにより,問題なく使えるようになった.Alpine を使う場面は多いと思うし,覚えておくと良さそう.

#!/bin/sh -eo pipefail
if [ ! -x /bin/bash ]; then
  echo Bash not installed.
  exit 1
fi

疑問 2 : when パラメータ

「CircleCI 実践入門」slack/notify コマンドと when パラメータを組み合わせた例が紹介されていた.実際に試したところ Build Error になってしまった.確かに CircleCI の設定に when パラメータは存在するけど,slack/notify コマンドと組み合わせられる?

steps:
  - slack/notify:
      message: デプロイ失敗
      when: on_fail

まとめ

「Slack Orb」を使って,CircleCI のジョブ結果を Slack に通知できるようにした.今後もどんどん使っていこうと思う.Alpine で作った Docker イメージを CircleCI のジョブで使っている場合はワークアラウンドも必要になる.「CircleCI 実践入門」は本当に良書だと思う.書評記事は今週公開する予定!