3

我在 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

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

4

4 回答 4

4

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

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

在 Trigger > Path Filters 中支持通配符 (*)

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

作为我们的解决方法,我们添加一个 Inline powershell 任务作为执行 git 命令行的第一个git diff HEAD HEAD~ --name-only任务,获取修改后的文件名并过滤最新提交中的文件名,并使用Logging 命令设置变量,然后在自定义条件中引用在构建管道的后续步骤中:

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")}

    }
}

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

在此处输入图像描述

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

于 2020-09-09T08:16:27.583 回答
3

更新:2021 年 9 月 9 日

现在这是可能的,因为它写在这里

在管道 YAML 文件中为 CI 或 PR 触发器指定包含和排除分支时,可以使用通配符。但是,在指定路径过滤器时不能使用它们。例如,您不能包含与 src/app/ /myapp* 匹配的所有路径。一些客户已指出这是不便之处。本次更新填补了这一空白。现在,您可以在指定路径过滤器时使用通配符(、 * 或 ?)。

注意:文档似乎还没有更新。

老答案:

不,目前这是不可能的。您甚至在这里有功能请求,我建议您对其进行投票。(我已经这样做了)上述主题中的 Rick 分享了他如何克服这个问题的想法:

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

它工作得很好,但不幸的是需要通过这些循环。

但它需要额外的工作。

于 2020-09-08T23:32:23.150 回答
1

根据最新的发行说明,此功能将在未来两到三周内推出

于 2021-09-17T12:30:22.853 回答
1

对此进行更新。

花了几个星期,但 pavlo 在上面的评论中提到的更改终于推出,并且 YAML 现在支持路径触发器。

于 2021-11-03T21:28:52.057 回答