我正在使用 Azure Pipeline,需要有条件地设置
environment
属性。我通过在正文中传递 Parameters
来从 REST API 调用中调用管道 (此处记录)。当我尝试在编译时访问该 parameter
以有条件地设置环境时,尽管该变量为空(假设它在编译时不可访问?)有人知道通过管道或 API 调用解决这个问题的好方法吗?
$[ variable ]
${{}}
语法的参数和变量的最终值将插入到文档中。
$[]
语法插入运行时变量。
...首先,展开模板并计算模板表达式。
- 接下来,评估阶段级别的依赖关系以选择要运行的第一个阶段。
- 对于选择运行的每个阶段,会发生两件事:
- 对于选择运行的每个作业,将多配置(策略:矩阵或策略:YAML 中的并行)扩展为多个运行时作业。
收集并验证所有作业中使用的所有资源以授权运行。
- 评估作业级别的依赖关系以选择第一个要运行的作业。
- 对于每个运行时作业,评估条件以确定该作业是否有资格运行。
- 为每个符合条件的运行时作业请求代理。
此顺序有助于回答一个常见问题:为什么我不能在模板参数中使用某些变量?第 1 步,模板扩展,仅对 YAML 文档的文本进行操作。该步骤中不存在运行时变量。在第 1 步之后,模板参数已被解析并且不再存在。[参考:https://learn.microsoft.com/en-us/azure/devops/pipelines/process/runs?view=azure-devops]
事实证明
Build
REST API 确实支持可在编译时使用的模板参数,文档只是没有明确告诉您。
Runs
端点也支持这一点。我的请求的有效负载最终看起来像:
{
"Parameters": "{\"Env\":\"QA\"}",
"templateParameters": {"SkipApproval" : "Y"},
"Definition": {
"Id": 123
},
"SourceBranch": "main"
}
我的管道在编译时通过以下管道(缩写版本)消耗了这些更改
parameters:
- name: SkipApproval
default: ''
type: string
...
${{if eq(parameters.SkipApproval, 'Y')}}:
environment: NoApproval-All
${{if ne(parameters.SkipApproval, 'Y')}}:
environment: digitalCloud-qa
在阶段开始之前、环境批准之前评估条件。
${{}} 表达式在编译时计算,不可能获取运行时创建/修改的变量的值。
trigger: none
stages:
- stage: setVariableStage
dependsOn: []
jobs:
- job: setVariableJob
steps:
- task: PowerShell@2
name: setVariableTask
inputs:
pwsh: true
targetType: 'inline'
script: |
$enabledaux = [boolean]::Parse('True');
Write-Host "variable $enabledaux";
Write-Host "##vso[task.setvariable variable=shouldrun;isOutput=true]${enabledaux}"
- stage: deploySomethingWithApproval
dependsOn: setVariableStage
variables:
shouldrun: $[ stageDependencies.setVariableStage.setVariableJob.outputs['setVariableTask.shouldrun'] ]
condition: eq(variables.shouldrun, 'True')
jobs:
- deployment:
environment: environmentApproval # Contains the approval needed
strategy:
runOnce:
deploy:
steps:
- task: PowerShell@2
inputs:
pwsh: true
targetType: 'inline'
script: 'Do something'
- stage: afterStage
dependsOn:
- deploySomethingWithApproval
condition: in(dependencies.deploy.result, 'Succeeded', 'Skipped')
jobs:
- job:
steps:
- task: PowerShell@2
inputs:
pwsh: true
targetType: 'inline'
script: "Do something"