🔖

Github Actionを使って、Pull Request作成時に自動でラベルを付与するCIを簡単に実現する

2024/02/16に公開

Pull Requestを管理する際に、ラベルで管理されているチームも多いのではないでしょうか。また、生産性の可視化をツールで測定する際にも、ラベルを用いてデプロイ回数を測定することもあるかと思います。
その際、Pull Request作成時に都度ラベルを付与するのは面倒であり、ヒューマンエラーでラベル付与が漏れてしまうことも考えられます。
そこで、PR作成時にベースブランチまたはヘッドブランチ名に合わせて、自動的にPRにラベルを付与するCIをGithub Actionで作成してみます。

結論

下記のようなyamlを作成しました

name: Restrict pr label
on:
  pull_request:
    branches:
      - main
      - staging
      - develop

jobs:
  restrict-pr-label:
    runs-on: ubuntu-latest
    permissions:
      pull-requests: write
    steps:
      - uses: agaroot-technologies/action-restrict-pr-label@v1.0.0
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          rules: |
            main <- staging [release] [production]
            staging <- development [release] [staging]
            development <- feature/* [feature]
            development <- bugfix/* [bugfix]
            development <- refactor/* [refactor]
            development <- chore/* [chore]
            development <- deps/* [deps]

上記のようなyamlによって

  • Staging環境にデプロイ(development -> staging)する : [release][staging]の2つのラベルが付与
  • 本番環境にデプロイ(development -> staging)する : [release][production]の2つのラベルが付与
  • 新機能開発(例: feature/comment-api)が完了して、開発環境にデプロイ(feature/* -> development)する : [feature]ラベルが付与
    などのように、ベース・ヘッドブランチに合わせて自動的にラベルを付与することができます。また、yamlファイルを編集することで条件を柔軟に変更することも可能です。

ハマりポイント

上記コードに行き着くまでに、ハマったポイントが何点かあったので備忘として書いておきます。

実行前にラベルは予め作成する必要がある

CIが付与するラベルについては、予め対象のリポジトリに作成しておく必要があります。未作成の場合、エラーとなるのでお気をつけください。もし可能であれば、「ラベルがなければ作成する」ようなスクリプトも組み込めれば、より汎用性 / 拡張性があるかもしれません(リポジトリを拡張したときに簡単にyamlを使いまわすことができる)

onをpull_requestに設定する

公式では下記のようなコードが記載されています。

name: Restrict pr label
on:
  pull_request_target:
    types: [opened, edited, synchronize]

jobs:
  restrict-pr-label:
    runs-on: ubuntu-latest
    permissions:
      pull-requests: write
    steps:
      - uses: agaroot-technologies/action-restrict-pr-label@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          rules: |
            main <- staging [release] [production]
            staging <- development [release] [staging]
            development <- feature/* [feature]
            development <- bugfix/* [bugfix]
            development <- refactor/* [refactor]
            development <- chore/* [chore]
            development <- deps/* [deps]

[参考]
https://github.com/agaroot-technologies/action-restrict-pr-label

しかし、onがpull_request_targetの場合、CIが実行されないケースもあったため、pull_requestイベントに変更しています。詳細な理由については不明なため、調査してみたいと思います。

version指定をv1.0.0とする

上記の公式が提供しているコードを実行すると、下記のようなエラーが表示されます。

Unable to resolve action agaroot-technologies/action-restrict-pr-label@v1, unable to find version v1

そこで下記を参照すると、v1ではなく、v1.0.0と記載があります。
https://github.com/marketplace/actions/restrict-pr-label

そのため、version指定を変更します。

name: Restrict pr label
on:
  pull_request_target:
    types: [opened, edited, synchronize]

jobs:
  restrict-pr-label:
    runs-on: ubuntu-latest
    permissions:
      pull-requests: write
    steps:
-     - uses: agaroot-technologies/action-restrict-pr-label@v1
+     - uses: agaroot-technologies/action-restrict-pr-label@v1.0.0
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          rules: |
            main <- staging [release] [production]
            staging <- development [release] [staging]
            development <- feature/* [feature]
            development <- bugfix/* [bugfix]
            development <- refactor/* [refactor]
            development <- chore/* [chore]
            development <- deps/* [deps]

これでエラーが発生しなくなります。

終わりに

Githubのラベルは、様々な活用方法があると思います。しかし、都度設定するのは面倒であることが多いかと思います。条件に合うラベルを自動的に付与することで、少しでも面倒が減らせるかもしれません。
このような地道な取り組みの積み重ねで、本来自分達が集中したいことに全力で集中できる環境を作り出し、良いエンジニアライフを過ごしていきたいですね。

参考

https://zenn.dev/praha/articles/11acc8f530078a
https://github.com/marketplace/actions/restrict-pr-label

Discussion