GitHub Actions から Slack 通知する

GitHub Actions で定期的な処理を行い、その結果に応じて Slack へ通知したいと考えた。

ということで、以下に Workflow サンプルを書いておく。

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_USERNAMESLACK_ICON_EMOJI などで上書きするのがほぼ必須だ。

SLACK_COLOR は、CI の失敗を伝えたい場合は danger なんかにしておくとそれっぽい見た目になる。SLACK_TITLESLACK_MESSAGE は任意のテキストを送信できる。

そうそう、Lambda なんかだと Puppeteer を実行するのが大変で (Chromium が容量制限に引っかかる)、chrome-aws-lambda パッケージとかを代用することになるんだけど、GitHub Actions では直接 puppeteer パッケージを使って Chromium をダウンロードさせてもちゃんと動作した。