🐙

GitHubの依存アップデートPRをまとめて捌くCLI拡張「gh-dep」を作りました

に公開

TL;DR

  • 依存アップデート PR のレビューを効率化する GitHub CLI 拡張を作りました
  • Install は簡単 gh extension install jackchuka/gh-dep
  • 使い方は gh dep --owner <owner> と打つだけ
  • 検索機能でまとめて Approve (& merge) できます
  • GitHub Star ⭐ 記事 ♥️ もらえると喜びます!

https://github.com/jackchuka/gh-dep

デモGIF

背景

Dependabot や Renovate で大量に発生する依存アップデート PR。特に複数リポジトリを管理していると、「月曜の朝は依存更新関連のプルリクエストの嵐」なんてこと、よくありませんか?

ここ数ヶ月でいくつか OSS を作成・公開し、Dependabot の設定も欠かさず行ってきた結果、管理するリポジトリが増え、依存更新のプルリクエストも次第に増えてきました。
そのたびに、レビューとマージの繰り返しが発生し、地味に面倒に感じていました。
普段 OSS メンテしている皆さんは共感していただけるのではないでしょうか。

ある気づき

最初の数週間は GitHub Notifications を確認し、一つ一つ丁寧にレビューしマージをしていました。
そんな中、ふと「同じ依存関係の更新が複数リポジトリにまたがっている場合、まとめてレビューできたら楽なのでは?」と思い、それらの PR を一つの単位として扱うことができれば、レビューの手間を大幅に削減できるのではないかと考えました。

私の OSS の多くは、同じ技術スタックを使っていて、同じ依存関係を持っていることが多いです。
例えば、Go 言語のプロジェクトであればコマンドラインツール Cobra を使っていることが多く、Cobra の新しいバージョンがリリースされると、複数のリポジトリで同じように更新が必要になります。

仮に、5 つのリポジトリが Cobra のバージョン v1.10.0 から v1.10.1 に更新する PR を持っていたとすると、それら一つ一つを個別にレビューするのは非効率なわけです。

たとえ上の例が当てはまらなくても、GitHub Actions の更新や、セキュリティアップデートなど、同じ依存関係の更新が複数のリポジトリにまたがることはよくありますよね。その場合でも、同じ依存関係の更新を一つの単位としてまとめてレビュー・マージできると便利です。

gh-dep の紹介

というわけで、同じ依存関係の更新を一つの単位としてまとめてレビュー・マージできるツールを作成しました。

gh-dep は、GitHub CLI の拡張機能として提供されており、インストールも簡単です。

gh extension install jackchuka/gh-dep

使い方もシンプルで、TUI モードと CLI モードの 2 つがあります。

TUI モード

みんな大好き TUI モードは以下のように起動します。

gh dep --owner <owner>

内部的には gh search prs を使用しているため、--repo--label など、GitHub CLI の検索オプションをそのまま利用できます。(一部未対応ですので、リクエストお待ちしています)

gh-dep screenshot

(PR の一覧と CI のステータスが表示され、複数の PR を選択してまとめて Approve したり、マージしたりできます。)

CLI モード

他のツールとの連携やスクリプトでの自動化を考慮し、CLI モードも提供しています。
実は、実装がより柔軟になるように、CLI モードを最初に作りました。
いくつかのコマンドを組み合わせて使います。

# --group で同じ依存関係の PR をまとめて表示し Cache する
gh dep list --owner <owner> --group --json

# Cache されたグループに対して Approve する(dry-run も可能)
gh dep approve --group lodash@4.17.21 --dry-run

# Cache されたグループに対してマージする(マージ方法も指定可能)
gh dep merge --group lodash@4.17.21 --mode dependabot --method squash

設計思想

ユースケースや要件を整理し、GitHub CLI の拡張機能として提供するのが最適と考えました。
GitHub CLI は、GitHub が公式に提供しているコマンドラインツールで、拡張機能を簡単に追加できる仕組みがあります。
さらに、公式が提供している API を使うと、内部から gh コマンドを呼び出すこともでき、既存の認証/設定をそのまま活用できます。

また、TUI モードと CLI モードの両方を提供することで、対話的に操作したい場合とスクリプトで自動化したい場合の両方に対応できるようにしました。
TUI モードでは、当初 CLI モードで実装した group という概念を捨て、検索機能を活用することで、より柔軟に PR を選択できるようにしました。

まとめ

いかがでしたでしょうか。
今回は、私が作成した依存アップデート PR のレビューとマージを負担を軽減するツール gh-dep を紹介しました。
依存関係の更新が多いプロジェクトを管理している方にとって、レビューとマージの手間を大幅に削減できるツールを目指していますので、ぜひ使ってみて、フィードバックをいただけると嬉しいです。

それでは 👋

Discussion