我在管道运行期间基于几个管道参数和预定义的环境变量动态地形成一个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作为输入变量传递?
默认情况下,变量在作业之间不可用。在JobB
中,未定义$(payload)
变量。
设置变量时,需要提供isOutput
:echo "##vso[task.setvariable variable=payload;isOutput=true]$payload"
引用变量时,需要使用适当的运行时表达式:
variables:
payload: $[ dependencies.PayloadCreation.outputs['payload'] ]
参考编号:https://learn.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2Batch#跨管道共享变量
https://learn.microsoft.com/en-us/azure/devops/pipelines/scripts/logging-commands?view=azure-devops&tabs=bash#setvariableinitialize-or-modify-a-variable的值
是否有其他方法可以将JSON作为输入变量传递?
严格来说,没有。DevOps管道概念下的变量不支持JSON对象。
为什么不呢?
https://learn.microsoft.com/en-us/azure/devops/pipelines/process/expressions?view=azure-devops#变量
变量总是字符串。
但这并不意味着你不能传递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);
不确定你的任务是如何设计的,但Daniel传递变量的方法是正确的。
将字符串对象转换为JSON对象后,可以在扩展任务代码中执行操作。
在这里,我添加了日志记录命令的其他相关信息:
设置变量
变量级别
顺便说一句,在你的问题中,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"
}
]
}