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
相关产品推荐
相关产品推荐

