查看 Json 中的任何状态是否失败

See if any of status in Json is failed or not

我正在尝试解析 CircleCI 作业 json 以查看是否所有作业都处于成功状态。如果是,那就做点别的,继续等。

我在 circleci 作业中使用这个 shell 命令来查看是否有任何作业未能提前退出

  is_failed=$(echo $json | jq '.items | map(select(.name | contains("my-custom-job") | not)) | any(.status == "failed")')

现在我想检查是否所有作业都具有 success 状态,如果是,则执行其他操作。我怎样才能在 shell 脚本中做到这一点?

这是 CirclCI api 的 link(显然 status 没有枚举,它可能是 null 等)。

更新: 示例 Json

{
  "next_page_token": null,
  "items": [
    {
      "started_at": "2021-04-01T14:50:43Z",
      "name": "...",
      "type": "build",
      "status": "running"
    },
    {
      "started_at": null,
      "name": "...",
      "type": "build",
      "status": "blocked"
    },
    {
      "started_at": null,
      "name": "...",
      "type": "build",
      "status": "blocked"
    },
    {
      "started_at": "2021-04-01T14:50:43Z",
      "name": "auto-cancel",
      "type": "build",
      "status": "running"
    }
  ]
}

I want to check if ALL the jobs has success status

jq --arg wanted "success" '[.items[] | select(.status != $wanted)] | length == 0' file.json

正如评论中所暗示的那样,all 使 jq 变得微不足道。加上 jq-e 选项来设置退出状态,因此它可以很容易地与 shell if:

一起使用
if jq -e '.items | all(.status == "success")' <<<"$json" >/dev/null; then
    echo "All tests passed."
else
    echo "There are issues."
fi