Jenkins Gerrit Trigger插件代码拉取失败求助
问题现象
已完成Gerrit Trigger插件配置,Jenkins任务可被Gerrit事件成功触发,但Git插件拉取代码时失败,控制台报错如下:
git fetch --tags --force --progress -- ssh://jenkins_user@:/software/ refs/heads/master # timeout=10 ERROR: Checkout failed java.lang.NullPointerException at com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTriggerBuildChooser$GetGerritEventRevision.invoke(GerritTriggerBuildChooser.java:222) at com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTriggerBuildChooser$GetGerritEventRevision.invoke(GerritTriggerBuildChooser.java:213) at hudson.plugins.git.GitSCM$BuildChooserContextImpl.actOnBuild(GitSCM.java:1066) at com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.GerritTriggerBuildChooser.getCandidateRevisions(GerritTriggerBuildChooser.java:109) at hudson.plugins.git.GitSCM.determineRevisionToBuild(GitSCM.java:1148) at hudson.plugins.git.GitSCM.checkout(GitSCM.java:1306) at org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:129) at org.jenkinsci.plugins.workflow.cps.CpsScmFlowDefinition.create(CpsScmFlowDefinition.java:159) at org.jenkinsci.plugins.workflow.cps.CpsScmFlowDefinition.create(CpsScmFlowDefinition.java:70) at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:312) at hudson.model.ResourceController.execute(ResourceController.java:101) at hudson.model.Executor.run(Executor.java:442) ERROR: Maximum checkout retry attempts reached, aborting Finished: FAILURE
已完成的排查操作
- 可在Jenkins主节点本地拉取目标仓库(不含Gerrit变更),凭证有效
- 将Git插件的「选择策略」改为「默认」,手动覆盖refspec和分支(不使用Gerrit变量),拉取成功
- 尝试修改refspec为
refs/changes/:refs/changes/*(提示“Specification is invalid.”)、构建分支为*$GERRIT_REFSPEC等多种组合,均无效 - Gerrit Trigger、Git及Git Client插件已更新至最新版本
- 修改任务的「Name」字段,匹配其他未使用Gerrit Trigger的正常任务,问题依旧
- 调整仓库URL为
$GERRIT_SCHEME://jenkins_user@$GERRIT_HOST:$GERRIT_PORT/$GERRIT_PROJECT,未解决问题
当前环境版本
- Jenkins:2.401.1
- Git插件:5.2.0
- Gerrit Trigger插件:2.39.1
- Git Client插件:4.5.0
解决思路建议
检查Gerrit事件变量传递完整性
报错中的NullPointerException说明Gerrit Trigger传递给Git插件的事件数据存在缺失。进入Jenkins任务的「构建触发器」配置,确认「Gerrit Trigger」的「Advanced」选项中是否勾选了对应事件类型,同时检查Gerrit服务器配置是否正确传递GERRIT_REFSPEC、GERRIT_PROJECT等核心变量。修正Refspec格式
有效的Gerrit变更refspec格式应为refs/changes/*:refs/changes/*,之前的配置缺少通配符导致格式无效。配置Git插件时设置该Refspec,同时将分支指定为$GERRIT_BRANCH,构建选择策略保持为Gerrit Trigger默认选择器。验证Gerrit权限与SSH配置
确认Gerrit服务器中jenkins_user账号拥有对应项目的「Read」权限,且Jenkins凭证中的私钥与Gerrit账号公钥匹配。同时检查Gerrit服务器是否允许Jenkins节点的IP访问。降级Git插件版本
最新版Git插件(5.2.0)可能与Gerrit Trigger插件(2.39.1)存在兼容性问题,尝试将Git插件降级至5.0.0或更低版本,同时保持Git Client插件版本匹配,验证是否解决空指针问题。开启Gerrit Trigger DEBUG日志
在Jenkins的「Manage Jenkins」→「System Log」中开启Gerrit Trigger的DEBUG日志,查看触发构建时是否有事件数据丢失的报错,定位变量传递失败的具体原因。
内容的提问来源于stack exchange,提问作者cberk1

