我在管道运行期间根据几个管道参数和预定义的环境变量动态形成一个 JSON,并尝试将此 JSON 作为后续管道任务中的输入传递。
jobs:
- job: PayloadCreation
pool: linux-agent (or windows)
steps:
- ${{ each app in apps }}:
- bash: |
payload=$(jq .artifact += [{"name": "${{ app.name}}, "version":"$(Build.BuildId)"}]' artifact.json)
echo $payload > artifact.json
echo "##vso[task.setvariable variable=payload]$payload"
我得到
artifact.json
的输出以及变量 $payload 如下 -
"artifacts": [
{
"name":"service-a",
"version":"1.0.0"
},
{
"name":"service-b",
"version": "1.0.1"
}
]
}
随后,我尝试使用此 JSON 变量将其作为以下作业中的输入传递,但无法这样做。
- job: JobB
steps:
- task: SericeNow-DevOps-Agent-Artifact-Registration@1
inputs:
connectedServiceName: 'test-SC'
artifactsPayload: $(payload)
无法读取 JSON 作为输入变量。我收到以下错误 -
Artifact Registration could not be sent due to the exception: Unexpected token $ in JSON at position 0
还有其他方法可以将 JSON 作为输入变量传递吗?
还有其他方法可以将 JSON 作为输入变量传递吗?
严格来说,不。 DevOps pipeline 概念下的变量不支持 JSON 对象。
为什么不呢?
变量始终是字符串。
但这并不意味着你不能传递JSON信息,如果你想要的话,传递字符串是唯一的方法。
任务是你自己设计的吗?
将字符串对象转换为 JSON 对象并不困难:
//convert string object to json object
var str = `
{
"artifacts": [
{
"name":"service-a",
"version":"1.0.0"
},
{
"name":"service-b",
"version": "1.0.1"
}
]
}
`;
var obj = JSON.parse(str);
console.log(obj.artifacts[0].name);
console.log(obj.artifacts[0].version);
不确定你的任务是如何设计的,但大牛传递变量的方法是正确的。
将字符串对象转换为JSON对象后,您可以在扩展任务代码中进行操作。
这里我补充一下logging命令的其他相关信息:
顺便说一下,在你的问题中,json是
"artifacts": [
{
"name":"service-a",
"version":"1.0.0"
},
{
"name":"service-b",
"version": "1.0.1"
}
]
}
不应该是这样吗
{
"artifacts": [
{
"name":"service-a",
"version":"1.0.0"
},
{
"name":"service-b",
"version": "1.0.1"
}
]
}
默认情况下,作业之间变量不可用。在
JobB
中,$(payload)
变量未定义。
设置变量时,需要提供
isOutput
:echo "##vso[task.setvariable variable=payload;isOutput=true]$payload"
引用变量时,需要使用适当的运行时表达式:
variables:
payload: $[ dependencies.PayloadCreation.outputs['payload'] ]
将json设置为字符串,下面是我调用Azure API的示例(“动物”):
"templateParameters":
{
Animal: '{"Name":"Horse"}',
Owner: "Jimmy"
}