839の日記

業務とは関係ない趣味の話を書くブログです。

GitHub Actions(beta)向けにslack通知プラグインを作った

github.com

839.hateblo.jp でcircleciからgithub actionsに移行したもののslack通知周りが整ってないので作った。
自分が観測している範囲だと現状 https://github.com/pullreminders/slack-action しかなかったけど、あまりにもpayloadを書くのがきつそうなので敬遠していた。
あとdockerベースだと毎回このプラグインのimageが先頭でbuildされるのも速度的に気になっていた。

元々もっと困っていたのはキャッシュ周りで、それっぽいAPIがあったので調査してみたが結局現状できない、という結論になったので次はslackかなーと作り始めた。
nodejsでTypeScriptを使って書いた、templateリポジトリを使って作ると最初から最低限のCI環境(GitHub Actions)が整っているのでDX良いなーと感じた。

https://github.com/actions/javascript-template のtemplateを使って作り始める方法は https://help.github.com/en/articles/development-tools-for-github-actions のあたりに書いてある。
作ってて気づいたけど普通にbadgeの機能も提供されてて便利、ただ今はmasterブランチのものしか取れないっぽい?

f:id:husq:20190816031503p:plain

f:id:husq:20190816031554p:plain

とりあえずこんな感じで通知できるようにしている。
通知の指定方法は以下の感じぐらい。

- uses: 8398a7/action-slack@v1
  with:
    type: success
  env:
    SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
- uses: 8398a7/action-slack@v1
  with:
    type: failure
  env:
    SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}

typeを指定すれば他の要素はこちら側でよしなに受け持つスタイルにしている。 毎回長文のyamlを書きたくないのでできるだけ簡潔にしたいという思いがこもっている。

一応カスタム通知をしたいという人向けにカスタムも用意した。

f:id:husq:20190816031754p:plain

- uses: 8398a7/action-slack@v0
  with:
    payload: |
      {
        "text": "Custom Field Check",
        "attachments": [{
          "author_name": "slack-actions",
          "fallback": "fallback",
          "color": "good",
          "title": "CI Result",
          "text": "Succeeded",
          "fields": [{
            "title": "short title1",
            "value": "short value1",
            "short": true
          },
          {
            "title": "short title2",
            "value": "short value2",
            "short": true
          },
          {
            "title": "long title1",
            "value": "long value1",
            "short": false
          }],
          "actions": [{
          }]
        }]
      }
  env:
    SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}

slack payloadを自分でjson形式で指定する方法。
withで受け取れる値が現状stringしかないので、汎用的に作るなら今の所この方式しかなさそうだった。
そのままyamlがparseできればobjectなりarrayなりが使えるようになるのでもう少し書きやすい形も提供できると思うけど…。

シュッと作ってしまったのでまだまだよしなに受け持つ通知は改善の余地があるけど一旦v1.0.0ということでリリースした。

github.com

現状github contextの型が不十分*1jsonとしては値が入っているのに使えないケースがまぁまぁある。
本当はjobのstatusもこのプラグインの中でハンドルして、何も指定されていない場合はsuccess or failureを自動判定するようにしたいところ…。 実際に使う場合は以下のような指定になる。

    - uses: 8398a7/action-slack@v1
      with:
        type: failure
      env:
        SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
      if: failure()
    - uses: 8398a7/action-slack@v1
      with:
        type: success
      env:
        SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
      if: success()

良いやつが出るまではこれをメンテしていこうと思うので気になる所があればぜひissue / PRください。