やりたいこと
CircleCI のJob の結果を Slack に通知することです。
こちらの記事を参考にさせていただきました。
[CircleCI Orbsで、jobの結果をslackに通知する]
(https://qiita.com/k_bobchin/items/11f0d778de09502de1f3#3-circleciconfigyml%E3%82%92%E8%A8%AD%E5%AE%9A)
記事の流れどおりで作成してみた備忘録のようなものになります。
Webhook URL の発行
CircleCI の対象のリポジトリから右上の「Project Settings」をクリックします。
「Slack Integrations」を選択して、「Slack's CircleCI Integration page」のリンクをクリックします。
通知したいルームを選択して(下の画像の右上)、「Add to Slack」をクリックする。
通知するチャンネルを選択して、「Add CircleCI Integration」をクリックする。
URLが発行されるので確認して、一番下までスクロールして「Save Integration」をクリックする。
これでURLが発行されました。
Webhook URL の登録
先ほど表示したCircleCIの設定ページの「Add Webhook URL」をクリックします。
発行されたWebhook URLをコピーして貼り付けます。ここでは自動的に「SLACK_WEBHOOK」という環境変数名で登録されます。
Slack Ords の確認
Slack Orb の使用の仕方が記述されているので、ここをみながら .circleci/config.yml
の設定を行っていきます。
ちなみに Ords を使用すると .circleci/config.yml
の記述量が減り、簡単に実装できるということなので、CircleCI 2.1 以上であれば積極的に使用した方がいいものらしいです。
.circleci/config.yml の設定
今回は以下のように設定ました。
version: 2.1
executors:
default:
working_directory: ~/workspace
docker:
- image: node:12
orbs:
slack: circleci/slack@3.4.2
commands:
restore_npm:
steps:
- restore_cache:
name: Restore npm dependencies
key: npm-{{ checksum "package.json" }}
save_npm:
steps:
- save_cache:
name: Cache npm dependencies
key: npm-{{ checksum "package.json" }}
paths:
- ~/workspace/node_modules
jobs:
build:
executor: default
steps:
- checkout
- restore_npm
- run:
name: Install dependencies
command: npm install
- run:
name: Lint
command: npm run lint
- run:
name: Build
command: npm run build
- run:
name: Test
command: npm run test:unit
- save_npm
deploy:
executor: default
steps:
- checkout
- restore_npm
- run:
name: Build
command: npm run build
- run:
name: Check dist
command: ls -la dist
- run:
name: Deploy to Firebase Hosting
command: ./node_modules/.bin/firebase deploy --token=$FIREBASE_TOKEN
- slack/status:
success_message: ':ok:\nRepository: $CIRCLE_PROJECT_REPONAME\nBranch: $CIRCLE_BRANCH\nPull Requests: $CIRCLE_PULL_REQUESTS\nDeploy Success!'
failure_message: ':ng:\nRepository: $CIRCLE_PROJECT_REPONAME\nBranch: $CIRCLE_BRANCH\nPull Requests: $CIRCLE_PULL_REQUESTS\nDeploy Failure!'
webhook: "${SLACK_WEBHOOK}"
workflows:
push-build:
jobs:
- build
- deploy:
requires:
- build
filters:
branches:
only: master
Orb の使い方は orbs:
で Orb名
: 使用するOrb@タグ名
と記述して、 Job で Orb名/xxx
と記述すれば Orb 側で定義してある xxx
コマンドが実行できます。
また circleci/slack@3.4.2v で使えるコマンドは以下の通りです。
- approval: Notify Slack about an awaiting approval job.
- notify: Notify a Slack channel with a custom message.
- status: Send a status alert at the end of a job based on success or failure. Must be the last step in a job.
今回は status
を使用します。
status
は Job が 成功
or 失敗
に応じてアラートを通知するコマンドです。
Slack の通知についての設定を抜粋すると以下のようになります。
# 省略
orbs:
slack: circleci/slack@3.4.2
# 省略
jobs:
# 省略
deploy:
executor: default
steps:
- checkout
- restore_npm
- run:
name: Build
command: npm run build
- run:
name: Check dist
command: ls -la dist
- run:
name: Deploy to Firebase Hosting
command: ./node_modules/.bin/firebase deploy --token=$FIREBASE_TOKEN
- slack/status:
success_message: ':ok:\nRepository: $CIRCLE_PROJECT_REPONAME\nBranch: $CIRCLE_BRANCH\nPull Requests: $CIRCLE_PULL_REQUESTS\nDeploy Success!'
failure_message: ':ng:\nRepository: $CIRCLE_PROJECT_REPONAME\nBranch: $CIRCLE_BRANCH\nPull Requests: $CIRCLE_PULL_REQUESTS\nDeploy Failure!'
webhook: "${SLACK_WEBHOOK}"
# 省略
今回の場合は deploy
の Job が 成功
or 失敗
に応じて - slack/status:
以下の success_message
or failure_message
で定義したメッセージが Slack に通知されます。
ちなみに、いろいろ実験した結果、- slack/status:
の直前の Step でなくても、Job で定義された Step のどこか一箇所でも失敗していると failure_message
が飛ぶようになっているみたいです。
実際に通知した例は以下のようになります。
出力する内容はプロジェクトの運用に合わせて設定してください。
以上になります。