说我在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脚本时。下面是运行结果后管道结果的屏幕截图。
可以看出,它显示为ReadMetadataJson.metadata: command not found
。我一直以Microsoft document作为参考,并搜索了其他文章,但我所能找到的只是处理string
或integer
之类的值,而不是json
对象。我想念或做错了什么。
答案 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)