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ブランチのものしか取れないっぽい?
とりあえずこんな感じで通知できるようにしている。
通知の指定方法は以下の感じぐらい。
- 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を書きたくないのでできるだけ簡潔にしたいという思いがこもっている。
一応カスタム通知をしたいという人向けにカスタムも用意した。
- 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 contextの型が不十分*1でjsonとしては値が入っているのに使えないケースがまぁまぁある。
本当は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ください。