Azure Devops多阶段管道环境名称设置不正确

时间:2020-05-20 02:38:54

标签: azure azure-devops azure-pipelines

我正在建立一个多阶段的管道,并且我使用了许多模板,因为每种环境的部署作业,任务和阶段具有很多共享的逻辑。因此,在此阶段,我要设置一个environmentName变量,然后在每个作业中使用该变量:

  - stage: StageReleaseProd
    displayName: Stage Release (Prod)
    variables:
      environmentName: 'prod'
    jobs:
      - deployment: DeployWebApp
        displayName: Deploy Wep App
        pool:
          vmImage: $(vmImage)
        environment: $(environmentName)
        strategy:
          runOnce:
            deploy:
              steps:
                - template: config/pipelines/templates/_deploy.task.yml
                  parameters:
                    environmentName: $(environmentName)

通常,这确实很好。我可以在ADO UI中看到所有环境,并且可以在阶段之间添加批准检查。但是我也经常遇到这个问题:

enter image description here

有时变量不会被插值。感觉这种情况发生在50%的时间,但是我也无法推断出原因。现在,我的解决方法是在不使用参数的情况下对环境变量进行硬编码,但这严重限制了我如何对所有管道进行模板化。

1 个答案:

答案 0 :(得分:0)

问题在于何时填充作业名称。在多阶段ADO管道中,如果变量是在作业或阶段名称中使用的,则在compile time vs run time.处使用该变量。尝试像${( variables.envronmentName })那样引用变量

以下是引用变量的不同方式及其含义: enter image description here

调用变量的另一件事是,在多级管道中要跟踪它们有些棘手,它具有将变量存储在ADO变量组中的能力。根据解决方案的结构,这实际上可以为您简化事情。

如果您确实希望将其设置为变量,则另一个选择是define a variable template。这可以通过创建类似于以下内容的单独的yaml文件来完成:

variables:
  environmentNameDEV: dev

然后在您的azure-pipelines-yml文件中引用此模板,例如:

variables:
- template: variables.yml

最后,在创建阶段名称时:

- stage: ${{ variables.environmentNameDEV }}

缺点是每个环境的单独变量名称。好处是,如果所有存储库都使用相同的变量模板,则可以确保所有命名标准之间的一致性。