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

如何在GitLab CI中获取代码变更所在的目录路径?

获取GitLab MR中变更目录并定向扫描的方案

GitLab没有直接提供变更目录的内置变量,但可以通过git命令在流水线中动态获取,以下是具体实现方法:

核心思路

在流水线脚本中,对比当前MR分支与目标分支的差异,提取变更文件所在的目录,将其赋值给$SCAN_PATH后传入扫描命令。

修改后的.gitlab-ci.yml配置

stage1:
  stage: stage-name
  script:  
    # 拉取目标分支完整代码,确保能对比分支差异
    - git fetch origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME
    # 获取变更文件列表,提取目录并去重,用空格分隔适配多路径参数
    - SCAN_PATH=$(git diff --name-only origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME...HEAD | xargs -I {} dirname {} | sort -u | tr '\n' ' ')
    # 兜底处理无变更的极端情况(虽有changes规则过滤,仍做兼容)
    - if [ -z "$SCAN_PATH" ]; then SCAN_PATH="/example-path"; fi
    # 执行定向扫描
    - scan --path "$SCAN_PATH"
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
  changes:
    - /example-path/**/* 
  allow_failure: true

关键命令说明

  • git fetch origin $CI_MERGE_REQUEST_TARGET_BRANCH_NAME:拉取MR目标分支的完整代码,保证分支差异对比的准确性。
  • git diff --name-only origin/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME...HEAD:列出当前分支相对目标分支的所有变更文件。
  • xargs -I {} dirname {}:提取每个变更文件的所在目录。
  • sort -u:对目录去重,避免重复扫描同一目录。
  • tr '\n' ' ':将换行符替换为空格,把多个目录拼接成扫描工具可识别的参数格式。

适配调整

如果你的扫描工具要求多路径用逗号分隔,可将tr '\n' ' '改为tr '\n' ','。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 11:56:02