この記事は何
GitHubのDependabotが作成したPRに対してのみ、自動でレビュワーをアサインしたい場面はよくあるかと思います。
ただ、これを実現する方法を調べていくとどうしてもCODEOWNERSにたどり着くのですが、CODEOWNERSはDependabot以外のPRにもレビュワーを自動でアサインしてしまうため、使いどころに悩むケースもあります。
今回はCODEOWNERSを使わずに、DependabotのPRにのみレビュワーを自動アサインする方法を紹介します。
Dependabotとは
Dependabotは、GitHubが提供している依存関係の自動アップデートツールです。
依存しているライブラリにセキュリティ上の問題が見つかった時や、新しいバージョンがリリースされた時に、自動でアップデート用のPRを作成してくれます。
リポジトリに.github/dependabot.ymlを置いておくだけで動作するので、導入のハードルも低くとても便利です。
DependabotのPRに自動でレビュワーをアサインしたい
Dependabotが作成したPRは、内容としては「ライブラリのバージョンを上げるだけ」のものが多いですが、それでも誰かにレビューしてもらってマージしたいというケースは多いと思います。
できればこのレビュワーのアサインも自動化したいところです。
しかし、現在のDependabotには、PRに自動でレビュワーをアサインする機能がありません。
過去にはdependabot.ymlにreviewersというフィールドが存在していましたが、現在は非推奨となっており、新規に設定しても動作しません。
そのため、別の方法で自動アサインを実現する必要があります。
CODEOWNERSの欠点
GitHubでレビュワーの自動アサインを行う一般的な方法として、CODEOWNERSファイルを使う方法があります。
CODEOWNERSを使えば確かにDependabotのPRにもレビュワーが自動でアサインされるのですが、ここに一つ問題があります。
それは、CODEOWNERSは対象のパスに変更を加えた全てのPRに対してレビュワーをアサインしてしまう、という点です。
例えば、
- 通常のPRはチームメンバー全員に自動アサインしたいが、Dependabotのライブラリアップデートのレビューだけは特定のメンバーに任せたい
- そもそも普段のPRには自動アサインの仕組みを入れたくない
といったケースだと、CODEOWNERSはそのままだと使いづらいです。
解決策: GitHub Actionsでdependenciesラベルが付いたPRにのみアサインする
ここで利用できるのが、Dependabotが作成するPRに自動的に付与されるdependenciesラベルです。
このラベルがついたPRに対してのみレビュワーをアサインするGitHub Actionsを作れば、結果的にDependabotが作成したPRにのみレビュワーをアサインできるようになります。
実際のワークフローのYAMLは以下のようになります。
name: Assign Reviewer for Dependabot PRs
on:
pull_request:
types: [labeled]
jobs:
assign-reviewer:
if: github.event.label.name == 'dependencies'
runs-on: ubuntu-latest
steps:
- name: Assign reviewer
uses: actions/github-script@v8
with:
script: |
await github.rest.pulls.requestReviewers({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.payload.pull_request.number,
reviewers: ['username1', 'username2']
});
ポイントは以下の通りです。
-
pull_requestイベントのlabeledタイプをトリガーにすることで、ラベルが付与された瞬間にワークフローが起動するようにしている -
if: github.event.label.name == 'dependencies'で、付与されたラベルがdependenciesの時のみjobを実行するようにしている -
actions/github-scriptを使い、requestReviewersAPIでレビュワーをアサインしている -
reviewersにアサインしたいユーザー名を配列で指定する(チームを指定したい場合はteam_reviewersを利用する)
これでDependabotがPRを作成しdependenciesラベルが付いたタイミングで、自動的に指定したメンバーがレビュワーにアサインされるようになります。
team_reviewersを使うとTeamを指定してアサインすることもできます。
await github.rest.pulls.requestReviewers({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.payload.pull_request.number,
team_reviewers: ['my-team']
});