问题描述
我在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-pipelines.yml(每次提交都会调用一些python)
azure-pipelines.py (This checks for changed folders and has some parameters to ignore certain folders,then calls the API directly)
azure-pipelines-trigger.yml(这是python根据更改后的文件夹调用的)
它工作得很好,但是很不幸,需要经历这些循环。
但是它需要额外的工作。
,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")}
}
}
然后为所有剩余任务添加条件:
在这种情况下,如果更改文件不符合我们的过滤条件,则会跳过所有剩余的任务。