$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

レビュータイムや定期的なissueチェックのためにGithubのissueを検索してSlackに投稿するCLIツールを作った

https://github.com/shibayu36/notify-issues-to-slack というツールを作ったので紹介です。

背景

はてな社内では各チームでレビュータイムという時間を設けていることが多い。その時間にチーム内のissueやPull Requestを全部見るという心がけをしている。レビュータイムについては昔に以下のような記事を書いた。
blog.shibayu36.org

一方レビュータイムを導入したとしても、レビュー依頼中のissueやPull Request一覧がSlackに流れてこないと、レビューやっていくぞという気持ちが高まらないことがある。そのためレビュータイムになったらレビュー依頼中のissueをSlackに流すツールを各チームでそれぞれ作っていた。

最近自分もまた同じようなツールを作ろうとしてしまった。しかし、みんな同じツールを作っているのは良くないと思い直し、このようにissueやPull Requestを検索し投稿するという汎用的なCLIツールを作りたいと考えた。

今回のツールでの投稿イメージ

コマンド一発でSlackに以下のような投稿ができる。

example

インストール

https://github.com/shibayu36/notify-issues-to-slack#installation を参照。go get/Docker/binary取得で使える。

使い方

基本的には-queryというオプションで検索クエリを指定することで、それにマッチしたものをSlackに投稿できる。-queryにはSearching issues and pull requests - GitHub Docsの全てのクエリが利用できる。

$ notify-issues-to-slack -github-token=... -slack-webhook-url=... \
    -query='repo:shibayu36/notify-issues-to-slack state:open label:"レビュー依頼"' \
    -text="レビューしましょう! @shibayu36" \
    -channel="review-channel" # slack channel to be posted

さらに-queryオプションはGithubでは対応していない相対時間も対応している。

$ notify-issues-to-slack -github-token=... -slack-webhook-url=... \
    -query='repo:shibayu36/notify-issues-to-slack state:open label:"レビュー依頼" created:<now-1w' \
    -text="レビュー依頼になってから1週間以上経ってるよ!そろそろしませんか? @shibayu36"
  • danger-filterや-warning-filterというオプションを使うことで、色付けも可能。一週間以上経っていたら赤色に、3日以上経っていたら黄色に色付けできる。
$ notify-issues-to-slack -github-token=... -slack-webhook-url=... \
    -query='repo:shibayu36/notify-issues-to-slack state:open label:"レビュー依頼"' \
    -danger-filter='updated:<now-1w' \
    -warning-filter='updated:<now-3d'

投稿時のアイコンやユーザ名ももちろんカスタマイズ可能。

$ notify-issues-to-slack -github-token=... -slack-webhook-url=... \
    -query='repo:shibayu36/notify-issues-to-slack state:open label:"レビュー依頼"' \
    -username='reviewiraikun' \
    -icon-emoji=':hamster:'

Github Enterpriseを使っているなら、-github-api-urlを使えばOK。

$ notify-issues-to-slack -github-token=... -slack-webhook-url=... \
    -github-api-url='https://ghe.example.com/api/v3'
    -query=...

投稿内容のカスタマイズ

もしSlackに投稿するときのタイトル部分や、それぞれのissue部分(attachmentの部分)をカスタマイズしたければ、-textオプションと-issue-text-formatオプションを使うことができる。こちらにはtext/templateの機能が使われているので、そのシンタックスが利用できる。今の所-textには[]github.Issue.として、-issue-text-formatにはgithub.Issue.として渡される。

例えば次のコマンドはレビュー依頼があれば投稿し、なければレビュー依頼はありませんでしたと投稿する。

$ notify-issues-to-slack -github-token=... -slack-webhook-url=... \
    -query='repo:shibayu36/notify-issues-to-slack state:open label:"レビュー依頼"'
    -text="{{ if . }}レビュー依頼を確認しましょう @shibayu36{{ else }}レビュー依頼はありませんでした{{end}}"

さらに次のコマンドは投稿するそれぞれのissueの文章をカスタマイズするもの。

$ notify-issues-to-slack -github-token=... -slack-webhook-url=... \
    -query='repo:shibayu36/notify-issues-to-slack state:open label:"レビュー依頼"' \
    -issue-text-format="{{.GetTitle}} ({{.GetCreatedAt}}に@{{.GetUser.GetLogin}}が作成)"

その他便利クエリ集

例として便利クエリもあげておきます。

これはレビュー依頼中でレビュワーがいないものはwarningに、さらに2日以上放置されているものはdangerに色付け。

$ notify-issues-to-slack -github-token=... -slack-webhook-url=... \
    -query='repo:shibayu36/notify-issues-to-slack label:"レビュー依頼" state:open' \
    -warning-filter="type:pr review:none" \
    -danger-filter=""updated:<=now-2d type:pr review:none"

これは「進行中」ラベルが付いているのにアサインが決まっていないものを通知する。

$ notify-issues-to-slack -github-token=... -slack-webhook-url=... \
    -query='repo:shibayu36/notify-issues-to-slack label:"進行中" state:open no:assignee' \
    -text='アサイン忘れてませんか?'

これは自分へレビューリクエストがついたものを投稿する。

$ notify-issues-to-slack -github-token=... -slack-webhook-url=... \
    -query='repo:shibayu36/notify-issues-to-slack state:open type:pr review-requested:shibayu36'

まとめ

今回はGithubのIssueやPull Requestを検索してSlackに投稿するというツールを作ったので紹介した。まだ雑に作っていてalphaクオリティなため、インターフェースは変わる可能性があるが、よければ使ってください。

https://github.com/shibayu36/notify-issues-to-slack