我正在建立一个多阶段的管道,并且我使用了许多模板,因为每种环境的部署作业,任务和阶段具有很多共享的逻辑。因此,在此阶段,我要设置一个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%的时间,但是我也无法推断出原因。现在,我的解决方法是在不使用参数的情况下对环境变量进行硬编码,但这严重限制了我如何对所有管道进行模板化。
答案 0 :(得分:0)
问题在于何时填充作业名称。在多阶段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 }}
缺点是每个环境的单独变量名称。好处是,如果所有存储库都使用相同的变量模板,则可以确保所有命名标准之间的一致性。