You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:20:38