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
- 复制gitlab仓库的地址
- 构建jenkins工程
- 点击应用保存
- 点击立即构建,查看构建信息
使用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配置公钥
jenkins配置私钥
jenkins使用ssh的方式构建
正常来说,走到这里应该是没有问题的,但是很多小伙伴在使用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 ,加油吧~~~