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

Jenkins触发从节点拉取代码失败,本地执行命令却成功

问题:Jenkins从节点GitSCM拉取子模块失败(Host key verification failed)

问题场景

我在Jenkins从节点上运行一个用于代码编译打包的流水线任务,使用GitSCM拉取代码时失败,但直接登录从节点用cmd执行拉取命令却能成功。

流水线脚本

scmVars = checkout([$class: 'GitSCM',
                        branches: [[name: commitID]],
                        browser: bitbucketServer("http://***/projects/projectname/repos/projectname/"),
                        extensions: [[$class: 'CloneOption', timeout: 1200, honorRefspec: true],
                                    [$class: 'BuildChooserSetting',
                                        buildChooser: [$class: 'DefaultBuildChooser']],
                                    [$class: 'RelativeTargetDirectory',
                                    relativeTargetDir: '{projectname}'],
                                    [$class: 'LocalBranch',
                                        localBranch: "**"],
                                    [$class: 'SubmoduleOption',
                                        disableSubmodules: false,
                                        parentCredentials: true,
                                        recursiveSubmodules: true,
                                        reference: '',
                                        trackingSubmodules: false,
                                        timeout: 1200]],
                        gitTool: 'Default',
                        userRemoteConfigs: [[refspec: refSpec, url: 'ssh://git@****:7999/projectname/projectname.git']]
                    ])

异常信息

ERROR: Execution failed
08:08:09
hudson.plugins.git.GitException: Command "C: \Program Files\Git\cmd\git.exe submodule update -init -recursive gemp_gst" returned status code 1:
08:08:09
stdout:
08:08:09
stderr: Cloning into 'path'…
08:08:09
Host key verification failed.
08:08:09
fatal: Could not read from remote repository.

手动执行结果(成功)

直接登录从节点执行以下命令可成功拉取代码:

git clone ssh://git@***:7999/projectname.git

cloning into 'projectname'
done.
remote: Compressing objects: 100% (1324/1324), done.
Receiving objects: 12% (133671/1049750), 445.31 MiB | 8.08 MiB/s

解决方案

1. 核对Jenkins从节点服务的运行用户

手动拉取用的是个人用户,而Jenkins从节点服务通常运行在本地系统账户或专用服务账户下,这些账户的~/.ssh/known_hosts中未添加Git服务器的主机密钥,导致子模块拉取时验证失败。

2. 给Jenkins服务账户添加Git服务器主机密钥

  • 找到Jenkins从节点服务对应的运行账户(Windows常见为NT AUTHORITY\SYSTEM,Linux为jenkins用户)
  • 切换至该用户环境执行操作:
    • Windows:以管理员身份运行runas /user:NT AUTHORITY\SYSTEM cmd.exe,在弹出的命令行中执行ssh-keyscan -t rsa git@***:7999 >> %USERPROFILE%\.ssh\known_hosts
    • Linux:切换到jenkins用户sudo su - jenkins,执行ssh-keyscan -t rsa git@***:7999 >> ~/.ssh/known_hosts
    • 也可以手动连接一次Git服务器:ssh git@***:7999,输入yes确认主机密钥

3. 检查子模块URL配置

确认项目根目录下的.gitmodules文件中,子模块的URL与主项目一致,均为ssh://git@****:7999/...格式,避免子模块使用未配置密钥的其他地址。

4. 调整流水线配置(可选)

如果上述操作无效,可在流水线中添加前置步骤手动配置:

stage('配置SSH环境') {
    steps {
        script {
            sh 'ssh-keyscan -t rsa git@***:7999 >> ~/.ssh/known_hosts'
        }
    }
}

内容的提问来源于stack exchange,提问作者Alvin Lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 10:05:10