Jenkins中Git Clone正常但Git Pull(SSH)失败的问题咨询
git pull时未复用SSH凭据的问题 我之前也碰到过一模一样的情况——Jenkins Git插件用SSH凭据克隆代码没问题,但自己敲git pull就炸了,报错和你完全一致。核心问题在于:Git插件是通过Jenkins的凭据系统来管理密钥的,但原生Git CLI根本不知道Jenkins的凭据存储,它只会按默认规则找SSH密钥和主机验证文件。下面是我试过的几个有效解决方案:
1. 用环境变量给Git CLI指定SSH密钥
直接通过GIT_SSH_COMMAND环境变量告诉Git该用哪个密钥,还能顺带跳过主机密钥验证(CI环境里这个操作很常见,安全性也能接受):
# 先把Jenkins存储的SSH私钥导出到临时文件(可以用凭据绑定插件把私钥放到SSH_PRIVATE_KEY环境变量里) echo "$SSH_PRIVATE_KEY" > /tmp/jenkins_ssh_key chmod 600 /tmp/jenkins_ssh_key # SSH密钥必须是600权限才有效 # 告诉Git用这个密钥执行SSH连接 export GIT_SSH_COMMAND="ssh -i /tmp/jenkins_ssh_key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" git pull origin master
如果你不知道怎么把Jenkins的SSH凭据导出到环境变量,记得装个Credentials Binding Plugin,在构建步骤里选"Bindings" -> "SSH User Private Key",就能把私钥绑定到自定义的环境变量里了。
2. 提前配置Jenkins用户的known_hosts
报错里的Host key verification failed本质是Git CLI找不到远程Git服务器的主机密钥。你可以提前把服务器的密钥加到Jenkins运行用户(一般是jenkins用户)的known_hosts文件里:
# 先扫描Git服务器的主机密钥,追加到jenkins用户的known_hosts里 ssh-keyscan xxx >> /var/lib/jenkins/.ssh/known_hosts # 给文件设置正确权限 chmod 600 /var/lib/jenkins/.ssh/known_hosts chown jenkins:jenkins /var/lib/jenkins/.ssh/known_hosts
做完这一步,再执行git pull就不会卡主机验证了,但还是要确保Git能找到私钥——要么把私钥放到/var/lib/jenkins/.ssh/id_rsa,要么还是用上面的GIT_SSH_COMMAND指定路径。
3. 别用Git CLI了,直接用Jenkins Git插件做pull
如果不想折腾命令行,最省心的办法就是用Jenkins自带的Git插件来执行拉取操作:在构建步骤里选"Git",然后配置"Branch Specifier"为*/master,再勾选"Pull before build"(或者直接配置拉取动作)。这样插件会自动复用之前配置的SSH凭据,完全不用管CLI的那套规则。
4. 检查Jenkins执行用户的权限
有时候构建步骤是用sudo或者其他用户执行的,导致Git CLI找不到Jenkins用户的SSH配置。你可以在构建步骤里先执行whoami看看当前用户是不是jenkins,如果不是,要么切换用户,要么给当前用户配置对应的SSH密钥。
内容的提问来源于stack exchange,提问作者DenCowboy

