0

全部,

我有以下 Azure DevOps 管道设置,可将 keyvault 机密从一个 KV 复制到另一个。如您所见,我有两项任务:1)一项读取机密,2)一项编写机密。我很难弄清楚如何将“ $secrets ”变量(通过“ echo “##vso[task.setVariable variable=sourceSecrets]$json ”)从第一个任务传递到第二个任务。

stages:
  - stage: "Test1"
    displayName: "Test1 - Copy KV"
    jobs:
    - deployment : "Deploy"
      timeoutInMinutes: 120
      variables:
        sourceSecrets: ""
      strategy:
          runOnce:
            deploy:
              steps:
              - task: AzureCLI@2
                inputs:
                  azureSubscription: $(ServiceConnection1)
                  scriptType: 'pscore'
                  scriptLocation: 'inlineScript'
                  inlineScript: |
                          if ("$(mysubscription1)"){
                              az account set --subscription "mysubscription1"
                          }

                          $secNames = az keyvault secret list --vault-name "kvName1"  -o json --query "[].name"  | ConvertFrom-Json

                          Write-Host 'Reading secrets...'
                          $secrets = $secNames | % {
                              $secret = az keyvault secret show --name $_ --vault-name "kvName1" -o json | ConvertFrom-Json
                              [PSCustomObject]@{
                                  name  = $_;
                                  value = $secret.value;
                              } 
                          }
                          $json = $($secrets | ConvertTo-Json)
                          echo "##vso[task.setVariable variable=sourceSecrets]$json"
                          
              - task: AzureCLI@2
                inputs:
                  azureSubscription: $(ServiceConnection2)
                  scriptType: 'pscore'
                  scriptLocation: 'inlineScript'
                  inlineScript: |
                          if ("$(mysubscription2)"){
                              az account set --subscription $(mysubscription2)
                          }
                          $secrets = "$(sourceSecrets)" | ConvertFrom-Json
                          $secrets.foreach{
                          Write-Host 'Writing secrets:'
                              az keyvault secret set --vault-name $(kvName2) --name $_.name  --value  $_.value --output none
                              Write-Host '---->' $_.name
                          }                          

当管道执行时,任务一执行得很好。但是,第二个任务出现以下错误:

ConvertFrom-Json : Conversion from JSON failed with error: Error reading JArray from JsonReader. Path '', line 1, position 1.
At /home/vsts/work/_temp/azureclitaskscript1620360635888_inlinescript.ps1:4 char:18
+ $secrets = "[" | ConvertFrom-Json
+                  ~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [ConvertFrom-Json], ArgumentException
+ FullyQualifiedErrorId : System.ArgumentException,Microsoft.PowerShell.Commands.ConvertFromJsonCommand

我做了一些检查,似乎 $(sourceSecrets) 变量只包含“[”而不是整个 json 内容。这意味着第一个任务中的“ echo "##vso[task.setVariable variable=sourceSecrets]$json " 行排除了 "[" 之后的所有内容。我不知道它为什么这样做。想法?

提前致谢。

4

1 回答 1

0

一般管道变量的值只支持字符串类型,应该是单行字符串。如果将多行内容传递给管道变量,通常只会接收第一行作为变量的值。

在您的情况下,您传递给变量的值是一个包含多行内容的 JSON 对象。

为避免您面临的问题,您应该将 JSON 对象的内容转换为单行字符串,然后再将其传递给管道变量。

要将多行字符串转换为单行字符串,您可以尝试以下命令行:

. . .

# escape '%', '\n' and '\r'
json="${json//'%'/'%25'}"
json="${json//$'\n'/'%0A'}"
json="${json//$'\r'/'%0D'}"

echo "##vso[task.setVariable variable=sourceSecrets]$json"
于 2021-05-07T07:34:22.367 回答