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

GitLab升级至12.1.17后,Jenkins中checkout.groovy脚本无法检出源分支

解决GitLab 12.1.17升级后Jenkins无法检出MR源分支的问题

针对GitLab从12.0.1升级到12.1.17后,Jenkins合并请求(MR)构建任务无法检出源分支的问题,可从以下几个方向排查和修复:

1. 同步升级Jenkins GitLab插件版本

GitLab 12.x版本迭代后,旧版Jenkins GitLab插件可能存在兼容性问题,导致MR相关环境变量(如gitlabSourceNamespace、gitlabSourceBranch)无法正确传递。建议将Jenkins的GitLab插件升级到与GitLab 12.1.17匹配的版本(插件文档通常会标注兼容的GitLab版本范围)。

2. 验证MR相关环境变量的有效性

在脚本中添加环境变量输出,确认变量是否被正确传递:

if (env.gitlabMergeRequestId) {
    sh "echo Merge Request ID: ${env.gitlabMergeRequestId}"
    sh "echo Source Namespace: ${env.gitlabSourceNamespace}, Source Branch: ${env.gitlabSourceBranch}"
    sh "echo Target Namespace: ${env.gitlabTargetNamespace}, Target Branch: ${env.gitlabTargetBranch}"
    sh "echo Source Repo URL: ${env.gitlabSourceRepoHttpURL}"
    // 原有逻辑...
}

如果输出中存在空值或错误值,说明插件未正确传递变量,需检查插件配置或升级插件。

3. 调整Git SCM分支引用格式

GitLab 12.1可能对分支引用的格式要求更严格,原脚本中分支名称${env.gitlabSourceNamespace}/${env.gitlabSourceBranch}可补充完整的引用路径:

branches: [[name: "${env.gitlabSourceNamespace}/refs/heads/${env.gitlabSourceBranch}"]],

若源分支来自同一仓库,也可简化为:

branches: [[name: "refs/heads/${env.gitlabSourceBranch}"]],

4. 确认源仓库访问权限

如果MR来自fork仓库,GitLab 12.1可能调整了fork项目的权限策略:

  • 确保Jenkins使用的凭据(credentialsId对应的账号)拥有源fork仓库的读取权限
  • 检查GitLab中该MR的「允许来自fork的流水线运行」选项是否开启

5. 修正PreBuildMerge扩展参数

部分版本的Git SCM插件中,PreBuildMerge的mergeRemote参数需要对应远程仓库的别名,而非namespace。可尝试将mergeRemote改为origin(若目标仓库默认远程别名为origin),或确认userRemoteConfigs中定义的name是否正确:

options: [
    fastForwardMode: 'NO_FF',
    mergeRemote: 'origin', // 替换为目标仓库的远程别名
    mergeTarget: env.gitlabTargetBranch
]

修改后的完整脚本示例

#!/usr/bin/env groovy

def call() {
    if (env.gitlabMergeRequestId) {
        // 输出环境变量用于排查
        sh "echo Merge Request ID: ${env.gitlabMergeRequestId}"
        sh "echo Source Namespace: ${env.gitlabSourceNamespace}, Source Branch: ${env.gitlabSourceBranch}"
        sh "echo Target Namespace: ${env.gitlabTargetNamespace}, Target Branch: ${env.gitlabTargetBranch}"
        
        sh "echo 'Merge request detected. Merging...'"
        def credentialsId = scm.userRemoteConfigs[0].credentialsId
        checkout ([
            $class: 'GitSCM',
            // 调整分支引用格式
            branches: [[name: "${env.gitlabSourceNamespace}/refs/heads/${env.gitlabSourceBranch}"]],
            extensions: [
                [$class: 'PruneStaleBranch'],
                [$class: 'CleanCheckout'],
                [
                    $class: 'PreBuildMerge',
                    options: [
                        fastForwardMode: 'NO_FF',
                        mergeRemote: env.gitlabTargetNamespace,
                        mergeTarget: env.gitlabTargetBranch
                    ]
                ]
            ],
            userRemoteConfigs: [
                [
                    credentialsId: credentialsId,
                    name: env.gitlabTargetNamespace,
                    url: env.gitlabTargetRepoHttpURL
                ],
                [
                    credentialsId: credentialsId,
                    name: env.gitlabSourceNamespace,
                    url: env.gitlabSourceRepoHttpURL
                ]
            ]
        ])
    } else {
        sh "echo 'No merge request detected. Checking out current branch'"
        checkout ([
            $class: 'GitSCM',
            branches: scm.branches,
            extensions: [
                    [$class: 'PruneStaleBranch'],
                    [$class: 'CleanCheckout']
            ],
            userRemoteConfigs: scm.userRemoteConfigs
        ])
    }
}

内容的提问来源于stack exchange,提问作者suyog nepal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:24:22