Jenkins跨节点重启流水线git checkout执行失败问题
问题根因
你配置的CleanBeforeCheckout不生效是必然的,它的作用只是在已有的Git仓库内执行git clean命令删除未跟踪文件,和你遇到的问题完全无关。
实际故障逻辑非常明确:
- Jenkins执行「重启构建」操作时,会自动从历史构建记录中读取上次运行缓存的SCM修订值——也就是上次构建时PreBuildMerge步骤在本地工作区生成的、从未推送到远端的临时合并提交哈希,自动注入到本次构建上下文里。
- Git插件检测到上下文里已经存在目标修订哈希,会直接跳过PreBuildMerge合并步骤,直接尝试检出该哈希。
- 由于你的构建每次会调度到不同的Jenkins节点,新节点上的工作区是全新初始化的,既没有执行过合并操作生成该临时提交,也不可能从远端拉取到这个仅存在于旧节点工作区的本地提交,自然会抛出检出失败的错误。
修复方案
不需要修改Jenkins任务的全局配置,直接在Jenkinsfile里做两处调整即可彻底解决:
- 在checkout逻辑前调用Pipeline内置的
deleteDir()步骤,直接递归删除当前工作区的所有内容,清理力度远高于Git插件自带的各类clean扩展,彻底规避本地残留文件、Git元数据的干扰。 - 调整Git插件扩展配置:
- 删除原有的
CleanBeforeCheckout配置,替换为WipeWorkspace做双保险,确保Git插件执行操作前工作区完全干净 - 新增
BuildChooserSetting扩展,指定使用默认构建选择器,强制每次构建重新从远端拉取引用、计算待检出版本、执行PreBuildMerge逻辑,完全忽略历史构建缓存的修订哈希 - (可选)新增
CloneOption配置设置fetch超时时间,减少网络波动导致的偶发失败概率
- 删除原有的
修正后的完整checkout代码
// Checkout前强制清空整个工作区 deleteDir() gitBranches = [[name: 'origin/pull-requests/**'], [name:"origin/$fromBranch"]] gitExtensions = [ [ $class: 'UserIdentity', email: email, name: name ], [ $class: 'PreBuildMerge', options: [ fastForwardMode: 'FF', mergeRemote : 'origin', mergeTarget : toBranch ] ], [ $class: 'WipeWorkspace' ], [ $class: 'BuildChooserSetting', buildChooser: [$class: 'DefaultBuildChooser'] ], [ $class: 'CloneOption', timeout: 30 ] ] println "Cloning repo with url '$gitUrl'" checkout changelog: true, poll: true, scm: [ $class : 'GitSCM', branches : gitBranches, doGenerateSubmoduleConfigurations: false, extensions : gitExtensions, gitTool : 'Default', submoduleCfg : [], userRemoteConfigs : [[credentialsId: credentialsId, url: gitUrl]] ]
效果验证
配置调整后,不管是首次构建还是从UI重启构建、不管构建调度到哪个节点,Git插件都会执行完整流程:拉取远端代码→执行PreBuildMerge合并→检出合并后的版本,不会再出现跳过合并步骤、找不到临时提交哈希的错误。
内容的提问来源于stack exchange,提问作者wquinoa
相关产品推荐
相关产品推荐

