模板表达式 x 'dependsOn' 或 'condition'

问题描述 投票:0回答:2

正如你们中的一些人所知,在 Azure Pipelines 中,我们可以在作业和阶段上包含“dependsOn”子句以及“condition”,以便我们可以根据运行中的某些值或变量动态运行阶段和作业管道。

但是我们也可以设置模板表达式来完成几乎相同的事情。

这是一个使用模板表达式设置舞台的示例。

stages:
- ${{ if eq(variables['Build.SourceBranchName'], 'development') }}:
      - stage: Deploy
        dependsOn: Build
        displayName: "Deploying to development environment."
        jobs:
          - deployment:
            environment: MyEnvironment
            strategy:
              runOnce:
                deploy:
                  steps:
                    - task: AzureRmWebAppDeployment@4
                      inputs:
                        ConnectionType: "AzureRM"
                        azureSubscription: "MySubscription"
                        appType: webAppContainer
                        WebAppName: $(environmentName)
                        DockerNamespace: $(ContainerRegistry)
                        DockerRepository: appRepo
                        DockerImageTag: development-$(Build.BuildId)

这是在某种条件下运行的阶段的示例:

- stage: DeployHomolog
    dependsOn: Build
    condition: and(succeeded(), eq(variables['Build.SourceBranchName'], 'dev'))
    displayName: "Deploying to Homolog Environment"
    jobs:
      - deployment:
        environment: MyEnvironment
        strategy:
          runOnce:
            deploy:
              steps:
                - task: AzureRmWebAppDeployment@4
                  inputs:
                    ConnectionType: "AzureRM"
                    azureSubscription: "MySubscription"
                    appType: webAppContainer
                    WebAppName: WebApp
                    DockerNamespace: $(acr)
                    DockerRepository: appRepo
                    DockerImageTag: dev-$(Build.BuildId)

问题是:它们各自的优点和缺点是什么?您更喜欢在管道上使用其中哪一个?

azure-devops yaml azure-pipelines azure-pipelines-yaml
2个回答
0
投票

@加布里埃尔·安东尼奥

这取决于使用案例和复杂性,如果上面是单个管道文件(azure-pipeline.yml)实现,则可以直接使用。

在更复杂的实现中,使用模块化模板(让管道调用不同的模板化管道),模板表达式可以帮助构建动态、可重用且灵活的模板。

查看 TheYAMLPipelineOne


0
投票

模板表达式和条件之间有一个重要的区别:

  • 模板表达式在管道运行之前的编译时进行处理
  • 运行时评估条件以确定是否启动阶段、作业或步骤

考虑到这一点,这并不总是一个偏好问题 - 一些例子:

  • 您必须在条件下使用作业状态函数,因为在编译时绝对无法知道作业是否失败。
  • 变量
    Build.SourceBranchName
    在模板中可用,但 变量
    Build.TriggeredBy.DefinitionName
    不是,所以你必须使用 它在条件下(请参阅文档中的“在模板中可用?”栏)
  • 当您使用task.setvariable添加变量时您只能在条件下使用它

关于可以同时使用两者的场景,我个人更喜欢模板表达式。当我运行构建时,我不希望看到一堆跳过的阶段/作业/步骤。

© www.soinside.com 2019 - 2024. All rights reserved.