9阅网

您现在的位置是:首页 > 知识 > 正文

知识

azure - Azure Devops多级管道环境名称设置不当

admin2022-11-07知识19

我正在构建一个多阶段的管道,我使用了很多模板,因为每个环境的部署作业、任务和阶段有很多共享逻辑。所以在阶段上我设置了一个 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%的时间都会发生这种情况,但我也无法推断出一个模式来解释为什么。目前我的变通办法是硬编码环境变量而不使用参数,但这严重限制了我如何将我们所有的管道模板化。



【回答】:

问题在于什么时候填充作业名。在多阶段的ADO管道中,如果变量被用于作业或阶段名,它就会在 编译时与运行时。 试着引用你的变量,比如 ${( variables.envronmentName })

下面是引用变量的不同方式以及这样做的意义。enter image description here

另一件事是关于变量的,因为在多级管道中,它们是一个有点棘手的跟踪,是有能力存储变量在一个ADO变量组。根据解决方案的结构,这实际上可能会为你简化事情。

如果你真的想把它变成一个变量,另一个选择是 定义一个可变模板. 这将通过创建一个独立的yaml文件来完成,类似于。

variables:
  environmentNameDEV: dev

然后在你的 azure-pipelines-yml 文件中引用这个模板,比如:

variables:
- template: variables.yml

最后,当创建你的阶段名称,

- stage: ${{ variables.environmentNameDEV }}

缺点是每个环境都有一个单独的变量名。上风是如果所有的仓库都使用相同的变量模板可以确保所有东西的命名标准的一致性。