Azure Devops-从一个任务输出Json对象,并在另一任务中使用

时间:2020-03-16 14:06:04

标签: json azure powershell azure-devops yaml

说我在Azure DevOps中用yaml编写了一个发布管道,它有两个任务,一个任务是从文件中读取json,第二个任务是使用json将密钥设置到另一个json文件中阅读第一个任务。我有以下pipeline.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文件-

Metadata.json

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

appSetting.json

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

问题是当我想返回json数据作为第一个任务的输出,并在第二个任务中使用它将参数传递给第二个powershell脚本时。下面是运行结果后管道结果的屏幕截图。

enter image description here

可以看出,它显示为ReadMetadataJson.metadata: command not found。我一直以Microsoft document作为参考,并搜索了其他文章,但我所能找到的只是处理stringinteger之类的值,而不是json对象。我想念或做错了什么。

2 个答案:

答案 0 :(得分:1)

您可以将JSON对象转换为字符串( ConvertTo-Json ),并将其作为变量传递给第二个脚本。

然后在第二个脚本中,您只需使用 ConvertFrom-Json 方法将字符串再次解析为JSON对象。

答案 1 :(得分:0)

除了上面提到的Hugo的方法外,还有另一种解决方案可以实现您想要的,而无需增加任何其他步骤。

只需在您的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对象解析为相应的变量。

我在这里利用了Terroform输出的工作逻辑


然后,您可以直接使用{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