Azure DevOps YAML流水线:如何排除路径包含列表外的所有内容?
Azure DevOps YAML触发器路径规则问题解答
问题1:不在abc/def/*路径范围内的内容是否会被自动排除?
当前配置的触发器规则是:仅当main分支上的变更中至少有一个文件匹配abc/def/*路径时,才会触发流水线。
- 如果变更的文件全部不在
abc/def/*路径下:流水线不会被触发,这类变更相当于被“排除”了触发条件。 - 如果变更的文件同时包含该路径内和路径外的内容:流水线仍然会被触发,因为存在符合include规则的文件,路径外的变更不会阻止流水线启动。
简言之:路径外的变更不会单独触发流水线,但如果和路径内变更同时发生,还是会触发流水线。
问题2:如何实现“排除所有不在abc/def/*路径下的内容”(即仅当所有变更都在该路径下时才触发流水线)?
Azure DevOps的路径触发器本身不支持“所有变更文件必须匹配include规则”的逻辑,仅能通过“至少一个文件匹配include”来触发。要实现需求,可在流水线中添加前置检查步骤,验证所有变更文件是否都在目标路径下,若存在路径外的变更则终止流水线。
示例配置(添加检查步骤)
trigger: branches: include: - main paths: include: - abc/def/* steps: # PowerShell检查变更文件路径 - task: PowerShell@2 inputs: targetType: 'inline' script: | $changedFiles = git diff --name-only HEAD HEAD~1 foreach ($file in $changedFiles) { if (-not $file.StartsWith("abc/def/")) { Write-Error "检测到路径外的变更文件:$file" exit 1 } } displayName: '检查所有变更文件是否在abc/def/路径下' # 后续流水线步骤...
或者使用Bash脚本:
steps: - task: Bash@3 inputs: targetType: 'inline' script: | changed_files=$(git diff --name-only HEAD HEAD~1) for file in $changed_files; do if [[ ! $file == abc/def/* ]]; then echo "检测到路径外的变更文件:$file" exit 1 fi done displayName: '检查所有变更文件是否在abc/def/路径下'
内容的提问来源于stack exchange,提问作者mcool
相关产品推荐
相关产品推荐

