変更ファイルや所属グループを元に自動でコードレビュー依頼を出すことができる GitHub Action を紹介したいと思います!実際のユースケースを元に製作し運用しているので、同じように役に立つチームもあるのではないかと思います!
具体的には「コードオーナーとレビュアーを分けたい(誰がマージ可能かを区別するため)」や「GitHub のメンバーの数が多すぎて毎回レビュアーを探すのが手間かつ、常に同じメンバーにしかレビュー依頼を出さない」というケースで、非常に役立っています。
モチベーション
誰がどのプルリクエストをレビューするかは、チームによって様々だと思います。ランダムにレビューをアサインするチームもあれば、チームメンバー全員に見てもらうという方針のチームもあるかと思います。GitHub のコードレビューアサインメントやコードオーナーを利用することで、ある程度のユースケースは確かにカバー可能ですが、カバーできないケースもまた存在します。
本記事で紹介する Auto Request Review では、以下のケースをカバーすることが可能です!
- 変更されたファイルを元にレビュー依頼を出したい
- プルリクエスト作成者に応じたレビュアーを指定したい
- 自分のチームメンバー全員にレビューをしてもらいたい
- レビュアーとコードオーナーを区別したい
要は、ある特定のメンバーに対して、所属グループや変更ファイルを元にしてレビュー依頼を出したい場合に役立ちます。
コードオーナーとレビュアー
コードオーナーはそのコードに対して責任がある人であり、レビュアーはレビューをする人だと言えると思います。そして、チームによっては明確にこれらを区別していることがあります。例えば、プルリクエストをマージするのに、「コードオーナーの承認 + チームメンバーの誰か」としているチームもあると思います。また、「コードオーナーには絶対見てほしいけど、他の人には時間があれば見ておいてほしい」みたいなケースもあるかと思います。
主な機能
以下のことが可能になります。
- 変更ファイルを元に自動でレビュアーをアサインする
- プルリクエスト作成者ごとに個別のレビュアーをアサインする
- プルリクエスト作成者の所属するグループを元に自動でレビュアーをアサインする
- どのレビュアーにもマッチしなかった場合、デフォルトのレビュアーをアサインする
- 特定の条件でのみレビュー依頼を出す
変更ファイルを元に自動でレビュアーをアサインする
globを使ってレビュアーを定義できます。
files:
'**/*.js':
- js-lovers
プルリクエスト作成者ごとに個別のレビュアーをアサインする
プルリクエスト作成者ごとに個別のレビュアーを設定できます。
reviewers:
groups:
engineers:
- engineer_a
- engineer_b
per_author:
engineers:
- engineers
designer_a:
- lead_designer
designer_b:
- lead_desinger
- desinger_a
プルリクエスト作成者の所属するグループを元に自動でレビュアーをアサインする
グループアサインメントの機能を有効にしていれば、プルリクエスト作成者の所属するメンバー全員に自動でレビュー依頼が送られます。
reviewers:
groups:
js-lovers:
- js-man
- js-woman
options:
enable_group_assignment: true
どのレビュアーにもマッチしなかった場合、デフォルトのレビュアーをアサインする
デフォルトのレビュアーも設定可能です。どのレビュアーもマッチしなかった場合、この方達に依頼が飛びます。
reviewers:
default:
- repository-owners
特定の条件でのみレビュー依頼を出す
もしまだ準備できてないプルリクエストのレビューをしてほしくない、というのであれば、 ignore_draft
と ignored_keywords
オプションが利用可能です。
プルリクエストが下書き状態かつ ignore_draft
が true
であれば、レビュー依頼は送られません。また、プルリクエストのタイトルに ignored_keywords
に定義されている文字列が含まれている場合も同様です。
options:
ignore_draft: true
ignored_keywords:
- DO NOT REVIEW
設定
2つの YAML ファイルを準備する必要があります。
- レビュアー設定
- ワークフロー設定
レビュアー設定
レビュアーの設定用ファイルです。glob を利用し、レビュアーを定義することができます。 内部実装には minimatch を利用しています。
フォーマットは以下のとおりです。
reviewers:
# デフォルトレビュアー
defaults:
- repository-owners
- octocat
# レビュアーグループ(GitHub usernames の配列)
groups:
repository-owners:
- me # username
- you # username
core-contributors:
- good-boy # username
- good-girl # username
js-lovers:
- js-man # username
- js-woman # username
# プルリクエスト作成者ごとのレビュアー
# キーがレビュイーで、それぞれレビュアーの配列を持つ
per_author:
engineers:
- engineers # group
lead_designer:
- js-lovers # group
- desinger_a # username
designer_a:
- lead_designer # username
designer_b:
- lead_desinger # username
- desinger_a # username
files:
# キーが glob での表現になります
# 上で定義したレビュアーグループもしくは GitHub usernames が利用可能です
'**':
- repository-owners # group
'**/*.js':
- core-contributors # group
- js-lovers # group
'**/*.yml':
- core-contributors # group
- yamler # username
'.github/**':
- octopus # username
- cat # username
options:
ignore_draft: true
ignored_keywords:
- DO NOT REVIEW
enable_group_assignment: false
設定ファイルはデフォルトでは .github/auto_request_review.yml
ですが、ワークフローの設定ファイルで上書きが可能です。
ワークフロー設定
ワークフローの設定ファイルを .github/workflows
内に作成します。 例えば .github/workflows/auto_request_review.yml
のような感じです。
name: Auto Request Review
on:
pull_request:
types: [opened, ready_for_review, reopened]
jobs:
auto-request-review:
name: Auto Request Review
runs-on: ubuntu-latest
steps:
- name: Request review based on files changes and/or groups the author belongs to
uses: necojackarc/auto-request-review@v0.2.0
with:
token: ${{ secrets.GITHUB_TOKEN }}
config: .github/reviewers.yml # Config file location override