Azure Devops - Вывод Json Объект из одной задачи и Потребление в другой задаче - PullRequest
0 голосов
/ 16 марта 2020

Скажем, у меня есть конвейер выпуска в Azure DevOps, записанный в yaml, который имеет две задачи: одну для чтения json из файла и вторую для установки ключа в другой файл json с помощью json прочитано в первом задании. У меня есть следующий pipe.yml -

trigger:
- master

pool:
  vmImage: 'ubuntu-latest'

steps:
- task: PowerShell@2
  name: ReadMetadataJson
  inputs:
    filePath: 'MetadataReader.ps1'
    arguments: 'Run MetadataReader.ps1 -pathToMetadata metadata.json'
- task: PowerShell@2
  name: SetAppSetting
  inputs:
    filePath: 'AppSettingSetter.ps1'
    arguments: 'Run AppSettingSetter.ps1 -pathToAppSetting SomeApp/Data.json -appSettingKey testkey -appSettingValue $($(ReadMetadataJson)).testkey'
- script: echo $(ReadMetadataJson.metadata)

Ниже приведены скрипты Powershell, вызываемые из каждой задачи -

Powershell 1

# Read From the Metadata.json
param ($pathToMetadata)

echo $pathToMetadata
$metadata = Get-content $pathToMetadata | out-string | ConvertFrom-Json

Write-Output "Metadata Json from metadata reader ps script - $metadata"
echo "##vso[task.setvariable variable=metadata;]$metadata"

Powershell 2

# For now just accept the values in parameter and log them
param ($pathToAppSetting, $appSettingKey, $appSettingValue)

echo "pathToAppSetting : $pathToAppSetting"
echo "appSettingKey : $appSettingKey"
echo "appSettingValue : $appSettingValue"

# Code to set in another file. I have this working, so omitting for brevity

И это json файлы -

Метаданные. json

{
  "testkey": "TestValueFromMetadata",
  "testkey1": "TestValueFromMetadata1"
}

appSetting. json

{
  "testkey": "TestValueInAppSetting",
  "testkey1": "TestValueInAppSetting1"
}

Проблема заключается в том, что я хочу вернуть данные json в качестве вывода из первой задачи и использовать их во второй задаче для передать параметр второму сценарию powershell. Ниже приведен скриншот результата конвейера после его запуска.

enter image description here

Как видно, написано ReadMetadataJson.metadata: command not found. Я следовал за документом Microsoft в качестве ссылки и искал другие статьи, но все, что я мог найти, это обрабатывать значения, подобные string или integer, но не объект json. Что я пропускаю или делаю неправильно?

Ответы [ 2 ]

1 голос
/ 16 марта 2020

Вы можете преобразовать ваш JSON объект в строку ( ConvertTo- Json) и передать его как переменную во второй скрипт.

Затем на втором скрипте вы просто снова проанализируйте строку для объекта JSON, используя метод ConvertFrom- Json.

0 голосов
/ 17 марта 2020

Кроме метода, который Ху go упоминал выше, есть еще одно решение, позволяющее достичь того, что вы хотите, без каких-либо дополнительных шагов.

Просто добавьте одну строку в ваш MetadataReader.ps1:

param ($pathToMetadata)

echo $pathToMetadata
$metadata = Get-content $pathToMetadata | out-string | ConvertFrom-Json

$metadata | Get-Member -MemberType NoteProperty | % { $o = $metadata.($_.Name); Write-Host "##vso[task.setvariable variable=$($_.Name);isOutput=true]$o" }

Затем он будет анализировать эти json объекты в соответствующие переменные после получения содержимого файла json.

( Я использую рабочий лог c выходов тероформы здесь )


Затем вы можете напрямую использовать {reference name}.{object name} для вызова соответствующего json значение.

- task: PowerShell@2
  name: ReadMetadataJson
  inputs:
    filePath: 'MetadataReader.ps1'
    arguments: 'Run MetadataReader.ps1 -pathToMetadata metadata.json'

- task: PowerShell@2
  name: SetAppSetting
  inputs:
    filePath: 'AppSettingSetter.ps1'
    arguments: 'Run AppSettingSetter.ps1 -pathToAppSetting Data.json -appSettingKey testkey -appSettingValue $(ReadMetadataJson.testkey)'

- script: echo $(ReadMetadataJson.testkey)

Примечание: я внес изменения здесь: -appSettingValue $(ReadMetadataJson.testkey)

enter image description here

...