こんにちは!がちむちです!
皆様今年はどんな一年でしたか?
私は、今年こそは!このブログに沢山記事を投稿しよう!と心に固く誓ったのですが、これが初めての投稿になります!
コップ半分の水を多いと思うか、少ないと思うかの問題と同じで些細な問題ですね。
さて、巷では何やらクリスマスというイベントで盛り上がっていますね。
私は、嫁にクレカを献上したことで子供への責務を全うしたとお墨付きを頂きました。
トイ○らスの以外に白○まくんが我が家にやってきましたが、これで家内安全、嫁の機嫌も来月の支払額もうなぎのぼりです。
ようやく本題になりますが、皆様はエンジニアのコミュニケーション
というと、どんなことを想像しますか?
きっとこの記事を読んでいらっしゃる剛健質実なエンジニアとは180度対極にいる私ですが、私にだって窓際エンジニアの地位をキープすることに関しては、ちょっとした矜持があります。
コミュニケーションには、いろいろなやり方があると思います。今年私は社内で偉い人と喋れてないということに悩んでいましたが、あることがきっかけで殻を破ることができました。
どうやって?
このデザインパターンに気がついたのは、サッカー日本代表とクロアチアがPKをしているときでした。
この説明をするために、まず残暑厳しい季節まで時を遡ります。
github actionsの実行履歴を見たときに変な警告が出ていることに気が付きました。
いくつかのgithub actionsで下記のような出ていました。
Node.js 12 actions are deprecated. ....
github actionsでnode12がサポートされなくなることにより、node12を利用しているactionsで上記のような警告が出ていました。
その後チームで管理しているレポジトリで利用している各種actionsのversion upなどの対応を行っておりましたが、slackの通知を行うsonots/slack-notice-actionの対応に頭を悩ませました。
どう見ても偉い人のレポジトリではありませんか。
窓際の私は当然チームの若手にコントリビュートチャンスだぞ!!と鼓舞したり、きっと社内の人がなんとかしてくれると他力本願MAXでそっと閉じました。
時は過ぎ、師走が近づくにつれて周りは忙しくなっていきます。
窓際を死守するためにも、なにか仕事をやっている風ドリアを装わなければと思案しているときにサッカー日本代表のクロアチア戦のPK見て思いました。
俺は何をやっているんだ、、、、本部長と直接会話する機会が今年はないかもしれない!!!ゴマすりの土俵にすら立てない!!!
日本代表がPKでクロアチアと語り合ったように本部長とPRで語り合うべきだ!!
そして、サッカーの盛り上がりに乗じて、なんかやってる感をかもちだすしか残された道はない!
こうして私の絶対に負けられない戦い(sonots/slack-notice-actionをcloneする)が始まったのでした。
やったこと
node12
を node16
に変えただけの簡単なPRを送りつけました。
https://github.com/sonots/slack-notice-action/pull/23
結果
本部長からThx!
ってコメント来たので、語り合うことができてよかったです。
これを使って、せっかくなので、slack通知が入っていないレポジトリにも通知を入れようと思いました。
意気揚々とせっせとworkflowの設定に仕込んでいる最中にレビューコメントが付きました。
フフフ....去年までの窓際レベルの私ならここで、良いオチができたとまとめに入っていたでしょう。
今年は違いますよ!切れ味が。一度で二度美味しいです。
公式を使えなんて想定内なのですよ!!
そもそも公式を使って実装するなんて、最初にアタックしました。その上でsonots/slack-notice-actionが使いやすいと思ったんです。
具体的に何が使いやすかったかというと一番は設定しなくてもいい感じの内容が飛んでくる点です。
そして、slackapi/slack-github-actionが使いづらい点や、問題点がいくつかあります。
slackapi/slack-github-actionの問題点と使いづらい点
github actions contextがpayload-file-pathで指定したファイルで使えない点
これは、slackに通知する内容をjson形式でyaml以外でのファイルで管理することができる便利なものなのですが、workflowのyaml上で使えていた値(${{ github.event.xxx }}
みたいな値)がpayload-file-pathで指定するファイルでは、使えなくなってしまいます。
具体的には、yamlでは、以下のように記述できたものを
...
payload: |
{
"text": "A GitHub Action has ${{job.status}}",
"attachments": [{
"color": "${{ (job.status == 'success' && 'good') || (job.status == 'failure' && 'danger') || 'warning' }}",
"fields": [{
"title": "Repository",
"short": false,
"value": "<${{ github.event.repository.url }}|${{ github.event.repository.url }}>"
}, {
"title": "Ref",
"short": false,
"value": "${{ github.ref }}"
}, {
"title": "Commit",
"short": false,
"value": "<${{ github.event.head_commit.url }}|${{ github.sha }}>"
}, {
"title": "Author",
"short": false,
"value": "${{ github.event.head_commit.author.name }}"
}, {
"title": "Message",
"short": false,
"value": "${{ github.event.head_commit.message }}"
}, {
"title": "Workflow",
"short": false,
"value": "<${{ github.event.repository.url }}/actions/runs/${{ github.run_id }}|${{ github.workflow }}>"
}]
}]
}
payload-file-pathで指定するファイルでは、以下のように記述しないといけません。
{
"text": "A GitHub Action Event ${{ github.eventName }} has success",
"attachments": [{
"color": "goods",
"fields": [{
"title": "Repository",
"short": false,
"value": "<${{ github.payload.repository.html_url }}|${{ github.payload.repository.full_name }}>"
}, {
"title": "Ref",
"short": false,
"value": "${{ github.ref }}"
}, {
"title": "Commit",
"short": false,
"value": "<${{ github.payload.head_commit.url }}|${{ github.sha }}>"
}, {
"title": "Author",
"short": false,
"value": "${{ github.payload.head_commit.author.name }}"
}, {
"title": "Message",
"short": false,
"value": "${{ github.payload.head_commit.message }}"
}, {
"title": "Workflow",
"short": false,
"value": "<${{ github.payload.repository.html_url }}/actions/runs/${{ github.runId }}|${{ github.workflow }}>"
}]
}]
}
これの理由は、workflowのyamlはgithub actionsが置換してくれていますが、payload-file-pathのファイル内部の値の置換はslackapi/slack-github-actionのaction内部のslack-send.js#L42で行っているため、参照できる値が全然違うのです。
具体的には、@actions/githubのcontext.jsで取得できる値が参照できるようになっているため、だいぶ変わってしまいます。
stepなどで定義したenvの値がpayload-file-pathで参照できない問題
jobのステータスによって、文言変えたり、色を変えたりが難しい状況です。
また、大抵はtechnote-space/workflow-conclusion-actionなどを利用してjobの結果を通知することになるので、envが使えないのは、割と致命的な問題点に思えます。
payload-file-pathで指定するファイルの最初の$
が勝手に消える問題
これは、正直どうでもいいのですが、そもそも置換してくれるのが、github actions自体じゃないので、ぶっちゃけpayload-file-pathで指定されるファイルでは、${{ }}
のようにしないでも{{ }}
でいいのですが、サンプルやコードをみるとあたかもつけないといけない感じがしてしまいます。
そして、そのコードはあまり妥当ではないのでpayload-file-pathのファイルの最初の$を``に置換しているだけです。
https://github.com/slackapi/slack-github-action/blob/main/src/slack-send.js#L43
回避策
回避策として、workflowのyamlにベタ書きをすればいいのですが、複数のレポジトリを管理しているチームでは、以下の内容を全部のレポジトリに書いて回るのは、メンテナンス性の観点からもあまりやりたくありません。
payload: |
{
"text": "A GitHub Action has ${{job.status}}",
"attachments": [{
"color": "${{ (job.status == 'success' && 'good') || (job.status == 'failure' && 'danger') || 'warning' }}",
"fields": [{
"title": "Repository",
"short": false,
"value": "<${{ github.event.repository.url }}|${{ github.event.repository.url }}>"
}, {
"title": "Ref",
"short": false,
"value": "${{ github.ref }}"
}, {
"title": "Commit",
"short": false,
"value": "<${{ github.event.head_commit.url }}|${{ github.sha }}>"
}, {
"title": "Author",
"short": false,
"value": "${{ github.event.head_commit.author.name }}"
}, {
"title": "Message",
"short": false,
"value": "${{ github.event.head_commit.message }}"
}, {
"title": "Workflow",
"short": false,
"value": "<${{ github.event.repository.url }}/actions/runs/${{ github.run_id }}|${{ github.workflow }}>"
}]
}]
}
そこで、特になにも指定せずともいい感じの内容が勝手に送られてくるsonots/slack-notice-actionを利用するのが運用が楽そうだなと思っています。
だが直す
ここに書いたslackapi/slack-github-actionの問題点とpayload-file-pathで指定できるファイルで利用できる変数に関して、READMEで注意を促す修正PRを送っておきました。
https://github.com/slackapi/slack-github-action/pull/159
slackapi/slack-github-actionを使おうと思ったときに、結構困ったので仮に上のPRがマージされなくても、この辺の情報が困っている人の助けになれば幸いです。
窓際からのささやかながらクリスマスプレゼントということで★メリークリスマス★
まとめ
来年は沢山記事を書くぞ!