修改GitHub CLI GraphQL响应的JQ过滤器,实现指定输出格式
问题:调整GitHub GraphQL分页结果的jq查询格式
背景
我正在创建GitHub Action工作流,调用GitHub CLI的GraphQL API请求,gh api graphql通过--paginate分页返回JSON Lines(ndjson)。现有jq查询的输出不符合预期,需要调整。
输出格式需求
- 期望输出:单个对象包含所有键值对的数组
[ { "KEY": "VALUE", "KEY": "VALUE", ... } ]
- 当前输出:每个键值对单独成对象的数组
[ { "KEY": "VALUE" }, { "KEY": "VALUE" }, ... ]
过滤条件
仅保留满足以下条件的里程碑:
- 进度为100%
- 标题不含"withdrawn"字样
- 关联有issues
额外处理规则
若里程碑标题包含空格或, ,需拆分标题,每个拆分后的内容作为独立键,对应相同的issues数据值。
当前jq查询(需修改)
.[] | .data.repository as { nameWithOwner: $name, milestones: { nodes: $milestones } } | [ foreach $milestones[] as $milestone ( null; $milestone ; $milestone | select($milestone.progressPercentage == 100) | select($milestone.title | contains("withdrawn") | not) | select($milestone.issues.nodes[]) | { (($milestone.title | gsub(", "; " ") | split(" "))[]) : [ foreach $milestone.issues.nodes[] as $issue ( {}; . + { $issue }; $issue as $issue | $issue | (reduce $issue.labels.nodes[] as $item ([]; . + [$item.name])) as $labels | { repo: $name, issue: $issue.number, milestone: $milestone.number, labels: $labels } ) ] } ) ] | .
示例输入(JSON片段)
{ "data": { "repository": { "nameWithOwner": "cov-lineages/pango-designation", "milestones": { "pageInfo": { "hasNextPage": true, "endCursor": "Y3Vyc29yOnYyOpHOAGviZA==" }, "nodes": [ { "number": 1, "title": "C.1, EXAMPLE_SPLIT", "progressPercentage": 100, "issues": { "nodes": [ { "number": 2, "labels": { "nodes": [ { "name": "proposed" }, { "name": "designated" } ] } } ] } }, { "number": 2, "title": "B.1.429", "progressPercentage": 100, "issues": { "nodes": [ { "number": 3, "labels": { "nodes": [ { "name": "proposed" }, { "name": "designated" } ] } } ] } } ] } } } }
预期示例输出
应生成包含3个键值对的单个对象数组:
[ { "C.1": [ { "repo": "cov-lineages/pango-designation", "issue": 2, "milestone": 1, "labels": ["proposed", "designated"] } ], "EXAMPLE_SPLIT": [ { "repo": "cov-lineages/pango-designation", "issue": 2, "milestone": 1, "labels": ["proposed", "designated"] } ], "B.1.429": [ { "repo": "cov-lineages/pango-designation", "issue": 3, "milestone": 2, "labels": ["proposed", "designated"] } ] } ]
修改后的jq查询
核心调整是将多个独立对象合并为单个对象,使用add操作符简化逻辑,同时保留所有过滤和拆分规则:
.[] | .data.repository as {nameWithOwner: $name, milestones: {nodes: $milestones}} # 先预处理所有符合条件的issues数据 | $milestones | map( select(.progressPercentage == 100) | select(.title | contains("withdrawn") | not) | select(.issues.nodes | length > 0) | .issues.nodes[] | (reduce .labels.nodes[] as $item ([]; . + [$item.name])) as $labels | { repo: $name, issue: .number, milestone: $milestone.number, labels: $labels } ) as $allIssues # 处理里程碑标题拆分并构建最终对象 | $milestones | map( select(.progressPercentage == 100) | select(.title | contains("withdrawn") | not) | select(.issues.nodes | length > 0) | ( .title | gsub(", "; " ") | split(" ") as $keys | $keys | map({ (.): $allIssues | select(.milestone == $milestone.number) }) | add ) ) | add | [.]
内容的提问来源于stack exchange,提问作者Christopher Rucinski
相关产品推荐
相关产品推荐

