【问题标题】:Azure Devops multi-stage pipeline environment name not set properlyAzure Devops 多阶段管道环境名称设置不正确
【发布时间】:2020-09-06 06:59:33
【问题描述】:

我正在构建一个多阶段管道,并且我使用了很多模板,因为每个环境的部署作业、任务和阶段都有很多共享逻辑。所以在舞台上我设置了一个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 中查看所有环境,并且可以在阶段之间添加批准检查。但我也经常碰到这个:

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

【问题讨论】:

    标签: azure azure-devops azure-pipelines


    【解决方案1】:

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

    以下是引用变量的不同方法以及这样做的含义:

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

    如果你真的想把它变成一个变量,另一个选择是define a variable template。这可以通过创建一个单独的 yaml 文件来完成,类似于:

    variables:
      environmentNameDEV: dev
    

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

    variables:
    - template: variables.yml
    

    最后在创建你的艺名时:

    - stage: ${{ variables.environmentNameDEV }}
    

    缺点是每个环境都有一个单独的变量名。好处是,如果所有 repos 使用相同的变量模板,可以确保所有内容与命名标准的一致性。

    【讨论】:

    • 我无法让它工作。相反,我不得不将与部署相关的所有阶段移动到模板中。然后在管道中,我会将硬编码的环境名称(例如:“dev”)传递给模板,在模板中我可以使用${( parameters.envronmentName }) 语法。但是在顶级管道中,无论我如何尝试对变量进行插值,它要么根本不起作用,要么在 50% 的时间内起作用,感觉就像一个错误。
    • @AndrewCraswell 检查我给出的更新答案作为另一个选项,它比硬编码略好,但仍然有它的缺点。
    猜你喜欢
    • 2020-11-23
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 2021-03-05
    • 2021-03-18
    • 2020-11-28
    • 2020-12-03
    • 2020-05-15
    相关资源
    最近更新 更多