配置GitHub Action:仅单个子文件夹变更时允许Pull Request通过
实现单成员目录专属的Pull Request校验
针对你的Java项目目录结构,要实现仅单个成员负责的子目录(如folder1-1、folder2-1)发生变更时,Pull Request才能通过的需求,最直接的方案是通过CI脚本自动校验PR的变更范围,具体实现如下:
核心思路
通过脚本提取PR中所有变更文件所属的成员负责目录,去重后判断数量是否大于1——如果跨多个目录则直接阻止PR合并,反之则允许通过。
具体脚本实现
以下是可直接在CI中运行的bash脚本,适配你的目录结构:
# 获取PR中变更的文件(排除已删除文件) CHANGED_FILES=$(git diff --name-only --diff-filter=ACMRT origin/main...HEAD) # 无变更文件时直接通过 if [ -z "$CHANGED_FILES" ]; then echo "无变更文件,校验通过" exit 0 fi # 提取每个变更文件对应的成员负责目录(如folder1-1、folder2-1) TARGET_DIRS=$(echo "$CHANGED_FILES" | awk -F'/' '{print $5}' | sort | uniq) # 统计去重后的目录数量 DIR_COUNT=$(echo "$TARGET_DIRS" | wc -l) # 判断是否跨目录修改 if [ "$DIR_COUNT" -gt 1 ]; then echo "❌ PR包含多个成员负责目录的修改,禁止合并:" echo "$TARGET_DIRS" exit 1 else echo "✅ 校验通过:仅修改了目录 $TARGET_DIRS" exit 0 fi
集成到CI流程
GitHub Actions示例
在项目根目录创建.github/workflows/pr-single-dir-check.yml文件,内容如下:
name: PR单目录校验 on: [pull_request] jobs: check-dir-scope: runs-on: ubuntu-latest steps: - name: 拉取完整代码 uses: actions/checkout@v4 with: fetch-depth: 0 # 需拉取完整历史才能对比分支差异 - name: 执行单目录校验 run: | CHANGED_FILES=$(git diff --name-only --diff-filter=ACMRT origin/main...HEAD) if [ -z "$CHANGED_FILES" ]; then echo "无变更文件,校验通过" exit 0 fi TARGET_DIRS=$(echo "$CHANGED_FILES" | awk -F'/' '{print $5}' | sort | uniq) DIR_COUNT=$(echo "$TARGET_DIRS" | wc -l) if [ "$DIR_COUNT" -gt 1 ]; then echo "❌ PR包含多个成员负责目录的修改,禁止合并:" echo "$TARGET_DIRS" exit 1 else echo "✅ 校验通过:仅修改了目录 $TARGET_DIRS" exit 0 fi
GitLab CI示例
在项目根目录创建.gitlab-ci.yml文件,添加如下job:
pr_single_dir_check: stage: test only: - merge_requests script: - | CHANGED_FILES=$(git diff --name-only --diff-filter=ACMRT origin/main...HEAD) if [ -z "$CHANGED_FILES" ]; then echo "无变更文件,校验通过" exit 0 fi TARGET_DIRS=$(echo "$CHANGED_FILES" | awk -F'/' '{print $5}' | sort | uniq) DIR_COUNT=$(echo "$TARGET_DIRS" | wc -l) if [ "$DIR_COUNT" -gt 1 ]; then echo "❌ PR包含多个成员负责目录的修改,禁止合并:" echo "$TARGET_DIRS" exit 1 else echo "✅ 校验通过:仅修改了目录 $TARGET_DIRS" exit 0 fi
注意事项
- 分支适配:如果项目的基准分支不是
main,需将脚本中的origin/main替换为实际分支名(如origin/dev)。 - 目录层级调整:若后续目录结构变更,需修改
awk -F'/' '{print $5}'中的字段序号,确保提取的是成员负责的子目录(如folder1-1)。 - 权限配置:确保CI runner有足够权限拉取代码并执行脚本。
内容的提问来源于stack exchange,提问作者VeceluXa
相关产品推荐
相关产品推荐

