我在 DevOps 管道 (yaml) 中设置和访问变量时遇到问题

问题描述 投票:0回答:1

我有一个用于部署 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"
azure-devops azure-pipelines azure-powershell
1个回答
0
投票

据我所知,并正确阅读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"
© www.soinside.com 2019 - 2024. All rights reserved.