我有一个文件“results.json”
看起来是这样的
{
"applicationId" : "application",
"scanId" : "scanId",
"policyEvaluationResult" : {
"alerts" : [ {
"trigger" : {
"policyId" : "pid1",
"policyName" : "Security-High",
"threatLevel" : 9,
"policyViolationId" : "pvid1",
},
"trigger" : {
"policyId" : "pid2",
"policyName" : "Security-Low",
"threatLevel" : 1,
"policyViolationId" : "pvid2",
},
...
}]
}
}
它有多个“触发器”对象。
我正在尝试编写一个bash/shell脚本,它使用jq检查这个文件,如果它看到任何“触发器”对象包含大于或等于GitLab CI/CD变量中定义的变量的threatLevel。
如果是,则回显失败消息并返回退出代码1,否则回显成功消息并返回退出代码0。
我不关心返回JSON的任何实际值,我只关心成功/失败的结果。
我不知道该怎么做。
有什么想法吗
在伪水平上,我假设它是围绕以下想法的东西:
if (jq 'any(.threatLevel | contains (>=${THRESHOLD_VALUE}))') results.json; then
echo 'failing pipeline'
exit 1
else
echo 'passing pipeline'
exit 0
fi
我说的对吗?
2条答案
按热度按时间hwamh0ep1#
它有多个“触发器”对象。
这不是惯用的JSON。字段名应该是唯一的。否则,JSON处理器可能会将它们折叠成一个,或者以任何其他方式失败,无法提供预期的行为。
使用jq,你可以通过使用
--stream
标志读取和评估小块的输入来克服这个问题,这样“过去的重复”就可以在读取下一个之前被处理。wsewodh22#
contains筛选器的语法不正确。您应该直接使用比较运算符“〉=”而不是“contains”。
以下是修改后的版本:
我希望这有帮助!