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确认主机密钥
- Windows:以管理员身份运行
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
相关产品推荐
相关产品推荐

