在阶段使用不同模板的多阶段管道基于分支的条件构建

时间:2020-06-05 19:25:57

标签: azure-devops azure-pipelines azure-yaml-pipelines

如何通过分支触发以在“阶段”下使用特定模板?

触发:

 branches

   include:

     - ci

     - prod

阶段:

  • 模板:ci.yml

    condition:and(eq(['build.sourceBranch'],'ci'))

  • 模板:prod.yml

    condition:and(eq(['build.sourceBranch'],'prod'))

尝试了以上条件,但无济于事。我遇到了“意外的价值状况”。感谢您的帮助

*****通过将条件作为参数传递给模板尝试了一种解决方案:

阶段:

  • 模板:ci.yml

    参数:

    condition:and(succeeded(),eq(variables ['Build.SourceBranch'],'refs / heads / ci'))

  • 模板:prod.yml

    参数:

    condition:and(succeeded(),eq(variables ['Build.SourceBranch'],'refs / heads / prod'))

获取“意外的参数条件”

管道结构:

master.yml(包含运行时参数) 阶段:

模板:ci.yml

参数:

条件:and(succeeded(),eq(variables ['Build.SourceBranch'],'refs / heads / ci'))

模板:prod.yml

参数:

条件:and(succeeded(),eq(variables ['Build.SourceBranch'],'refs / heads / prod'))

ci.yml

阶段:

  • 阶段:BuildApp

  • 阶段:BuildWeb

  • 阶段:DeployLocal

prod.yml

阶段:

  • 阶段:BuildApp

  • 阶段:BuildWeb

  • 阶段:DeployProd

1 个答案:

答案 0 :(得分:1)

如何通过分支触发以在“阶段”下使用特定模板?

要解决此问题,我们可以在作业级别添加条件,例如:

stages:
- stage: Test1
  jobs:
  - job: ci
    displayName: ci
    pool:
      name: MyPrivateAgent
    condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/ci'))
    steps:
        - template: ci.yml

  - job: prod
    displayName: prod
    pool:
      name: MyPrivateAgent
    condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/prod'))
    steps:
        - template: prod.yml

查看文档Specify conditions,了解更多详细信息。

另一方面,我们也可以将条件设​​置为模板yml的参数,例如:

- template: ci.yml
  parameters:
    doTheThing: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/ci'))

模板yml文件:

# template.yml
parameters:
  doTheThing: 'false'
steps:
- script: echo This always happens!
  displayName: Always
- script: echo Sometimes this happens!
  condition: ${{ parameters.doTheThing }}
  displayName: Only if true

您可以检查线程YAML - Support conditions for templates以获得更多详细信息。

希望这会有所帮助。