我有一个用YAML编写的Azure管道,只要对master
分支进行了更改,它就会从CI触发器运行。也可以从“拉取请求”或用户针对任何分支手动触发它。
由于使用了许多许可的组件,因此master
的构建需要在特定的代理上运行。其他版本则没有,实际上我希望它们在其他代理上运行。
所以我的问题是,是否有任何方法可以根据触发构建的原因或构建的分支来指定YAML管道中的其他代理/池?我希望这是在管道中永久配置的行为,而不是要求用户在他们希望在其他地方构建的每个分支上更新YAML。
在文档的关于pool / demands / condition关键字的部分中,看不到任何明显的内容。
答案 0 :(得分:2)
我通过以下方法解决了这个问题:将作业的steps
放入模板,然后在管道中使用不同的condition
条目创建一组作业,以便我们可以设置demands
根据这些条件。
骨架版本如下:
- stage: Build
jobs:
- job: TopicBranchAndPullRequestBuild
condition: or(startsWith(variables['Build.SourceBranch'], 'refs/heads/topic'), startsWith(variables['Build.SourceBranch'], 'refs/pull'))
displayName: 'Build topic Branch or Pull Request'
pool:
name: the-one-and-only-pool
demands:
- HasLicensedComponents -equals false
steps:
- template: build-template.yml
- job: MasterAndReleaseBranchBuild
condition: or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), startsWith(variables['Build.SourceBranch'], 'refs/heads/release'))
displayName: 'Build master or release Branch'
pool:
name: the-one-and-only-pool
demands:
- HasLicensedComponents -equals true
steps:
- template: build-template.yml
很显然,此处给出的值仅是示例,但否则,这就是我的工作。
答案 1 :(得分:1)
您可以尝试使用表达式吗?我在变量组上成功使用了它,因此它可能适用于代理程序池。
- ${{ if eq(variables['build.SourceBranchName'], 'prod') }}:
- pool: Host1
- ${{ if eq(variables['build.SourceBranchName'], 'staging') }}:
- pool: Host2
- ${{ if not(and(eq(variables['build.SourceBranchName'], 'staging'), eq(variables['build.SourceBranchName'], 'prod'))) }}:
- pool: Host3
在此处动态获取变量组的原始解决方法的信用:https://github.com/MicrosoftDocs/vsts-docs/issues/3702#issuecomment-574278829
答案 2 :(得分:0)