You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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对应项目 → SettingsRepositoryDeploy keysAdd deploy key,粘贴公钥内容,勾选Allow write access(如果后续需要推送代码的话,拉取可以不勾),点击保存。
  • 拉取该GitLab用户下的多个项目:加到用户的SSH密钥
    点击GitLab右上角头像 → SettingsSSH KeysAdd key,粘贴公钥内容后保存。

3. 修正Jenkins的SSH凭据配置

你之前犯了一个关键错误:SSH凭据需要的是私钥,不是公钥!你添加的是id_rsa.pub(公钥),但Jenkins拉取代码时需要用私钥来认证。

修复步骤:

  • 在Jenkins里进入Manage JenkinsManage 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 ~/.sshchmod 600 ~/.ssh/id_rsa修正)
  • 你的GitLab是否是私有部署的?如果是,要确认容器能解析GitLab的域名,网络能连通。

最后重新运行流水线

做完上面的步骤后,重新触发你的Jenkins流水线,应该就能正常拉取GitLab代码了。

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

火山引擎 最新活动