如何解决Jenkins调用GitLab API合并请求时的HTTP/1.1 406错误
GitLab MR合并失败(HTTP 406 Not Acceptable)问题解决
问题场景
在Jenkins流水线中通过共享库调用GitLab API合并MR时,返回HTTP/1.1 406 Not Acceptable错误,响应内容为{"message":"Branch cannot be merged"}。相关代码及控制台输出如下:
java.jenkinsfile代码
#!groovy @Library('jenkinslib@main') _ def gitlab = new org.devops.gitlab() gitlab.AcceptMr(projectId,mergeId)
gitlab.groovy代码
def HttpReq(reqType,reqUrl,reqBody){ def gitServer = "http://10.4.7.101:8929/api/v4" withCredentials([string(credentialsId: 'gitlab-token', variable: 'gitlabToken')]) { result = httpRequest customHeaders: [[maskValue: true, name: 'PRIVATE-TOKEN', value: "${gitlabToken}"]], httpMode: reqType, contentType: "APPLICATION_JSON", consoleLogResponseBody: true, ignoreSslErrors: true, requestBody: reqBody, url: "${gitServer}/${reqUrl}" } return result } def AcceptMr(projectId,mergeId){ def apiUrl = "projects/${projectId}/merge_requests/${mergeId}/merge" HttpReq('PUT',apiUrl,'') }
流水线控制台输出
[Pipeline] httpRequest Warning: A secret was passed to "httpRequest" using Groovy String interpolation, which is insecure. Affected argument(s) used the following variable(s): [gitlabToken] HttpMethod: PUT URL: http://10.4.7.101:8929/api/v4/projects/7/merge_requests/6/merge Content-Type: application/json PRIVATE-TOKEN: ***** Sending request to url: http://10.4.7.101:8929/api/v4/projects/7/merge_requests/6/merge Response Code: HTTP/1.1 406 Not Acceptable Response: {"message":"Branch cannot be merged"}
问题原因
该错误由GitLab直接返回,说明当前MR不满足合并条件,常见触发原因:
- 源分支与目标分支存在代码冲突
- MR关联的CI流水线未执行成功
- 未完成项目要求的合并审批流程
- 目标分支设置了保护规则,限制了合并操作的权限或方式
解决步骤
1. 排查并解决分支冲突
- 登录GitLab后台,找到对应项目(ID7)的MR(ID6),查看页面上的冲突提示,手动解决冲突后重新发起合并。
- 若需流水线自动处理简单文本冲突,可在合并前添加以下步骤:
// 切换到源分支并拉取目标分支代码合并 sh "git checkout ${sourceBranch}" sh "git pull origin ${targetBranch}" // 自动合并(仅适用于无逻辑冲突的场景) sh "git merge --no-edit ${targetBranch}" sh "git push origin ${sourceBranch}"
2. 验证合并前置条件
- 检查MR的CI状态:确保关联的流水线已成功执行,若项目设置了"CI成功才可合并"的规则,需先修复CI失败问题。
- 确认审批流程:若项目要求合并前需审批,需先完成所有审批节点。
- 查看分支保护规则:检查目标分支是否有角色限制、必须通过MR合并等规则,确保调用API的凭证拥有对应权限。
3. 优化API调用参数
GitLab合并API支持多种参数控制合并行为,可根据需求调整:
- 若希望CI成功后自动合并,修改AcceptMr方法的请求体:
def AcceptMr(projectId,mergeId){ def apiUrl = "projects/${projectId}/merge_requests/${mergeId}/merge" def reqBody = '{"merge_when_pipeline_succeeds": true, "should_remove_source_branch": true}' HttpReq('PUT',apiUrl,reqBody) } - 谨慎使用强制合并(忽略冲突):仅在测试场景使用,添加
"force": true参数,但可能导致代码逻辑问题。
4. 修复凭证插值安全警告
控制台提示的Groovy字符串插值不安全问题,修改HttpReq方法中的凭证传递方式:
customHeaders: [[maskValue: true, name: 'PRIVATE-TOKEN', value: gitlabToken]]
直接使用变量gitlabToken而非插值${gitlabToken},避免安全风险。
内容的提问来源于stack exchange,提问作者galaxy.liu
相关产品推荐
相关产品推荐

