pixi-nudge 開発エピソード
背景
PRのレビュー依頼に気づかず、そのまま放置されてしまうことがあった。 GitHubの通知は他の通知に埋もれがちで、確認も後回しになりやすい。 そこで、毎朝Slackに「自分宛てのレビュー待ちPR」が届くbotを作ることにした。
なぜ「nudge」か
このbotは「Reminder」ではなく、あえて「nudge(ナッジ)」という名前にしている。
nudgeは「ひじで軽く突く」という意味があり、「おい!早くやれ!」と強制するのではなく、 「忘れてない?(ツンツン)」くらいの軽い気づきを与えるニュアンス。
また行動経済学の「ナッジ理論」にも由来しており、強制せず、選択の自由を残したまま良い行動に導くという考え方をベースにしている。
レビューを義務として押し付けるのではなく、自然と動きたくなる仕組みにすることでチーム全体の生産性向上を狙っている。 …とそれっぽいことを言いつつ、単純に自分が抜け漏れそうなので作った。
なぜGoか
技術選定の理由
- シンプルさ: Goはワンバイナリで動くし、言語仕様がシンプル。この規模のツールにフレームワークや複雑な依存関係は不要で、標準ライブラリ+GitHub SDKだけで完結できる
- GitHub Actionsとの相性: ビルドが速く、GitHub Actionsの実行時間を最小限に抑えられる。Node.jsのように
node_modulesのインストール待ちもない - GitHub公式SDKの充実:
go-githubというGoogle公認のGitHub APIクライアントがあり、型安全にAPIを扱える - 保守性: 型があるので、メンバーの追加やロジックの変更時にコンパイルエラーで気づける。シェルスクリプトやPythonだと実行するまでミスに気づかない
ぶっちゃけた理由
最近Go触り始めたので練習がてら作った。
やったこと
1. PRレビューリマインダーbotの開発
Go言語で、pixi-teams org配下の全リポジトリからレビュー待ちPRを収集し、Slackにメンション付きで通知するツールを作った。
2. コードのリファクタリング・ファイル分割
もともと1ファイルだった main.go を責務ごとに3ファイルに分割:
main.go— エントリーポイントgithub.go— GitHub APIからのPR取得・レビュアー判定slack.go— メッセージ構築・Slack Webhook送信
3. ガイモン風の挨拶メッセージ(20パターン)
Slackに通知する際の冒頭メッセージを、ワンピースのガイモン(20年間箱に閉じ込められた男)のセリフ風に20パターン用意。PRの放置を許さない熱量で語りかけてくる。
4. GitHub Actions + cronjob.org での定期実行
- GitHub Actionsのトリガーを
repository_dispatchに変更 - cronjob.org から毎朝8時にAPIを叩いてワークフローを起動する構成に
5. Slackでチームに周知
背景・仕様・注意点(コメント後はレビューリクエスト再付与が必要)を整理して、「nudge」の名前の由来(ナッジ理論)も添えてチームに共有した。
注意点・今後の課題
- GitHubの仕様上、コメントやApproveをするとレビューリクエストが外れるため、修正後に再度レビューが必要な場合はリクエストの再付与が必要
- チーム宛てのレビューリクエストは現状検知できない(個人宛てのみ対応)