使用jq
,是否可以将示例 JSON 中每个参数的值替换为作为初始值的变量的值?
在我的方案中,Azure DevOps 不会对 JSON 文件进行任何类型的变量替换,因此我需要手动执行此操作。例如,假设$SUBSCRIPTION_ID
设置为abc-123
,我想使用jq
来更新 JSON 文件。
我可以使用.parameters[].value
提取值,但我似乎找不到设置每个单独值的方法。
这里的主要挑战是解决方案应该是可重用的,并且不同的 JSON 文件将具有不同的parameters
,所以我认为我不能使用--argjson
.
例
原始 JSON
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/parametersTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"subscriptionId": {
"value": "$SUBSCRIPTION_ID"
},
"topicName": {
"value": "$TOPIC_NAME"
}
}
}
变量
SUBSCRIPTION_ID="abc-123"
TOPIC_NAME="SomeTopic"
所需的 JSON
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/parametersTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"subscriptionId": {
"value": "abc-123"
},
"topicName": {
"value": "SomeTopic"
}
}
}
导出这些变量,以便您可以从 jq 中访问它们。
export SUBSCRIPTION_ID TOPIC_NAME
jq '.parameters[].value |= (env[.[1:]] // .)' file
//.
部分用于保持环境中不存在变量,如果没有必要,您可以删除它
使用--argjson
; 本质上,您将忽略参数化JSON的尝试,而只是无条件地替换值。
jq --argjson x "$SUBSCRIPTION_ID"
--argjson y "$TOPIC_NAME"
'.parameters.subscriptionId.value = $x; .parameters.topicName.value = $y'
config.json
下面是基于架构内容和可用环境变量的"数据驱动"方法:
export SUBSCRIPTION_ID="abc-123"
export TOPIC_NAME="SomeTopic"
< schema.json jq '.parameters
|= map_values(if .value | (startswith("$") and env[.[1:]])
then .value |= env[.[1:]] else . end)'
请注意,jq 程序中没有出现任何模板名称。
如果你的 shell 支持它,你可以通过在 jq 命令前面加上变量赋值来避免"export"命令,如下所示:
SUBSCRIPTION_ID="abc-123" TOPIC_NAME="SomeTopic" jq -f program.jq schema.json
警告
使用环境变量传入参数值可能不是一个好主意。 两种替代方法是在文本文件中或作为 JSON 对象提供名称-值对。 另请参阅使用 jq 作为模板引擎