如何通过GitHub Actions实现分支命名规范校验与PR合并分支限制
如何通过GitHub Actions实现分支命名规范校验与PR合并分支限制
我之前也碰到过类似的分支管理需求,现有的通用分支命名Action确实没法区分不同基准分支的规则,不过咱们可以通过自定义GitHub Actions工作流,结合简单的脚本逻辑就能把三个规则都实现了。下面我给你拆解具体的实现步骤:
核心思路
我们需要在PR创建或更新时,获取两个关键信息:当前PR的源分支名和目标基准分支名,然后通过脚本判断这两个信息是否符合咱们的规则:
- 若基准分支是
dev,源分支必须匹配^(bug|feature|code-cleanup)\/JIRA-\d+-.+$ - 若基准分支是
qa,源分支必须匹配^kickback\/JIRA-\d+-.+$ - 若源分支以
kickback/开头,基准分支只能是qa
完整的工作流实现
在你的仓库里新建.github/workflows/branch-validation.yml文件,内容如下:
name: 分支与PR规则校验 on: pull_request: types: [opened, synchronize, reopened] jobs: validate-branch-rules: runs-on: ubuntu-latest steps: - name: 获取PR分支信息 id: pr-info run: | echo "BASE_BRANCH=${{ github.event.pull_request.base.ref }}" >> $GITHUB_OUTPUT echo "HEAD_BRANCH=${{ github.event.pull_request.head.ref }}" >> $GITHUB_OUTPUT - name: 执行规则校验 run: | BASE_BRANCH="${{ steps.pr-info.outputs.BASE_BRANCH }}" HEAD_BRANCH="${{ steps.pr-info.outputs.HEAD_BRANCH }}" # 定义正则规则 DEV_BRANCH_REGEX="^(bug|feature|code-cleanup)\/JIRA-\d+-.+$" QA_BRANCH_REGEX="^kickback\/JIRA-\d+-.+$" # 规则1和规则2:分支命名与基准分支匹配校验 if [ "$BASE_BRANCH" = "dev" ]; then if ! [[ "$HEAD_BRANCH" =~ $DEV_BRANCH_REGEX ]]; then echo "❌ 错误:基于dev分支的分支必须匹配格式:bug/JIRA-XXX-xxx 或 feature/JIRA-XXX-xxx 或 code-cleanup/JIRA-XXX-xxx" exit 1 fi elif [ "$BASE_BRANCH" = "qa" ]; then if ! [[ "$HEAD_BRANCH" =~ $QA_BRANCH_REGEX ]]; then echo "❌ 错误:基于qa分支的分支必须匹配格式:kickback/JIRA-XXX-xxx" exit 1 fi fi # 规则3:kickback分支只能PR到qa if [[ "$HEAD_BRANCH" =~ ^kickback\/ ]]; then if [ "$BASE_BRANCH" != "qa" ]; then echo "❌ 错误:kickback/开头的分支只能合并到qa分支" exit 1 fi fi echo "✅ 所有分支与PR规则校验通过!"
工作流说明
- 触发时机:当PR被创建、同步(更新)或重新打开时,自动触发校验,确保每次PR变更都符合规则
- 信息获取:通过GitHub上下文
github.event.pull_request拿到基准分支和源分支的名称,存入输出变量方便后续步骤使用 - 规则校验:
- 先根据基准分支判断对应的命名规则,不匹配则直接报错终止工作流
- 额外检查
kickback/开头的分支,确保它们只能PR到qa分支
- 结果反馈:校验不通过时会输出清晰的错误提示,通过则显示成功信息
使用注意事项
- 确保仓库的GitHub Actions权限开启(在仓库Settings -> Actions -> General里设置)
- 可以根据自己的需求调整正则规则或分支名称,比如如果你的JIRA前缀不是
JIRA-,直接修改正则里的部分即可 - 如果需要支持更多基准分支的规则,只需要在脚本里添加对应的
elif分支即可
这样设置后,不符合规则的PR会被工作流拦截,必须修正分支名或调整PR目标分支才能合并,完美满足你的三个需求!
备注:内容来源于stack exchange,提问作者Chris Barr
相关产品推荐
相关产品推荐

