Azure YAML Pipelne是否在触发器的路径筛选器中支持通配符?

问题描述

我在git存储库中具有以下项目(文件夹)结构:

/src
/src/Sample.Backend.Common
/src/Sample.Backend.Common.Tests
/src/Sample.Backend.Common.Domain
/src/Sample.Backend.Common.Domain.Tests
/src/Sample.Backend.Pricing.Abstractions
/src/Sample.Backend.Pricing.Domain
/src/Sample.Backend.Pricing.Domain.Tests
/src/Sample.Backend.Pricing.Persistence
/src/Sample.Backend.Pricing.Persistence.Tests
/src/Sample.Backend.Accounting.Abstractions
/src/Sample.Backend.Accounting.Domain
/src/Sample.Backend.Accounting.Domain.Tests
/src/Sample.Backend.Accounting.Persistence
/src/Sample.Backend.Accounting.Persistence.Tests
/src/Sample.Backend.Api
/src/Sample.Common
/src/Sample.Frontend.Common
/src/Sample.Frontend.Web
/src/Sample.Tests.Common

(此示例已简化,实际上有更多的项目/文件夹。)

我想要不同部分的不同管道。例如,只要在任何后端项目的master分支中提交了任何文件,就会触发管道。像这样:

trigger:
  branches:
    include:
    - master
  paths:
    include:
    - src/Sample.Backend.*
    - src/Sample.Common
    - src/Sample.Tests.Common

问题是,过滤器src/Sample.Backend.*无法正常工作。我必须添加每个后端文件夹的确切名称才能使其正常工作。我可以使用exclude,但是我遇到了同样的问题-还有许多其他项目,因此我必须全部命名。

我发现不支持通配符:https://github.com/MicrosoftDocs/azure-devops-docs/issues/397#issuecomment-422958966

还有其他方法可以达到相同的结果吗?

解决方法

否,目前尚不可能。您甚至有功能请求here,我建议对其进行投票。 (我已经做到了)上面提到的主题中的Rick分享了他如何解决此问题的想法:

我目前通过拥有3个文件来实现这一目标:

它工作得很好,但是很不幸,需要经历这些循环。

但是它需要额外的工作。

,

Azure YAML Pipelne是否在触发器的路径筛选器中支持通配符?

这是我们主要产品论坛上的已知请求:

Support wildcards (*) in Trigger > Path Filters

此功能尚未实现,您可以添加评论并对该用户语音进行投票。

作为解决方法,对于我们,我们添加了一个内联powershell任务作为 first 任务来执行git命令行git diff HEAD HEAD~ --name-only,获取修改后的文件名并进行过滤最后提交的文件名,并使用Logging Command设置变量,然后在构建管道的下一步中在自定义条件中引用这些变量:

and(succeeded(),eq(variables['CustomVar'],'True'))

我们的嵌入式Powershell脚本:

cd $(System.DefaultWorkingDirectory)

$editedFiles = git diff HEAD HEAD~ --name-only

echo "$($editedFiles.Length) files modified:"

$editedFiles | ForEach-Object {
   echo $_
    Switch -Wildcard ($_ ) {
        'XXXX/Src/Sample.Backend.*' { 
              Write-Host ("##vso[task.setvariable variable=CustomVar]True")
         }        
        'XXXX/Src/Sample.Common*' { 
              Write-Host ("##vso[task.setvariable variable=CustomVar]True")}
        'XXXX/Src/Sample.Tests.Common' { 
              Write-Host ("##vso[task.setvariable variable=CustomVar]True")}

    }
}

然后为所有剩余任务添加条件:

enter image description here

在这种情况下,如果更改文件不符合我们的过滤条件,则会跳过所有剩余的任务。