Docker化Jenkins配置Git SSH连接遇公钥权限问题求助
解决Jenkins拉取GitLab代码时的Permission denied (publickey)问题
嘿,我来帮你搞定这个Git拉取的公钥权限问题——我之前在配置Jenkins+GitLab流水线时也踩过几乎一模一样的坑,给你梳理几个关键的排查和修复步骤:
1. 先搞清楚Jenkins实际用的是哪个用户的SSH密钥
你提到用的是Jenkins宿主机上admin用户的id_rsa.pub,但Jenkins容器内部默认是用jenkins用户运行的,宿主机的密钥和容器内的jenkins用户完全没关系!这是最常见的坑。
修复步骤:
- 进入你的Jenkins容器:
docker exec -it <你的Jenkins容器ID/名称> bash - 切换到容器内的
jenkins用户(默认就是这个用户,但保险起见确认下):su jenkins - 生成jenkins用户专属的SSH密钥对,一路回车用默认配置就行:
ssh-keygen -t rsa -b 4096 -C "jenkins-ci@your-project.com" - 查看生成的公钥内容,复制下来:
cat ~/.ssh/id_rsa.pub
2. 把正确的公钥配置到GitLab
你需要把刚才复制的jenkins用户公钥加到GitLab,分两种场景:
- 仅拉取单个项目:推荐用「部署密钥」
进入GitLab对应项目 →Settings→Repository→Deploy keys→Add deploy key,粘贴公钥内容,勾选Allow write access(如果后续需要推送代码的话,拉取可以不勾),点击保存。 - 拉取该GitLab用户下的多个项目:加到用户的SSH密钥
点击GitLab右上角头像 →Settings→SSH Keys→Add key,粘贴公钥内容后保存。
3. 修正Jenkins的SSH凭据配置
你之前犯了一个关键错误:SSH凭据需要的是私钥,不是公钥!你添加的是id_rsa.pub(公钥),但Jenkins拉取代码时需要用私钥来认证。
修复步骤:
- 在Jenkins里进入
Manage Jenkins→Manage Credentials - 找到你之前创建的那个SSH凭据,点击编辑
- 把刚才在容器内生成的
id_rsa(私钥)内容粘贴进去(注意是~/.ssh/id_rsa文件的全部内容,不是公钥) - 确认
Credentials ID和你流水线里的credentialsId: 'xxxxxxxxxxxxxxx'完全一致,保存修改。
4. 测试容器内的SSH连接(关键验证步骤)
在Jenkins容器内,用jenkins用户测试和GitLab的SSH连接,确认权限正常:
ssh -T git@gitlab.com
如果返回类似Welcome to GitLab, @你的用户名!的提示,说明公钥配置完全没问题;如果还是报错Permission denied,检查这几点:
- 公钥有没有正确粘贴到GitLab(不要有多余的空格或换行)
- 容器内jenkins用户的
~/.ssh目录权限是700,id_rsa文件权限是600(可以用chmod 700 ~/.ssh和chmod 600 ~/.ssh/id_rsa修正) - 你的GitLab是否是私有部署的?如果是,要确认容器能解析GitLab的域名,网络能连通。
最后重新运行流水线
做完上面的步骤后,重新触发你的Jenkins流水线,应该就能正常拉取GitLab代码了。
内容的提问来源于stack exchange,提问作者uncleBounty




