Docker安装Jenkins,使用ssh的方式从Gitlab拉取代码permission denied

> 写在前头,用了两台阿里云的服务器,其中一台搭Jenkins,一台搭Gitlab,以http的方式拉取没问题,但是以ssh的方式就一直报错,说没有权限,我明明秘钥私钥都设置了。大概折腾了2天时间,发现是ssh端口的问题。 特此写个博客,希望能帮助大家~

1、我的Gitlab配置

# 运行Gitlab 		#  -p 映射端口 
[root@pihao ~]# docker run -d  -p 443:443 -p 8090:80 -p 222:22 --name gitlab -v /home/gitlab/config:/etc/gitlab -v /home/gitlab/logs:/var/log/gitlab -v /home/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce

# gitlab.rb改动的配置
    external_url 'http://112.74.167.52'   # gitlab访问主页
    gitlab_rails['gitlab_shell_ssh_port'] = 22 # ssh的端口
    gitlab_rails['gitlab_shell_git_timeout'] = 800  #连接超时时间
# gitlab.yml中改动的配置
	 gitlab:
        host: 112.74.167.52
        port: 80 # 这里的端口没变,只是使用8090做的端口映射
        https: false
# 配置完以上即可访问gitlab的主页  http://112.74.167.52:8090

2、Gitlab搭建完毕之后,Jenkins配置

在这之前呢,我在gitlab上创建了一个工程,然后使用了eclipse上传了一个工程代码带gitlab上,上传的时候注意添加映射的端口8090

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rhuhIsXe-1591809014510)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200611001242879.png)]

# 启动Jenkins容器,注意,这是另一个台服务器哦
[root@pihao2 ~]#docker run -d -p 8089:8080 -p 50000:50000 -v jenkins:/var/jenkins_home -v /etc/localtime:/etc/localtime --name jenkins jenkins

[root@pihao2 ~]# 启动成功,则可以访问jenkins界面: http://主机ip:8089,第一次进入输出密码验证,,,这些都略了。。。

接下来使用Jenkins拉取,首先在Jenkins的插件中安装好了Git插件,还有一个授权的插件Credentials Binding Plugin

3、Jenkins拉取代码

http拉取
  • 先在凭据中设置username和password

dockerfile秘钥拉取gitlab docker gitlab ssh_Jenkins

  • 复制gitlab仓库的地址

dockerfile秘钥拉取gitlab docker gitlab ssh_Jenkins_02

  • 构建jenkins工程

dockerfile秘钥拉取gitlab docker gitlab ssh_git_03

  • 点击应用保存
  • 点击立即构建,查看构建信息

dockerfile秘钥拉取gitlab docker gitlab ssh_ssh_04

使用ssh方法拉取(重点)

使用ssh的方法拉取的话先在本地生成公钥和私钥,注意,公钥(id_rsa.pub)保存到gitlab中,私钥(id_rsa)保存到jenkins中

注意:这里要强调一点,有些同学刚开不知道这个公钥和私钥要建在那个服务器上,这个很简单,就是你想在那台服务器上从gitlab中拉取代码,那么你就建在那个服务器上,而我这里是使用Jenkins从gitlab拉取代码,而jenkins又是以docker容器的方式运行的,那么我就在jenkins这个容器中来产生秘钥。

[root@iZwz9eq1jai7e87n6vw5liZ /]# docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS             
edc95b89615a        jenkins/jenkins:lts   "/sbin/tini -- /usr/…"   27 hours ago        Up 27 hours         0.0.0.0:50000>50000/tcp, 0.0.0.0:8089->8080/tcp   jenkins
# 进入jenkins容器
[root@iZwz9eq1jai7e87n6vw5liZ /]# docker exec -it edc95b89615a /bin/bash
jenkins@edc95b89615a:/$ cd /var/jenkins_home/
# 生成秘钥 ssh-keygen -t rsa
jenkins@edc95b89615a:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/var/jenkins_home/.ssh/id_rsa): # 这里直接回车
Created directory '/var/jenkins_home/.ssh/'.
Enter passphrase (empty for no passphrase): # 直接回车
Enter same passphrase again: # 直接回车
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:KKmNWa8PG65YJynchaRLahTfbJvumybPxOBHTGOwyNI root@iZwz9eq1jai7e87n6vw5liZ
The key's randomart image is:
+---[RSA 2048]----+
|   .             |
|... o            |
|.+Eo +           |
|. = B...         |
| + ++B. S        |
|= +B*oo          |
|o+Bo=*.          |
|.+ ==*.          |
|. ..OOo          |
+----[SHA256]-----+
[root@iZwz9eq1jai7e87n6vw5liZ /]# 好了到了,秘钥已经生成
jenkins@edc95b89615a:~/.ssh$ ls
config  id_rsa(私钥)  id_rsa.pub(公钥)   # 生成的秘钥

gitlab配置公钥

dockerfile秘钥拉取gitlab docker gitlab ssh_git_05

jenkins配置私钥

dockerfile秘钥拉取gitlab docker gitlab ssh_docker_06

dockerfile秘钥拉取gitlab docker gitlab ssh_git_07

jenkins使用ssh的方式构建

dockerfile秘钥拉取gitlab docker gitlab ssh_Jenkins_08

正常来说,走到这里应该是没有问题的,但是很多小伙伴在使用ssh方式拉取代码的时候老是提示permission denied的。

其实是那个端口的问题,在这里,我之前映射的端口是222,而这里并没有配置去访问222这个端口的,在你的jenkins容器中的.ssh文件中添加配置如下;

jenkins@edc95b89615a:~/.ssh$ ls
config  id_rsa  id_rsa.pub  known_hosts
jenkins@edc95b89615a:~/.ssh$ cat config
Host 112.74.167.34 # gitlab服务器主机端口
User pihao # gitlab配置公钥的那个账号
Port 222 #gitlab那个映射22的端口(如果没有用222映射的那一步就不用配置了)
IdentityFile /var/jenkins_home/.ssh/id_rsa # 私钥所在路径
jenkins@edc95b89615a:~/.ssh$ #配置完毕

最后测试发现ok!!!,期间还有很多小问题,就不一一叙述了。

只要学不死,就往死里学,现在2020/06/11 凌晨 01:14 ,加油吧~~~