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
相关产品推荐
相关产品推荐

