この記事は GitHub Actions Advent Calendar 2023 の3日目の記事です。
プルリクにコメントする custom actions を作って公開したので、今回はその話をしたいと思います。
↑ よかったら使ってみてください。
README に機能などは既に書いたので、今回はそれ以外の、開発にあたって考えたこと等を書きたいと思います。
作った動機
他にも同じような機能の custom actions は幾つもあると思うのですが、オプションが多く使い方がよく分からなかったり、機能が冗長であったり逆に足りなかったりしたので、車輪の再発明は否めませんが、新しく自分で作ることにしました。
プルリクへのコメントはその是非はいったん置いておいて、個人的にはたまにワークフローに組み込むものなので、そもそも簡単な実装でできそうであるのに公式で提供しているわけでもない既存ものに敢えて依存する必要もないな、とも思いました。
この action は所属会社の GitHub Organazation に置いています。この action が広く使われるかは別にして(普通に考えたら既存のスター数が多い action を使った方が安心と思うでしょうし)、今後、少しずつでも、世の中のエンジニアに広く役立つものを社としても個人としても作っていきたいなあという思いもあります。
少しハマった点
Windows runnner への対応
この action はシェルスクリプトで作りました。Windows runner であっても Bash であればそれほど違いは気にせず作れるのですが、jq の結果が複数行である場合に、改行コードに CR(Carriage Return) が含まれることが分かったので、そこだけ対処する必要がありました。具体的には tr -d '\r'
のようにして CR を削除しています。
GraphQL の利用
普段は GitHub の REST API をよく使うのですが、コメントを非表示にする API が REST にはなかったので、その部分だけ GraphQL を使いました。やってみれば簡単だったのですが、個人的に GitHub の GraphQL は使ったことが無かったので、調べるのに少し時間がかかりました。
merge queue への対応
現状は GitHub の merge queue はまだ正式リリースでない為か、CI でエラーとなってもひっそりとキューから差し戻されるので(GitHub の notifications にはもしかして通知がくるかもですが)、この action でプルリクへキューから差し戻された旨をコメントしたいなと思っていました。
ただ merge_group
イベントでは、プルリクの番号は取得できません。よって README にも書いたとおり、commit SHA からプルリクの番号を取得する機能を作ったのですが、残念ながらこの時の commit SHA はマージ前ということもありプルリクに紐づいておらず、番号は取得できませんでした。
README で案内したとおり このような ワークアラウンドをこの action に組み込んでもよかったのですが、merge queue の正式リリース時にはまた仕様が変わってるかなとも思ったので、これは README で言及するに留めました。
Market へ公開する際の action 名
リポジトリの action.yml
ファイルで定義するのですが、既に存在するものと被っていると公開できません。本当はリポジトリ名と同じとおり「Comment Pull Request」としたかったのですが、前述のとおり同じような action はたくさんあるので、思ったとおり被っていました。仕方なく「Comment Pull Request for workflow」という感じで後ろに文字を少し足しました。追加した文字を小文字にしているのは敢えて(副題的な意味合い)です。
良かった点
GitHub からコードを見てもらえれば分かるのですが、メインのコードは 50 行ぐらいです。当初に思っていたとおり短いコードで実現できたのでコードは把握しやすく、今後なにかあっても対処もしやすいかなと思っています。
シェルスクリプトでなく JavaScript で実装する選択もあるのですが、私は JavaScript をたまにしか使っておらず、ツールチェインの更新や脆弱性に対応する為の頻繁なライブラリのバージョンアップも面倒だと思ったので、今回はシェルスクリプトで実装しました。GitHub CLI や jq も便利に使えますし。まあ短いコードですし、どちらでも良いかなと思います。
おわりに
短い投稿となりましたが以上となります。同じような感じで下記の2つの custom actions も作ったので、よろしければそちらも見て頂けると幸いです。