Azure Pipeline - передача переменных между задачами

Все,

У меня есть приведенная ниже настройка конвейера Azure DevOps, которая копирует секреты хранилища ключей с одного KV на другой. Как видите, у меня две задачи: 1) читать секреты и 2) писать секреты. Мне трудно понять, как передать переменную $ secrets (через echo ## vso [task.setVariable variable = sourceSecrets] $ json < / strong>) от первой задачи ко второй.

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 из первой задачи исключает все, что находится после [. Я не могу понять, почему он это делает. Идеи?

Заранее спасибо.


comment
Может это поможет? stackoverflow.com/questions/55617951/   -  person Repcak    schedule 07.05.2021
comment
В итоге выбрал другой подход и решил проблему. stackoverflow.com/questions/46306467/powershell-json-formatting   -  person Ultra GC    schedule 08.05.2021


Ответы (1)


Как правило, значение переменной конвейера поддерживает только строковый тип и должно быть однострочным. Если вы передаете многострочное содержимое в конвейерную переменную, обычно только первая строка будет получена как значение переменной.

В вашем случае значение, которое вы передаете переменной, представляет собой объект JSON, содержащий многострочный контент.

Чтобы избежать проблемы, с которой вы столкнулись, вам следует преобразовать содержимое объекта JSON в однострочную строку, прежде чем передавать его в переменную конвейера.

Чтобы преобразовать многострочную строку в однострочную, вы можете попробовать следующие командные строки:

. . .

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

echo "##vso[task.setVariable variable=sourceSecrets]$json"
person Bright Ran-MSFT    schedule 07.05.2021
comment
Привет, Брайт Ран. Спасибо за комментарий. Не знаком с упомянутыми вами командами. Я пробовал следующее, но переменная пуста. Не могли бы вы уточнить? Спасибо `` $ json = $ {$ json // '%' / '% 25'} $ json = $ {$ json // $ '\ n' / '% 0A'} $ json = $ {$ json / / $ '\ r' / '% 0D'} `` - person Ultra GC; 07.05.2021