Azure Pipeline如何组合触发器筛选器?CD触发路径排除失效问题
解决Azure DevOps CD管道资源触发器忽略路径排除的问题
问题原因
你当前配置里的根级trigger块,是针对代码提交直接触发CD管道的规则,而通过CI管道作为资源触发CD时,这个路径排除规则不会生效——CD管道只会响应CI管道的完成事件,不会去检查原始代码的变更路径。
实现预期需求的方法
方法1:CI传递变更状态,CD加条件判断
在CI管道中添加变更检查任务:
在CI管道里新增一个Bash/PowerShell任务,用来判断本次提交的变更是否涉及排除路径外的文件。示例Bash脚本如下:CHANGED_FILES=$(git diff --name-only $(Build.PreviousSuccessfulCommit) $(Build.SourceVersion)) if echo "$CHANGED_FILES" | grep -v "^src/Customer.Worker.Converter/" | grep -q .; then echo "##vso[task.setvariable variable=hasNonExcludedChanges;isOutput=true]true" else echo "##vso[task.setvariable variable=hasNonExcludedChanges;isOutput=true]false" fi给这个任务设置一个引用名称(比如
CheckChanges),方便CD管道引用输出变量。CD管道添加执行条件:
在CD管道的stages里,给需要控制的阶段添加条件,只有当CI输出的hasNonExcludedChanges为true时才执行:stages: - stage: Deploy condition: eq(dependencies.customer-ci.outputs['<CI_Stage_Name>.CheckChanges.hasNonExcludedChanges'], 'true') jobs: ...替换
<CI_Stage_Name>为CI管道中包含上述检查任务的阶段名称。
方法2:在CI管道中控制是否触发CD
在CI管道里设置阶段过滤,只有当变更不在排除路径时,才运行生成工件并触发CD的流程:
# CI管道示例配置 trigger: branches: include: - main stages: - stage: BuildNonExcluded condition: not(pathsMatch('**/src/Customer.Worker.Converter/*', variables['Build.SourcesDirectory'])) jobs: - job: Build steps: - script: echo "构建并生成工件" - publish: $(Build.ArtifactStagingDirectory) artifact: drop - stage: BuildExcluded condition: pathsMatch('**/src/Customer.Worker.Converter/*', variables['Build.SourcesDirectory']) jobs: - job: SkipDeploy steps: - script: echo "仅变更排除路径,跳过CD触发"
这样只有BuildNonExcluded阶段运行时,才会生成工件并触发CD管道;如果是排除路径的变更,只会运行BuildExcluded阶段,不会触发CD。
结论
通过管道资源可以实现预期需求,但不能直接用CD管道根级的trigger.paths规则,必须借助CI管道传递变更状态,或者在CI中控制是否触发CD的流程。
内容的提问来源于stack exchange,提问作者zupp
相关产品推荐
相关产品推荐

