基于触发器

时间:2020-02-11 16:01:56

标签: azure-devops azure-pipelines

我有一个用YAML编写的Azure管道,只要对master分支进行了更改,它就会从CI触发器运行。也可以从“拉取请求”或用户针对任何分支手动触发它。

由于使用了许多许可的组件,因此master的构建需要在特定的代理上运行。其他版本则没有,实际上我希望它们在其他代理上运行。

所以我的问题是,是否有任何方法可以根据触发构建的原因或构建的分支来指定YAML管道中的其他代理/池?我希望这是在管道中永久配置的行为,而不是要求用户在他们希望在其他地方构建的每个分支上更新YAML。

在文档的关于pool / demands / condition关键字的部分中,看不到任何明显的内容。

3 个答案:

答案 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)

pool关键字指定用于管道的作业的池。池规范还包含有关作业的运行策略的信息。您可以在管道,阶段或作业级别指定池。在层次结构最低级别指定的池用于运行作业。

是否可以在YAML中指定其他代理/池 根据触发构建或构建的分支的管道 在建造吗?

对于此问题,您可以为不同的分支创建不同的Yaml文件,在相应的yaml文件中指定不同的代理程序池。

您可以使用以下所示的选项切换到管道中不同分支的yaml文件:

enter image description here