CI/CD笔记-Jenkins与gitlab实现CICD

一、jenkins与gitlab互联

  1. 安装gitlab相关的插件
  2. 在jenkins服务机器上生成 ssh key
  3. 登陆gitlab配置ssh密钥-公钥
  4. 在jenkins上配置到gitlab无交互式拉取代码
    4.1 jenkins服务器上查看私钥
    4.2 jenkins控制台添加私钥
    gitlab上创建token
  5. 创建任务
    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已经自动安装了

CI/CD笔记-Jenkins与gitlab实现CICD

CI/CD笔记-Jenkins与gitlab实现CICD

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密钥-公钥
CI/CD笔记-Jenkins与gitlab实现CICD

CI/CD笔记-Jenkins与gitlab实现CICD

在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 - 全局凭据-添加凭据

CI/CD笔记-Jenkins与gitlab实现CICD

CI/CD笔记-Jenkins与gitlab实现CICD

4.1 jenkins服务器上查看私钥


bash-5.0# cat ~/.ssh/id_rsa
# 然后将其复制到下图的公钥中

4.2 jenkins控制台添加私钥
CI/CD笔记-Jenkins与gitlab实现CICD

CI/CD笔记-Jenkins与gitlab实现CICD

其实凭据也可以是通过gitlab里创建的token,来实现jenkins与gitlab互联的

gitlab上创建token

用户头像---setting---access tokens

CI/CD笔记-Jenkins与gitlab实现CICD

CI/CD笔记-Jenkins与gitlab实现CICD

还有几种方式创建凭据

CI/CD笔记-Jenkins与gitlab实现CICD

5. 创建任务
5.1 创建任务- 配置项目git地址- 选择配置的ssh证书- 立即构建
CI/CD笔记-Jenkins与gitlab实现CICD
CI/CD笔记-Jenkins与gitlab实现CICD
5.2 项目仓库上面配置好了,没有报错表示jenkins可以从gitlab拉取代码了,点击立即构建
CI/CD笔记-Jenkins与gitlab实现CICD

CI/CD笔记-Jenkins与gitlab实现CICD

5.3 查看控制台输出,验证构建结果
CI/CD笔记-Jenkins与gitlab实现CICD

CI/CD笔记-Jenkins与gitlab实现CICD

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命令如何自动将服务部署起来

CI/CD笔记-Jenkins与gitlab实现CICD

5.7 通过shell命令的方式触发服务部署步骤【为了测试效果】
CI/CD笔记-Jenkins与gitlab实现CICD

CI/CD笔记-Jenkins与gitlab实现CICD

# 脚本内容如下

# 实现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 查看控制台输出
CI/CD笔记-Jenkins与gitlab实现CICD

5.9 访问服务
CI/CD笔记-Jenkins与gitlab实现CICD

更新代码,提交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 修改全局权限
修改为所有登陆用户可以任何操作

CI/CD笔记-Jenkins与gitlab实现CICD

6.4 创建一个开发分支的任务
首页-新建任务-输入任务名-选择Freestyle project的方式创建

CI/CD笔记-Jenkins与gitlab实现CICD

注:构建的任务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 通过触发远程构建的方式构建触发器
CI/CD笔记-Jenkins与gitlab实现CICD

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构建部署操作

CI/CD笔记-Jenkins与gitlab实现CICD

本次选择的是当仓库有更新事件发生是触发

CI/CD笔记-Jenkins与gitlab实现CICD

6.9 gitlab上测试效果
test报错403错误时Hook executed successfully but returned HTTP 403,我们须要进入jenkins 系统设置-Configure Global Security中,关闭(去掉勾选:防止跨站点请求伪造),然后在点击gitlab webhooks test OK 返回201 成功。

CI/CD笔记-Jenkins与gitlab实现CICD

CI/CD笔记-Jenkins与gitlab实现CICD
老版本的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

CI/CD笔记-Jenkins与gitlab实现CICD

CI/CD笔记-Jenkins与gitlab实现CICD
再次在gitlab上测试,发现ok了。

CI/CD笔记-Jenkins与gitlab实现CICD

好了,通过Jenkins联动gitlab实现推送代码到仓库就自动部署就到这里了,我这里只是管中见豹,Jenkins发布还有通过pipline流水线方式,设置每步执行的任务,可视图方式查看每步执行过程,还有Jenkins单点压力过大,也支持搭建分布式等等,有很多方式就待我们一起去探索发现吧……

上一篇:测试开发CICD——Docker——docker run —— 创建一个新的容器并运行一个命令


下一篇:基于docker构建cicd平台