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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 14:01:04