jq -检查JSON文件是否包含大于或等于已定义变量的特定值?

9rnv2umw  于 2023-04-22  发布在  其他
关注(0)|答案(2)|浏览(124)

我有一个文件“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

我说的对吗?

hwamh0ep

hwamh0ep1#

它有多个“触发器”对象。
这不是惯用的JSON。字段名应该是唯一的。否则,JSON处理器可能会将它们折叠成一个,或者以任何其他方式失败,无法提供预期的行为。
使用jq,你可以通过使用--stream标志读取和评估小块的输入来克服这个问题,这样“过去的重复”就可以在读取下一个之前被处理。

if >/dev/null jq --argjson th ${THRESHOLD_VALUE} --stream -en '
  any(inputs | select(.[0][-1] == "threatLevel")[1]; . > $th)' results.json 
then
    echo 'failing pipeline'
    exit 1
else
    echo 'passing pipeline'
    exit 0
fi
wsewodh2

wsewodh22#

contains筛选器的语法不正确。您应该直接使用比较运算符“〉=”而不是“contains”。
以下是修改后的版本:

if jq '[.policyEvaluationResult.alerts[] | select(.trigger.threatLevel >= env.THRESHOLD_VALUE)] | length > 0' results.json >/dev/null; then
    echo 'failing pipeline'
    exit 1
else
    echo 'passing pipeline'
    exit 0
fi

我希望这有帮助!

相关问题