ブランチ名をもとに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