解析运行时表达式中的预定义代理变量
Resolving Predefined Agent Variables in Runtime Expressions
我有以下场景,为简洁起见对其进行了简化,但概述了我的问题。
我有一个 2 作业管道。
BreakMatrix
作业:运行 在 AdminPool
上的作业,并输出具有以下名称 ENV1
和 ENV2
的 2 个变量。这些名称很重要,因为它们中的每一个都与单独的 MachinePool
VM 部署池中的环境 运行ning 的名称相匹配。
Upgrade
作业:依赖于 BreakMatrix
作业和 VM MachinePool 上的 运行 的部署作业,具有select ENV1
和 ENV2
环境的标签。
我正在尝试将其中一个变量传递给每个相应的环境:
- job: BreakMatrix
pool: AdminPool
steps:
- checkout: none
- powershell: |
$result1 = @{"Hostname" = "Env1Value"}
$result2 = @{"Hostname" = "Env2Value"}
Write-Host "##vso[task.setvariable variable=ENV1;isOutput=true;]$result1"
Write-Host "##vso[task.setvariable variable=ENV2;isOutput=true;]$result2"
name: outputter
- deployment: Upgrade
dependsOn: BreakMatrix
variables:
agentName: $(Environment.ResourceName)
agentName2: $(Agent.Name)
formatted: $[ format('outputter.{0}', variables['agentName']) ]
result1: $[ dependencies.BreakMatrix.outputs[format('outputter.{0}', variables['agentName'])] ]
result2: $[ dependencies.BreakMatrix.outputs[format('outputter.{0}', variables['agentName2'])] ]
result3: $[ dependencies.BreakMatrix.outputs[format('outputter.{0}', variables['Agent.Name'])] ]
hardcode: $[ dependencies.BreakMatrix.outputs['outputter.ENV2'] ]
json: $[ convertToJson(dependencies.BreakMatrix.outputs) ]
environment:
name: MachinePool
resourceType: VirtualMachine
tags: deploy-dynamic
strategy:
rolling:
preDeploy:
steps:
- powershell: |
echo 'Predeploy'
echo "agentName: $(agentName)"
echo "agentName2: $(agentName2)"
echo "env: $(Environment.ResourceName)"
echo "formatted: $(formatted)"
echo "harcode: $(harcode)"
echo "result1: $(result1)"
echo "result2: $(result2)"
echo "result3: $(result3)"
echo "json: $(json)"
deploy:
steps:
- powershell: |
echo 'Deploy'
ENV2
预部署步骤的输出:
Predeploy
agentName: ENV2
agentName2: ENV2
env: ENV2
formatted: outputter.ENV2
hardcode: {
Hostname:Env2Value}
result1:
result2:
result3:
json: {
outputter.ENV2:
\"Hostname\":\"Env2Value\"
}
如果我尝试使用 predefined variable in a dependency expression,它们似乎无法正确解析,但如果我只是简单地将它们映射到一个变量/格式化它们,它们就可以工作。
注意:环境名称实际上是在这些作业之前动态计算的 运行 所以我不能使用参数或 static/compile 时间变量。
关于如何只将相关变量传递给每个环境的任何建议?
我在 developer community 上确认这是不可能的。
相关部分:
But I am afraid that the requirement couldn’t be achieved.
The reason is that the dependencies.xx.outputs expression can’t read
the variable(variables['Agent.Name']) and format expression value
defined in the YAML pipeline.
It now only supports hard-coding the name of the variable to get the
corresponding job variable value.
我有以下场景,为简洁起见对其进行了简化,但概述了我的问题。
我有一个 2 作业管道。
BreakMatrix
作业:运行 在 AdminPool
上的作业,并输出具有以下名称 ENV1
和 ENV2
的 2 个变量。这些名称很重要,因为它们中的每一个都与单独的 MachinePool
VM 部署池中的环境 运行ning 的名称相匹配。
Upgrade
作业:依赖于 BreakMatrix
作业和 VM MachinePool 上的 运行 的部署作业,具有select ENV1
和 ENV2
环境的标签。
我正在尝试将其中一个变量传递给每个相应的环境:
- job: BreakMatrix
pool: AdminPool
steps:
- checkout: none
- powershell: |
$result1 = @{"Hostname" = "Env1Value"}
$result2 = @{"Hostname" = "Env2Value"}
Write-Host "##vso[task.setvariable variable=ENV1;isOutput=true;]$result1"
Write-Host "##vso[task.setvariable variable=ENV2;isOutput=true;]$result2"
name: outputter
- deployment: Upgrade
dependsOn: BreakMatrix
variables:
agentName: $(Environment.ResourceName)
agentName2: $(Agent.Name)
formatted: $[ format('outputter.{0}', variables['agentName']) ]
result1: $[ dependencies.BreakMatrix.outputs[format('outputter.{0}', variables['agentName'])] ]
result2: $[ dependencies.BreakMatrix.outputs[format('outputter.{0}', variables['agentName2'])] ]
result3: $[ dependencies.BreakMatrix.outputs[format('outputter.{0}', variables['Agent.Name'])] ]
hardcode: $[ dependencies.BreakMatrix.outputs['outputter.ENV2'] ]
json: $[ convertToJson(dependencies.BreakMatrix.outputs) ]
environment:
name: MachinePool
resourceType: VirtualMachine
tags: deploy-dynamic
strategy:
rolling:
preDeploy:
steps:
- powershell: |
echo 'Predeploy'
echo "agentName: $(agentName)"
echo "agentName2: $(agentName2)"
echo "env: $(Environment.ResourceName)"
echo "formatted: $(formatted)"
echo "harcode: $(harcode)"
echo "result1: $(result1)"
echo "result2: $(result2)"
echo "result3: $(result3)"
echo "json: $(json)"
deploy:
steps:
- powershell: |
echo 'Deploy'
ENV2
预部署步骤的输出:
Predeploy
agentName: ENV2
agentName2: ENV2
env: ENV2
formatted: outputter.ENV2
hardcode: {
Hostname:Env2Value}
result1:
result2:
result3:
json: {
outputter.ENV2:
\"Hostname\":\"Env2Value\"
}
如果我尝试使用 predefined variable in a dependency expression,它们似乎无法正确解析,但如果我只是简单地将它们映射到一个变量/格式化它们,它们就可以工作。 注意:环境名称实际上是在这些作业之前动态计算的 运行 所以我不能使用参数或 static/compile 时间变量。
关于如何只将相关变量传递给每个环境的任何建议?
我在 developer community 上确认这是不可能的。
相关部分:
But I am afraid that the requirement couldn’t be achieved.
The reason is that the dependencies.xx.outputs expression can’t read the variable(variables['Agent.Name']) and format expression value defined in the YAML pipeline.
It now only supports hard-coding the name of the variable to get the corresponding job variable value.