【发布时间】:2019-08-31 12:41:33
【问题描述】:
我们有一个定制的 CD 管道工具,遗憾的是它没有对部署参数进行版本控制。因此,我将它们作为 json 文件放入 Bitbucket Repo 中,并根据此 CD 工具的 REST API 验证它们。
所以我有 2 个 json 数组,它们在结构上是相同的,但在这些对象中可能包含不同的对象或值。我想比较它们,看看它们是否不同以及有什么不同。
到目前为止,我使用了这里的解决方案: Using jq or alternative command line tools to diff JSON files
所以我把它放在我的代码中:
jq --argjson a "${bb_cfg}" --argjson b "${cd_tool_cfg}" -n 'def post_recurse(f): def r: (f | select(. != null) | r), .; r; def post_recurse: post_recurse(.[]?); ($a | (post_recurse | arrays) |= sort) as $a | ($b | (post_recurse | arrays) |= sort) as $b | $a == $b'
现在如果它们相同,我会得到一个真,如果 2 个 json 有差异,我会得到一个假,但我不知道有什么不同。
如果我收到错误回复,我会尝试这样做:
diff --suppress-common-lines -y <(jq . -S <<< "${bb_cfg}") <(jq . -S <<< "${cd_tool_cfg}")
输入$bb_cfg:
[{
"key": "IGNORE_VALIDATION_ERROR",
"value": "true",
"tags": []
},
{
"key": "BB_CFG_REPO_NAME",
"value": "cd-tool-cfg",
"tags": []
}]
输入 $cd_tool_cfg
[{
"key": "IGNORE_VALIDATION_ERROR",
"value": "false",
"tags": []
},
{
"key": "BB_CFG_REPO_NAME",
"value": "cd-tool-cfg",
"tags": []
}]
这部分起作用,因为如果只有值不同,输出是这样的:
"value": "true" | "value": "false"
所以我这里没有获取整个json对象来快速找出不同的参数。
我最终想要的是得到这样的东西:
{
"key": "IGNORE_VALIDATION_ERROR",
"value": "true",
"tags": []
}
{
"key": "IGNORE_VALIDATION_ERROR",
"value": "false",
"tags": []
}
我可以将其存储在我的 bash 脚本中的变量中,并将其转换为我可以使用的输出。
【问题讨论】: