ちょっと話題の記事

GitHub ActionsでPull Requestに自動的にラベルを付与してレビューをしやすくする

GitHub Actionsにより、Pull Requestで変更されたパスに基づいて、設定したラベルを自動付与して、Pull Requestの見逃し防止やモジュール判別をする。
2019.09.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

プロダクトを構成するモジュールが、以下のように複数から構成されている場合、リポジトリ構成はどうしていますか?

  • web
  • api
  • batch
  • infrastructure
  • cli
  • ...

単一レポジトリ(Monorepo)構成でしょうか?複数リポジトリ(Multirepo)構成でしょうか?
今回はMonorepo構成の場合に遭遇する、Pull Requestレビュー時の1つの課題解決方法について紹介します。

目を通しておくべきPull Requestかどうか

プロダクトが成長すると、それに伴いモジュールの数が増えたり、チームが分かれたりといろいろあります。
モジュール毎にチームが分かれている場合、Pull Requestはどうしてますか?

タイトルのプレフィックスに[web]のようにマークを付けている?モジュール毎のラベルを付与してもらっている?プレフィックスやラベルを付け忘れたら?
Reviewersにレビューして欲しい人を追加してもらってる?自分がReviewersにいなかったら?

人が手作業で頑張ろうとすると、忘れてしまうことはあります。
しかし、それはシステムやルールが悪いのであって「気をつけようね」と解決するものではありません。

Pull Request Labelerアクション / GitHub Actions

About GitHub Actions
https://help.github.com/en/articles/about-github-actions

GitHub Actionsのアクションの1つとして、Pull Request Labelerというものが提供されています。
https://github.com/actions/labeler

Pull request labeler triages PRs based on the paths that are modified in the PR.

これはPull Requestで変更されたファイル群のパスに基づいて、設定したラベルを自動付与するアクションです。
結果を先にお見せしておくと、このようにwebモジュールを変更していればweb、apiモジュールであればapi、....というように、GitHub Actionsによりラベルが付与されます。

導入方法

GitHub Actionsのページから、ベータ版にサインアップして、Actions機能が有効になっていることが前提になります。
https://github.com/features/actions

1.アクション定義ファイル .github/workflows/label.yml を作成します。

name: Labeler
on: [pull_request]

jobs:
  label:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/labeler@v2
      with:
        repo-token: "${{ secrets.GITHUB_TOKEN }}"

これはGitHubの画面上からも作れますし、YAMLファイルをgit pushしてもかまいません。

2.ラベルとパスの対応設定ファイル .github/labeler.yml を作成します。

web:
- web/**/*
api:
- api/**/*
batch:
- batch/**/*
infrastructure:
- infrastructure/**/*
cli:
- cli/**/*

Pull Request Labelerでは、このファイルをデフォルトの設定ファイルとして読み込むように実装されていますが、 jobs.label.steps.with.configuration-path フィールドの指定を追加し、例えば .github/label-path-mapping.yml を使うように変更可能です。
参考: https://github.com/actions/labeler/blob/releases/v2/action.yml#L9

...
    steps:
    - uses: actions/labeler@v2
      with:
        repo-token: "${{ secrets.GITHUB_TOKEN }}"
        configuration-path: ".github/label-path-mapping.yml" # <-- 追加

3 1.と2.で作成したファイルをgit pushします。

導入方法は以上になります。
これにより、Pull Request作成すると .github/labeler.yml で定義したラベルとパスのマッピング情報に従い、ラベルが自動付与されます。

さいごに

GitHub Actionsにより、Pull Requestに自動的にラベルを付与して、見るべきPull Requestを見逃さないようにする方法の一例を紹介しました。
過去のプロジェクトで、このGitHub Actionsがあればなぁと思い返しました。

補足

ラベルが付与されるまでの時間

実際試していただくと分かるのですが、Pull Requestを作成してから、github-actions botにより、ラベルが付与されるまで数分かかる場合があります。
こちらのPull Requestの例だと4分程度かかっています。

ラベルを事前に作っていない場合

.github/labeler.yml で定義したラベルを事前に作成していない場合、Pull Request Labelerにより自動的に作られます。 その際には、ラベルはデフォルトカラー(灰色)になっているので、後で色の変更や説明の記載をしましょう。