GitHub CLIではjqがサポートされている

Jun 11, 2021

TL;DR

  • GitHub のCLIは取得結果にjqが使えるので、CLIだけで簡単な集計なんかもできてしまう
  • 仕事でちょっとGitHubのIssueを集計する必要があって何か作ろうと思ったけど、公式CLIで十分だった。

GitHub CLIについて

GitHub公式が提供しているCLI. IssueやPull RequestをCLIから取得できる。

$ gh pr list --state all Showing 25 of 25 pull requests in suusan2go/kotlin-fill-class that match your search #50 Add IntelliJ v2021.1 as a target for the plugin renatomrcosta:target-version-2021.1 #49 Introduce options t-kameyama:introduce_options #45 Updating dependencies & target IntelliJ version steinhauer-software:fix/44-add-support-for-2020-3

GitHub CLIでjqを使う

簡単にIssueやPRを引っ張ってこれるだけかと思いきや、listコマンドにはかなりの数のオプションがある。

-a, --assignee string Filter by assignee -A, --author string Filter by author -q, --jq expression Filter JSON output using a jq expression --json fields Output JSON with the specified fields -l, --label strings Filter by labels -L, --limit int Maximum number of issues to fetch (default 30) --mention string Filter by mention -m, --milestone number Filter by milestone number or `title` -S, --search query Search issues with query -s, --state string Filter by state: {open|closed|all} (default "open") -t, --template string Format JSON output using a Go template -w, --web Open the browser to list the issue(s)

--json オプションでJSONとして出力できるのは想像の範囲内だけど、-q オプションではなんとjqのシンタックスでJSONの操作ができる。これと --search なりのオプションを組み合わせることで、特定のラベルをもつIssueを月毎に集計するなんてことも可能になる。

以下は foo ラベルをもつIssueを月毎に集計する例です。jq自体はそんなにガッツリやったことがなく、ググリながら組み立てたのでもっと効率がいい方法があるかもしレません。

gh issue list --search "label:foo" --limit 100 -s all --json "id,title,labels,createdAt" \ -q 'map({month: .createdAt | .[0:7]}) | group_by(.month)[] | {month: .[0].month, count: length} | [.month, .count] | @csv'

GraphQLのAPIを使った簡単なプログラムを作ろうかなと思ったけど、全然これで十分だった。流石にもうちょっと詳しい集計をしたくなったら自前で何か組んだ方が良いとは思う。