如何在GitLab GraphQL查询中使用repository的rootRef字段作为mergeRequests的targetBranches参数?
能否在GitLab GraphQL查询中用repository.rootRef作为mergeRequests的targetBranches参数?
很遗憾,这种直接在查询参数里引用同一查询中其他字段值的写法是无法实现的——GraphQL的设计逻辑决定了查询参数必须是静态值或预定义变量,不能引用查询内部尚未执行的字段返回结果。
为什么不行?
GraphQL的执行流程是先解析并验证所有查询参数,再开始执行各个字段的查询逻辑。这意味着当处理mergeRequests的targetBranches参数时,repository.rootRef的查询还没开始执行,自然无法获取它的值来作为参数。
可行的解决方案
1. 分两步查询(推荐)
先单独查询项目的rootRef,再将这个值作为变量传入mergeRequests的查询:
第一步:获取rootRef
{ project(fullPath: "gitlab-org/gitlab") { repository { rootRef } } }
第二步:使用变量查询对应分支的合并请求
query GetMergedMergeRequests($targetBranch: String!) { project(fullPath: "gitlab-org/gitlab") { mergeRequests(state: merged, targetBranches: [$targetBranch]) { nodes { sourceBranch targetBranch } } } }
将第一步得到的rootRef值(比如master或main)作为$targetBranch变量传入即可。
2. 单请求内批量查询(需客户端处理)
你可以在一个请求里同时查询rootRef和合并请求,但仍然需要客户端先提取rootRef的值,再动态替换到mergeRequests的参数中(或者在脚本里先解析第一个查询结果,再构造第二个查询逻辑):
{ projectRootRef: project(fullPath: "gitlab-org/gitlab") { repository { rootRef } } mergedMRs: project(fullPath: "gitlab-org/gitlab") { mergeRequests(state: merged, targetBranches: ["master"]) { nodes { sourceBranch targetBranch } } } }
这种方式本质还是分两步处理,只是把两个查询打包在一个请求里,最终还是需要手动替换targetBranches的参数值为projectRootRef.repository.rootRef的结果。
补充说明
GitLab GraphQL的mergeRequests字段并没有提供自动使用项目rootRef作为默认分支过滤的参数选项,所以目前只能通过上述分步骤的方式实现你的需求。
内容的提问来源于stack exchange,提问作者hillsprig
相关产品推荐
相关产品推荐

