如何在Azure Pipeline中实现先按路径再按标签筛选触发器
问题根因
你当前的配置不生效是所有主流CI/CD平台(Azure Pipelines、GitLab CI、GitHub Actions等)的通用规则:paths路径筛选规则默认仅作用于分支推送事件,标签推送事件会直接忽略paths字段的配置,所以只要你推送了符合规则的标签,不管对应路径有没有变更,都会触发流水线。
可行解决方案
方案1:通用前置校验方案(适配所有CI平台)
在流水线最开头添加一个仅需几秒运行的校验步骤,判断对应路径是否有变更,不符合条件直接终止整个流水线,是兼容性最高的方案:
- 首先调整代码拉取配置,设置拉取深度为0,拉取完整的git历史,保证可以正常比对历史提交
- 添加校验步骤,执行git命令判断对应路径的变更情况,示例脚本如下:
# 按版本号排序获取上一个符合test.*规则的标签 PREV_TAG=$(git tag -l "test.*" --sort=-v:refname | sed -n 2p) # 首次打符合规则的标签直接放行 if [ -z "$PREV_TAG" ]; then exit 0 fi # 比对当前标签对应提交和上一个同规则标签之间market目录的变更数 CHANGE_COUNT=$(git diff $PREV_TAG HEAD --name-only -- market/ | wc -l) if [ $CHANGE_COUNT -eq 0 ]; then echo "market目录无有效变更,终止流水线" # 不同平台终止流水线的命令可自行调整 # Azure DevOps 用:echo "##vso[task.complete result=Canceled;]无有效变更" # GitLab CI/GitHub Actions 直接 exit 1 终止即可 exit 1 fi
- 把该校验步骤设置为所有后续业务步骤的前置依赖,校验不通过时后续步骤不会运行。
方案2:特定平台原生配置方案
部分高版本CI平台已经支持标签事件的路径筛选,可以直接通过配置实现需求,不用额外加脚本:
如果使用的是15.7及以上版本的GitLab CI,可以替换原有trigger配置为如下规则:
workflow: rules: - if: $CI_COMMIT_TAG =~ /^test\..*/ changes: - market/**/* when: always - when: never
注意事项
- 若你需要对比的是本次打标签的提交和上次流水线运行的提交差异,而非上一个同规则标签的差异,可以调整脚本中比对的提交哈希为你需要的历史版本即可
- 轻量级标签和附注标签都适配上述方案,无需调整标签创建规则
内容的提问来源于stack exchange,提问作者Kazim Okan Akgül
相关产品推荐
相关产品推荐

