一、jenkins与gitlab互联
- 安装gitlab相关的插件
- 在jenkins服务机器上生成 ssh key
- 登陆gitlab配置ssh密钥-公钥
- 在jenkins上配置到gitlab无交互式拉取代码
4.1 jenkins服务器上查看私钥
4.2 jenkins控制台添加私钥
gitlab上创建token - 创建任务
5.1 创建任务- 配置项目git地址- 选择配置的ssh证书- 立即构建
5.2 项目仓库上面配置好了,没有报错表示jenkins可以从gitlab拉取代码了,点击立即构建
5.3 查看控制台输出,验证构建结果
5.4 去jenkins服务上验证项目是否pull下来了
5.5 在jenkins服务器上配置与后端服务器互联
5.6 在jenkins上配置构建
5.7 通过shell命令的方式触发服务部署步骤【为了测试效果】
5.8 查看控制台输出
5.9 访问服务
6 创建触发器
6.1 代码仓库创建测试分支
6.2 jenkins安装插件
6.3 修改全局权限
6.4 创建一个开发分支的任务
6.5 生成一个token
6.6 通过触发远程构建的方式构建触发器
6.7 验证触发器
6.8 在gitlab上配置触发器hook
6.9 gitlab上测试效果
一、jenkins与gitlab互联
1. 安装gitlab相关的插件
在可用的插件处搜索gitlab插件
GitLab、Gitlab Authentication、GitLab Logo
Blue Ocean 最新版的jenkins已经自动安装了
2. 在jenkins服务机器上生成 ssh key
要想自动化让jenkins从gitlab上拉取代码,就需要配置ssh密钥,这样验证时就不用输入密码等操作了
# 如果是镜像部署jenkins的方式需求进入容器
docker exec -it 容器id /bin/bash
# 创建ssh密钥
ssh-keygen
# 查看生成的公钥 ~/.ssh/id_rsa.pub
cat /root/.ssh/id_rsa.pub
bash-5.0# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.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:NELUf0otf4+lY24wF5Lmt/lDCkUWGNJ+EALe+6OIocE root@ab165f23961b
The key's randomart image is:
+---[RSA 3072]----+
| .oo.o.o+.. |
| .. o o+ o |
| ..oo..+. |
| o .=.*o. |
| So Bo. . |
| . o.= +..|
| E . o.*oB |
| o o . . ..O..|
| . . . . +.oo|
+----[SHA256]-----+
# 查看私钥
bash-5.0# cat /root/.ssh/id_rsa
id_rsa id_rsa.pub
# 查看公钥
bash-5.0# cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDR3yL8WPCyZ1YdPZ0ndBpxpUZd5sxqpBg8AgsWMt8aYu5tzU7/4XrKMNaDVBHfhWFjgErY7WUhz4ZZtKF0vBdxrwAJFGcE/iytnyWIjm8NA9743osdcdEjkqwhr2g9/UmTh37Dfa1OqdEsecwRFeBu6KFdlFSlcXsaOKESq1QEDf96C+5u4uCavMvZj5PBAw5ekx22NaTWPEmGI/2xygn0yEeWvPrUzkX0M5EE64mczL/O/W/bW1RdvVaUBByvIytNDdQ1vUVvaoA+kR/t77H6jQ8C3Lr4y5SpA4I7pxMX/VSVzd9LhO60Bn8y18E8+hLLPOSEUbxWtS6WJ//pQj63cD7sL+e9nmRSVDwoCoDsCv9Bi0yR0Ub8NyQW+GgofRXdgDrOdR/Gqt4etq7OIIfslga7+TuSwsHARpxpbaenLu0AYYTYXVX4uEYsPLRlj3ebAlaz/0zXCKM9qIEfrCZZ1fm1PcQ5MQwohRA1log/dzegYFQ9ZN3Rd3raMj9g9CM= root@ab165f23961b
3. 登陆gitlab配置ssh密钥-公钥
在jenkins服务器上无需输入账密拉取代码
bash-5.0# git clone git@192.168.0.152:makemoney/testproject01.git
Cloning into 'testproject01'...
The authenticity of host '192.168.0.152 (192.168.0.152)' can't be established.
ECDSA key fingerprint is SHA256:LsgUyXjraZbqPdGdwEgGnLHsbsREzqj5JJUmHerQ9oc.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.0.152' (ECDSA) to the list of known hosts.
remote: Enumerating objects: 11, done.
remote: Counting objects: 100% (11/11), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 11 (delta 2), reused 0 (delta 0)
Receiving objects: 100% (11/11), done.
Resolving deltas: 100% (2/2), done.
4. 在jenkins上配置到gitlab无交互式拉取代码
jenkins - 系统管理-ManageCredentials - 全局凭据-添加凭据
4.1 jenkins服务器上查看私钥
bash-5.0# cat ~/.ssh/id_rsa
# 然后将其复制到下图的公钥中
4.2 jenkins控制台添加私钥
其实凭据也可以是通过gitlab里创建的token,来实现jenkins与gitlab互联的
gitlab上创建token
用户头像---setting---access tokens
还有几种方式创建凭据
5. 创建任务
5.1 创建任务- 配置项目git地址- 选择配置的ssh证书- 立即构建
5.2 项目仓库上面配置好了,没有报错表示jenkins可以从gitlab拉取代码了,点击立即构建
5.3 查看控制台输出,验证构建结果
5.4 去jenkins服务上验证项目是否pull下来了
默认拉取的代码放在目录中cd /var/lib/jenkins/workspace/,仓库的代码放在以之间创建任务名为目录名的目录里
bash-5.0# cd workspace/testproject-testconnect
bash-5.0# ls -lrt
total 12
-rw-r--r-- 1 root jenkins 21 Nov 29 05:37 index.html
-rw-r--r-- 1 root jenkins 35 Nov 29 05:37 first-test.txt
-rw-r--r-- 1 root jenkins 62 Nov 29 05:37 README.md
5.5 在jenkins服务器上配置与后端服务器互联
### 首先得让jenkins与后端服务器无密连接
# 生成密钥,这步刚才已经做了省略
ssh-keygen
# 将jenkins的公钥复制到后端预安装服务的机器上【本地的ssh公钥文件安装到远程主机对应的账户下authorized_keys】
ssh-copy-id 远端服务的ip
[root@python-node01 ~]# ssh-copy-id 192.168.0.150
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.0.150's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '192.168.0.150'"
and check to make sure that only the key(s) you wanted were added.
# 然后测试下ssh登陆,时候需要密码
ssh 192.168.0.150
5.6 在jenkins上配置构建
构建就是配置脚本或shell命令如何自动将服务部署起来
5.7 通过shell命令的方式触发服务部署步骤【为了测试效果】
# 脚本内容如下
# 实现jenkins与生产服务器的免密登陆[如果下面这样写了,上面就不用手动在jenkins服务器上操作了]
#ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.0.150
# 切换目录到代码目录
cd /var/lib/jenkins/workspace/power-test01
# 打包压缩代码
tar czvf code.tar.gz *
# 将代码拷贝到生产服务器上
scp code.tar.gz root@192.168.0.150:/app/code
# 关闭现在运行的服务
ssh root@192.168.0.150 "PID=\$(ps aux |grep -v grep |grep main.py|awk '{print \$2}');kill -9 \$PID"
# 解包并将代码复制到部署目录中
ssh root@192.168.0.150 "rm -rf /app/run/* && cd /app/code && tar xvf code.tar.gz -C /app/run"
# 安装项目依赖包并运行服务
ssh root@192.168.0.150 "cd /app/run && pip install -r requirements.txt && nohup python main.py >/dev/null 2>&1 &"
5.8 查看控制台输出
5.9 访问服务
更新代码,提交gitlab,然后jenkins点击任务的构建,服务就被更新了。
6 创建触发器
前面这种发现还是不够方便,开发人员更新代码后还需要手动操作jenkins构建,感觉还是很麻烦,那么解决方案就是创建触发器的方式,即当监控某个分支代码有变动时自动调用jenkins进行部署
6.1 代码仓库创建测试分支
# ide或git操作界面,换到项目中,然后创建分支
cd ~/test-gitlab02/ && git branch dev-20201227 && git add . && git commit -m "test hook"
6.2 jenkins安装插件
系统管理-管理插件-可选插件-Gitlab Hook和Gitlab Authentication[之前已安装]
6.3 修改全局权限
修改为所有登陆用户可以任何操作
6.4 创建一个开发分支的任务
首页-新建任务-输入任务名-选择Freestyle project的方式创建
注:构建的任务job配置文件,在jenkins服务器的如下位置
[root@jenkins power-test01]# ll /var/lib/jenkins/jobs/
总用量 0
drwxr-xr-x 3 root root 61 12月 27 23:50 power-dev
drwxr-xr-x 3 jenkins jenkins 61 12月 27 20:52 power-test01
6.5 生成一个token
jenkins机器上创建一个token
[root@jenkins power-test01]# openssl rand -hex 12
c8b2faf57578b62cb7b75105
6.6 通过触发远程构建的方式构建触发器
6.7 验证触发器
curl http://192.168.0.153:8080/job/power-dev/build?token=c8b2faf57578b62cb7b75105
# 发现访问一次dev的任务就构建了一次,实验成功
6.8 在gitlab上配置触发器hook
在gitlab上配置触发器hook,从而实现push代码是,触发配置的url,从而联动jenkins构建部署操作
本次选择的是当仓库有更新事件发生是触发
6.9 gitlab上测试效果
test报错403错误时Hook executed successfully but returned HTTP 403,我们须要进入jenkins 系统设置-Configure Global Security中,关闭(去掉勾选:防止跨站点请求伪造),然后在点击gitlab webhooks test OK 返回201 成功。
老版本的jenkins是可以在安全配置里直接关闭csrf的,但Jenkins版本自2.204.6以来的重大变更有:删除禁用 CSRF 保护的功能。
需要修改jenkins配置文件/etc/sysconfig/jenkins
#JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true"
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true"
# 修改好后重启jenkins即可
systemctl restart jenkins && systemctl status jenkins
再次在gitlab上测试,发现ok了。
好了,通过Jenkins联动gitlab实现推送代码到仓库就自动部署就到这里了,我这里只是管中见豹,Jenkins发布还有通过pipline流水线方式,设置每步执行的任务,可视图方式查看每步执行过程,还有Jenkins单点压力过大,也支持搭建分布式等等,有很多方式就待我们一起去探索发现吧……