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

GitHub Workflow:获取触发Pull Request的路径并执行对应扫描

单体仓库中按PR变更路径触发对应文件夹扫描的实现方案

针对单体仓库中多项目分文件夹维护的场景,要实现PR中某文件夹代码变更时自动扫描该文件夹,你可以参考以下优化后的GitHub Actions工作流配置,解决原脚本中路径匹配逻辑的问题:

优化后的工作流代码

name: 项目代码扫描

on:
  pull_request:
    paths:
      - 'path/to/folder/**'
      - 'path/to/anotherfolder/**'

jobs:
  scan-target-folder:
    runs-on: ubuntu-latest
    steps:
      - name: 拉取代码
        uses: actions/checkout@v4
        with:
          fetch-depth: 0 # 需要拉取完整历史来对比变更文件

      - name: 识别触发扫描的目标文件夹
        id: detect-folder
        run: |
          # 定义监控的文件夹列表(和触发器paths保持一致)
          MONITORED_FOLDERS=("path/to/folder" "path/to/anotherfolder")
          
          # 获取PR中变更的所有文件,过滤出存在的文件
          CHANGED_FILES=$(git diff --name-only origin/${{ github.base_ref }}...origin/${{ github.head_ref }})
          
          # 遍历监控文件夹,找到第一个包含变更文件的文件夹
          for FOLDER in "${MONITORED_FOLDERS[@]}"; do
            if echo "$CHANGED_FILES" | grep -q "^$FOLDER/"; then
              echo "::set-output name=target_folder::$FOLDER"
              break
            fi
          done

      - name: 执行目标文件夹扫描
        if: steps.detect-folder.outputs.target_folder != ''
        run: |
          echo "开始扫描文件夹: ${{ steps.detect-folder.outputs.target_folder }}"
          # 这里替换成你的扫描命令,比如:
          # scan-command --path ${{ steps.detect-folder.outputs.target_folder }}

关键说明

  • 触发器路径使用**而非*:*仅匹配文件夹下的直接文件,**会匹配文件夹下所有层级的文件和子文件夹,确保任意层级变更都能触发。
  • 拉取完整代码历史:设置fetch-depth: 0才能通过git diff获取PR的完整变更文件列表,避免因为浅克隆导致对比失败。
  • 准确匹配变更文件夹:通过git diff拿到实际变更的文件,再匹配到对应的监控文件夹,相比原脚本中错误使用github.event.pull_request.paths和changed_files的逻辑,这个方式更准确可靠。
  • 条件执行扫描:只有识别到目标文件夹时才执行扫描步骤,避免无意义的执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 16:55:33