You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置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

注意事项

  1. 分支适配:如果项目的基准分支不是main,需将脚本中的origin/main替换为实际分支名(如origin/dev)。
  2. 目录层级调整:若后续目录结构变更,需修改awk -F'/' '{print $5}'中的字段序号,确保提取的是成员负责的子目录(如folder1-1)。
  3. 权限配置:确保CI runner有足够权限拉取代码并执行脚本。

内容的提问来源于stack exchange,提问作者VeceluXa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 07:41:35