ブランチ名をもとにPRに自動でラベルを貼るGitHubActions
はじめに
弊社では、2023年11月よりOSSチームの活動がスタートしました。
このチームに参加しているメンバーは、1週間のうちの1日分の稼働をOSS活動に割り当てる事ができます。社員の技術力向上及び、日頃使わせていただいているOSSコミュニティに対する恩返しをチームのミッションとしています。
OSSチーム以前のOSS部では下記のような活動も行っていました。
今回は、OSSチームで新たに開発したGitHub Custom Actionsについて紹介させて頂きます。
GitHub Custom Actions
GitHubActionsでusesの所に指定するアレです。
Docker Container ActionsやJavaScript Actions、Composite Actionsなど、さまざまな種類が存在しますが、今回はCustom Actionsの詳細な解説は省略させていただきます。
PR作成時のマージ元ブランチを制限するActions
PR作成時のマージ元ブランチを制限するActionsです。
作成出来るブランチ名に一貫性を持たせる事が出来る為、特定のブランチ名をもとに発火するCI等が構築されている場合に有用です。
弊社では後述で説明する、ブランチ名を元にPRへ自動的にラベルを貼っている為、このActionsを利用しブランチ名を制限するようにしています。
使い方
まず、このActionsはPR作成時での利用を想定している為、pull_request_targetイベントを利用します。
あとはusesにagaroot-technologies/action-restrict-head-branchを指定し、Inputとしてrulesへブランチ名のパターンを記述する事で動作します。
name: Restrict head branch
on:
  pull_request_target:
    types: [opened, edited, synchronize]
jobs:
  restrict-head-branch:
    runs-on: ubuntu-latest
    steps:
      - uses: agaroot-technologies/action-restrict-head-branch@v1
        with:
          rules: |
            main staging development
            feature/* bugfix/* refactor/* chore/* deps/*
これで、PR作成時にマージ元ブランチがパターンにマッチしない場合は、該当のStepでエラーが発生します。
rulesにはブランチ名のパターンをスペース区切りで指定する事ができ、*を指定する事でワイルドカードを利用する事が出来ます。
また、可読性を担保する為に、任意の箇所で改行を入れる事が出来ます。
PR作成時のマージ先ブランチを制限するActions
PR作成時のマージ先ブランチを制限するActionsです。
マージ先のブランチに一貫性を持たせる事が出来る為、Git-flow等のブランチモデルを利用している場合に有用です。
使い方
まず、このActionsはPR作成時での利用を想定している為、pull_request_targetイベントを利用します。
あとはusesにagaroot-technologies/action-restrict-base-branchを指定し、Inputとしてrulesへブランチ名のパターンを記述する事で動作します。
name: Restrict base branch
on:
  pull_request_target:
    types: [opened, edited, synchronize]
jobs:
  restrict-base-branch:
    runs-on: ubuntu-latest
    steps:
      - uses: agaroot-technologies/action-restrict-base-branch@v1
        with:
          rules: |
            main <- development
            development <- feature/* bugfix/* refactor/* chore/* deps/*
            feature/* <- feature/**/*
これで、PR作成時にマージ先ブランチがパターンにマッチしない場合は、該当のStepでエラーが発生します。
rulesにはマージ先ブランチとマージ元ブランチのパターンを<-で区切り記述します。
右辺にはマージ元のブランチをスペース区切りで複数指定する事ができ、*を指定する事で、ワイルドカードを利用する事が出来ます。
また、改行する事で複数のルールを記述する事が出来ます。
上記の例では、下記のようなルールが設定されています。
- 
main <- development- 
mainブランチへのPRはdevelopmentブランチからのみ作成可能
 
- 
- 
development <- feature/* bugfix/* refactor/* chore/* deps/*- 
developmentブランチへのPRはfeature/*、bugfix/*、refactor/*、chore/*、deps/*ブランチからのみ作成可能
 
- 
- 
feature/* <- feature/**/*- 
feature/*ブランチへのPRはfeature/**/*ブランチからのみ作成可能
 
- 
PR作成時にブランチ名を元にラベルを自動的に付与するActions
PR作成時にブランチ名を元にラベルを自動的に付与するActionsです。
ブランチ名からPRの種類を判別し、ラベルを自動的に付与する事が出来るため、Git-flow等のブランチモデルを利用している場合に有用です。
使い方
まず、このActionsはPR作成時での利用を想定している為、pull_request_targetイベントを利用します。
あとはusesにagaroot-technologies/action-restrict-pr-labelを指定し、Inputとしてrulesへブランチ名のパターンを記述する事で動作します。
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]
これで、PR作成時にブランチ名を元にラベルを自動的に付与する事が出来ます。
rulesにはマージ先ブランチとマージ元ブランチのパターンを<-で区切り記述し、ラベル名を[]で囲んで指定します。
マージ元のブランチ名には*を指定する事で、ワイルドカードを利用する事が出来ます。
また、ラベル名はスペース区切りで複数指定する事が出来ます。
上記の例では、下記のようなルールが設定されています。
- 
main <- staging [release] [production]- 
stagingブランチからmainブランチへのPRはreleaseラベルとproductionラベルが付与される
 
- 
- 
staging <- development [release] [staging]- 
developmentブランチからstagingブランチへのPRはreleaseラベルとstagingラベルが付与される
 
- 
- 
development <- feature/* [feature]- 
feature/*ブランチからdevelopmentブランチへのPRはfeatureラベルが付与される
 
- 
- 
development <- bugfix/* [bugfix]- 
bugfix/*ブランチからdevelopmentブランチへのPRはbugfixラベルが付与される
 
- 
- 
development <- refactor/* [refactor]
 -refactor/*ブランチからdevelopmentブランチへのPRはrefactorラベルが付与される
- 
development <- chore/* [chore]- 
chore/*ブランチからdevelopmentブランチへのPRはchoreラベルが付与される
 
- 
- 
development <- deps/* [deps]- 
deps/*ブランチからdevelopmentブランチへのPRはdepsラベルが付与される
 
- 
まとめ
今回は、GitHub Actionsを利用して、PRの運用をよりスムーズにする為のActionsを紹介しました。
弊社では下記のように、1つのWorkflowに上記のActionsを組み合わせて利用しています。
name: Consistent Pull Request
on:
  pull_request_target:
    types: [opened, edited, synchronize]
jobs:
  consistent-pull-request:
    name: Consistent Pull Request
    runs-on: ubuntu-latest
    timeout-minutes: 5
    permissions:
      pull-requests: write
    steps:
      - name: Check pr label name
        uses: agaroot-technologies/action-restrict-pr-label@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          rules: |
            main <- feature/* [feature]
            main <- bugfix/* [bugfix]
            main <- refactor/* [refactor]
            main <- chore/* [chore]
            main <- deps/* [deps]
      - name: Check head branch name
        uses: agaroot-technologies/action-restrict-head-branch@v1
        with:
          rules: |
            feature/* bugfix/* refactor/* chore/* deps/*
      - name: Check base branch name
        uses: agaroot-technologies/action-restrict-base-branch@v1
        with:
          rules: |
            main <- feature/* bugfix/* refactor/* chore/* deps/*
PRへ適切にラベルを付ける事により、PRの種類を判別する事が容易に出来るようになります。
PRレビューの際等に、重宝しますので、是非ご利用ください。
長くなりましたが、最後までお読み頂きありがとうございました。




Discussion