我有一个用于部署 Arm 模板的 Azure DevOps 管道模板。它还意味着将 ARM 模板输出解析为 DevOps 变量,这些变量应该在整个管道运行过程中可访问。但我在设置变量和访问它时遇到问题。
这是运行的打印结果,我们可以在其中看到模板的输出。它是一个包含字符串的数组。
当我尝试在 azure powershell 脚本中访问它时,我执行此操作,一切正常。
$outputJson = $deployment.outputs | ConvertTo-Json
Write-Host "print: $output"
所以我能够打印输出。但之后我想设置一个可以在管道运行中使用的变量:
这是我的问题,我尝试像这样设置变量:(尝试了一些不同的方法)
Write-Output "##vso[task.setvariable variable=outputTest;isOutput=true]$outputJson"
这是我尝试访问变量时的一些语法示例。
Write-Host "print var test1: $outputTest"
Write-Host "print var test2: $(outputTest)"
Write-Host "print var test3: ${{ $variables.outputTest }}"
Write-Host "print var test4: '${{ $variables.outputTest }}'"
但是无论我做什么,打印输出都是空的。感觉自己好傻。。哈哈 有什么想法吗?
附加信息:
这是发生命令的 yaml 文件的结构
steps:
- script: |
echo parameters.serviceconnection - ${{parameters.serviceconnection}}
echo resourceGroup - ${{parameters.resourceGroup}}
echo resourceGroupLocation - ${{parameters.resourceGroupLocation}}
echo overrideParameters - ${{parameters.overrideParameters}}
displayName: 'arm-template.yml - Variable list'
task: AzurePowerShell@5
displayName: "PowerShell template deploy"
inputs:
azureSubscription: ${{parameters.serviceConnection}}
scriptType: InlineScript
azurePowerShellVersion: LatestVersion
inline: |
"my code"
据我所知,并正确阅读docs,您始终拥有管道变量的键/值对,这意味着您不能仅将对象转换为管道变量。如果您想用谷歌搜索解析手臂/二头肌输出,您可以找到一些有关转换手臂输出的示例。
例如,在 bash 中:
deploymentOutput=$(az deployment group show \
--resource-group $(rgName) \
--name $(vnetName)-$deploymentSuffixAttempt \
--query properties.outputs | jq -c 'to_entries[] | [.key, .value.value]')
while IFS=$'\n' read -r c; do
outputname=$(echo "$c" | jq -r '.[0]')
outputvalue=$(echo "$c" | jq -r '.[1]')
echo "Log variabele: $outputname : $outputvalue"
declare $outputname=$outputvalue
echo "##vso[task.setvariable variable=$outputname;isoutput=true]$outputvalue"
done <<< "$deploymentOutput"
或者在 powerhshell 中:
[CmdletBinding()]
param (
[Parameter(Mandatory)]
[ValidateNotNullOrEmpty()]
[string]$ArmOutputString,
[Parameter()]
[ValidateNotNullOrEmpty()]
[switch]$MakeOutput
)
Write-Output "Retrieved input: $ArmOutputString"
$armOutputObj = $ArmOutputString | ConvertFrom-Json
$armOutputObj.PSObject.Properties | ForEach-Object {
$type = ($_.value.type).ToLower()
$keyname = $_.Name
$vsoAttribs = @("task.setvariable variable=$keyName")
if ($type -eq "array") {
$value = $_.Value.value.name -join ',' ## All array variables will come out as comma-separated strings
} elseif ($type -eq "securestring") {
$vsoAttribs += 'isSecret=true'
} elseif ($type -ne "string") {
throw "Type '$type' is not supported for '$keyname'"
} else {
$value = $_.Value.value
}
if ($MakeOutput.IsPresent) {
$vsoAttribs += 'isOutput=true'
}
$attribString = $vsoAttribs -join ';'
$var = "##vso[$attribString]$value"
Write-Output -InputObject $var
}
请注意,这些只是示例,有时还需要在您的部署中进行一些额外的操作。
转换成功后,您可以在 powershell 中将它们作为系统变量访问:
Write-Host "print var test1: $env:outputTest"