ワークフローの完了をローカルに通知する GitHub CLI 拡張機能を作りました
はじめに
私は普段開発をしていて「CI 通ったらレビュー依頼しよう」とか「デプロイが終わったら動作確認しよう」とか思っている間に、別の作業に没頭してしまうことが稀によくあります。そんな問題を解決するための GitHub CLI の拡張機能を作りました!
Check が通ったら、ローカルに通知を飛ばして音を鳴らすことができます。
gif なので伝わりませんが、「ピロン」という音が鳴ります
これを使えば、わざわざワークフローの最後に Slack 通知を入れたりしなくても良くなりますね!
インストール
GitHub CLI がインストールされていることを前提にしています。GitHub CLI はめちゃくちゃ便利なので、まだインストールしていない人はぜひインストールしてみてください。
gh extension install
使って、拡張機能をインストールできます。
gh extension install kmtym1998/gh-prowl
gh prowl
でインストールした拡張機能を使うことができます。
gh prowl --help
This command allows you to monitor the status of GitHub Actions checks for a pull request (PR) or a specific branch. If used with the "--current-branch" flag, it monitors the PR associated with the current branch. Otherwise, you can select a PR or specify a branch manually.
Usage:
gh-prowl [flags]
Flags:
-c, --current-branch monitor the latest check status of the current branch's PR
-h, --help help for gh-prowl
-r, --ref string monitor the latest check status of the specified ref
-s, --silent do not play a sound when all checks are completed
機能
ある ref (ブランチ、コミット、タグ) に紐づく Check の状態を監視します。Check とは、GitHub 上でコミットと一緒に ✅ とか ❌ とか 🟠 みたいなアイコンで、何かしらのワークフローの実行結果を表示しているアレのことです。
これが Check。完了していて成功した Check が 4 つある状態
Check が完了すると音と通知が飛び、完了した Check のステータスを表示して終了します。
Pull Request を選択し、Check を監視する
オプションを指定せずに実行すると、対話形式で Pull Request を選択できます。選択した Pull Request に紐づく Check の状態を監視します。Pull Request が存在しない場合はエラーになります。
gh prowl
現在のブランチに紐付く Pull Request の Check を監視する
--current-branch
オプションを指定すると、現在のブランチに紐づく Pull Request の Check の状態を監視します。
gh prowl --current-branch
Pull Request が存在しない場合は、Pull Request の選択モードに移行します。
タグやブランチを指定して Check を監視する
--ref
オプションを指定すると、指定したブランチ、コミット、タグなどに紐づく Check の状態を監視します。
gh prowl --ref v1.0.0
gh prowl --ref main
gh prowl --ref c789b56d
実装について
GitHub CLI の拡張機能の開発における基本的な説明は割愛します。よしなに他の記事を参照してください。
使ったライブラリなど
CLI フレームワークには spf13/cobra を使いました。テーブル表示・prompter・GitHub API クライアントには、GitHub CLI の拡張機能開発のために公開されているパッケージ cli/go-gh/v2 を活用しました。イケてる CLI を作るのに良さそうな機能があるものの、リポジトリの example や Godoc を見てもイマイチ使い方がわからないことがありました。GitHub CLI 本体の似たような実装を見つけることができたので、それを参考にしつつ実装を進めました。
通知の実装は妥協して環境依存に
当初、通知方法は音を鳴らすだけにするつもりでした。Go で音を鳴らすためのパッケージを探してみると、こちらを使うのが良さそうに思われました。
この gopxl/beep というパッケージは、faiface/beep というそこそこ有名なパッケージの後継のようです。チュートリアルも充実していて良い感じでした。これを使って音を鳴らす実装は完成したのですが、cli/gh-extension-precompile
という GitHub CLI 拡張機能の配布に使われる GitHub Action でのビルドが失敗するという問題がありました。原因は faiface/beep の内部で使われている ebitengine/oto のビルドに失敗しているためでした。ビルドを通すためにあれこれ試したり、代替パッケージを探したりしましたが、結局解決できませんでした。
代わりに、環境依存を許容する方針に変更しました。runtime.GOOS
の値が darwin
の場合に afplay
使って音を鳴らす実装に変更しました。Mac にもともと入っている通知用の音声ファイルの場所は不変なのか判断ができなかったため、ビルド時に埋め込んだ音声ファイル[1]を使うようにしています。また、MacOS 前提で実装するなら、ニュッと出てくるあの通知バーも一緒に出してしまうことにしました。
ゆえに通知機能は Windows や Linux では動きません (通知時に音や通知が出ないだけで、Check 監視の動きは問題ないはず)。私は Macbook しか持っていないため、今後対応する予定はありません。もし MacOS 以外の環境で通知を動かしたい方がいれば、Pull Request お待ちしています。
おまけ: 名前の由来
コマンドの名前にした prowl という動詞には以下のようなニュアンスが含まれるようです。
- Check の完了を待っている感じと近い
- PR (Pull Request) と owl (🦉) ダジャレになりそう
と思ってこの名前をつけました。
Discussion