我目前有一个monorepo,子目录中有服务,我倾向于将其转变为带有元存储库的多存储库。
我决定给予Azure DevOps的原因之一是有人告诉我,您可以在子目录上设置触发器,例如:
trigger:
branches:
include:
- master
paths:
include:
- client
测试和它的工作。
然而,我想知道的是,是否有可能有多个独立的触发器,或者这需要一个polyrepo或多个.yml
?原因是如果只有client
服务中的更改,则它只会触发该测试、构建和部署集,而不会触发api
服务运行测试、构建和部署。
例如:
trigger:
branches:
include:
- master
paths:
include:
- client
stages:
...
Run tests
If tests pass, build and push to ACR
Deploy to AKS
...
trigger:
branches:
include:
- master
paths:
include:
- api
stages:
...
Run tests
If tests pass, build and push to ACR
Deploy to AKS
...
这样,一个应用程序中的更改不会导致整个应用程序被重新构建,而只是更改了什么。
然而,这是否需要多个.yml
文件(甚至不确定是否可以识别除azure-pipelines.yml
之外的任何文件),这是否需要polyrepo,或者这在我没有看到的单个azure-pipelines.yml
中是可行的?
3条答案
按热度按时间ijxebb2r1#
如果我对您的请求理解正确的话,您可以在一个azure-pipeline. yml中实现这一点。请检查下面的示例yml。
在上面的YML中,我有三份工作。在第一个作业getchangepath中,我在PowerShell任务中调用git get changes Rest API,以获取触发构建的更改路径。如果路径包含路径
/client
或/api
,它也会输出变量。作业client和作业API依赖于作业getchangepath,将以作业getchangepath中的输出变量为条件执行。
假设我在文件夹客户端中更改了一个文件,并将更改提交到Azure Repo。然后作业getchangepath完成后。
MyVariable.Client
将被设置为true。然后Jobclient将评估其条件并开始。作业API条件将为false,并被跳过。0pizxfdo2#
我最近遇到了这个问题。您不需要硬编码和访问上述解决方案中的DevOps API和PowerShell代码。
下面是一个更简单的解决方案,使用开箱即用YAML和
workingDirectory
属性,根据官方Azure DevOps文档。设置一个类似于下面的项目结构,每个存储库都有自己的YAML文件:
您可能不需要根管道,但如果需要,您将希望忽略子项目:
而在子项目中,你希望他们关注自己:
警告-工作目录!
您的子项目管道仍在以根目录作为工作目录运行。您可以使用
workingDirectory
键来更改它,例如(使用变量来避免重复):如果您的项目共享步骤,则应该使用Pipeline Templates (in another repository) per official docs。
t40tm48m3#
如果你用上面的方法得到203响应,你可以试试这个方法
我在Powershell上运行了这个,它工作得很好。