GitHub Actions から Slack 通知する
GitHub Actions で定期的な処理を行い、その結果に応じて Slack へ通知したいと考えた。
- GitHub Actions で定期実行するには
.on.schedule[].cron
で指定できる (実行されるのはmaster
ブランチの内容になるようだ) - Slack 通知には
rtCamp/action-slack-notify
というアクションが使いやすかったので、コレを使うと良いだろう - 特定の Step が失敗した時だけ Slack 通知するには、
id
で Step に名前を付けておき、if
でfailure
かどうかをチェックすると良いif: failure()
だけなら、Step に限らずどこかで失敗した時のみ発火する
ということで、以下に Workflow サンプルを書いておく。
.github/workflows/my-cron-job.yaml
name: My Cron Job
on:
schedule:
# 15分おきに実行する例
- cron: '*/15 * * * *'
workflow_dispatch:
jobs:
my-cron-job:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Use Node.js
uses: actions/setup-node@v1
with:
node-version: 14.x
- name: Setup npm
run : npm install
# 任意の処理を行う
- name: Run Script
id : run-script
run : node ./index.js
# 上の処理が失敗した時だけ Slack 通知する
- name: Slack Notification
uses: rtCamp/action-slack-notify@v2
if : failure() && steps.run-script.outcome == 'failure'
env :
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
SLACK_USERNAME: My Alert
SLACK_ICON_EMOJI: ':github:'
SLACK_COLOR: danger
SLACK_TITLE: タイトル
SLACK_MESSAGE: メッセージ
Slack 通知は Incoming Webhook URL さえあれば良い。Repository Secret で SLACK_WEBHOOK
として宣言しておく。
ユーザ名、アイコンなどは Incoming Webhook の設定が有効にならず、このアクションが持つデフォルト値で上書きされてしまうので、SLACK_USERNAME
や SLACK_ICON_EMOJI
などで上書きするのがほぼ必須だ。
SLACK_COLOR
は、CI の失敗を伝えたい場合は danger
なんかにしておくとそれっぽい見た目になる。SLACK_TITLE
と SLACK_MESSAGE
は任意のテキストを送信できる。
そうそう、Lambda なんかだと Puppeteer を実行するのが大変で (Chromium が容量制限に引っかかる)、chrome-aws-lambda
パッケージとかを代用することになるんだけど、GitHub Actions では直接 puppeteer
パッケージを使って Chromium をダウンロードさせてもちゃんと動作した。