基于Jenkins CICD的代码发布与回滚-------从小白到大神之路之学习运维第87天

第四阶段提升

时 间:2023年8月24日

地 点:2304教室

授课人:李凤海

参加人:全班人员

内 容:

基于Jenkins CICD的代码发布与回滚

目录

一、案例概述

二、案例知识点

三、案例环境

[(一)基于 Jenkins+Git+Docker 发布 Java 项目](#(一)基于 Jenkins+Git+Docker 发布 Java 项目)

(二)案例需求

[(三)配置 Git 仓库](#(三)配置 Git 仓库)

[(四)配置 Docker服务器](#(四)配置 Docker服务器)

(五)部署镜像仓库

[(六)配置Jenkins 环境](#(六)配置Jenkins 环境)

[(七)Jenkins 创建项目并发布测试](#(七)Jenkins 创建项目并发布测试)

(八)版本回滚


本实验需要用到的软件:

apache-tomcat-8.5.40;jdk17-linux;jenkins-2.401.1.1;git-2.22.0;docker-24.0.5

centos:7镜像;tomcat:latest镜像

jenkins用到的插件:

****SSH:****用于SSH 远程Docker 主机执行Shell 命令。

****Git Parameter:****动态获取Git 仓库Branch、Tag。

一、 案例概述

在之前的jenkins持续集成章节中主要实现的是jenkins的项目构建及部署。那在本章将结合新项目来实现自动化构建及发布,并将项目打包成镜像上传到私有仓库,来实现一键发布和回滚等操作。

二、 案例知识点

1、Jenkins 介绍

Jenkins,原名 Hudson,2011 年改为现在的名字,它是一个开源的实现持续集成的软件工具。

官方网站:https://jenkins.io/。

Jenkins 能实施监控持续集成过程中所存在的问题,提供详细的日志文件和提醒功能, 还能用图表的形式直观地展示项目构建的趋势和稳定性。

2、Maven 介绍

Maven 项目对象模型(Project Object Model,POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。

3、Docker 介绍

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用及依赖包到任意一个可移植的镜像中,然后发布到任何流行的 Linux 机器上。

4、Ansible 介绍

Ansible 是一种自动化运维工具,基于 Python 开发,实现了批量系统配置、批量程序部署、批量运行命令等功能。

三、 案例环境

|-----------------|---------|---------------------|
| IP地址 | 主机名 | 角色 |
| 192.168.100.131 | git | Git/Docker registry |
| 192.168.100.132 | jenkins | Jenkins/Docker |
| 192.168.100.133 | tomcat | Docker |

(一) 基于 Jenkins+Git+Docker 发布 Java 项目

1、 所有主机上操作

root@localhost \~\]# setenforce 0 \[root@localhost \~\]# iptables -F \[root@localhost \~\]# systemctl stop firewalld

Git:

Jenkins:

Tomcat:

(二) 案例需求

开发者将开发完成的代码提交到 Git 代码版本仓库后,点击 Jenkins 任务按钮自动拉取代码编译构建,并自动部署到 Web 服务器,用户可访问最新项目版本。

(三) 配置 Git 仓库

Git 是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理, 是目前企业中使用最为广泛的代码版本管理系统。

1 使用 yum 安装 Git 并配置

root@git \~\]# yum -y install git \[root@git \~\]# useradd git \[root@git \~\]# echo "123456" \| passwd --stdin git

2 配置 Jenkins 主机免交互拉取 Git 仓库

在 Jenkins 主机上创建密钥对,将 id_rsa.pub 内容追加到 Git 服务器上的 /home/git/.ssh/authorized_keys 文件中。

复制代码
[root@jenkins ~]# ssh-keygen # 一路回车即可

[root@jenkins ~]# ssh-copy-id [email protected]

测试免交互登录

[root@jenkins ~]# ssh [email protected]

[git@git ~]$ exit

3 在Git 服务器创建probe版本仓库,一般对Git 的规范的方式要以.git 为后缀。如下:

复制代码
[root@git ~]# su - git

[git@localhost ~]$ mkdir probe.git

[git@localhost ~]$ cd probe.git

[git@localhost probe.git]$ git --bare init

[git@localhost probe.git]$ exit

4 从Github 拉取开源Java 博客系统psi-probe。

root@jenkins \~\]# git clone https://github.com/psi-probe/psi-probe.git \[root@jenkins \~\]# cd psi-probe/

5 移除旧的推送地址,添加新的Git 提交地址。如下:

root@jenkins psi-probe\]# git remote remove origin \[root@jenkins psi-probe\]# git remote add origin [[email protected]:/home/git/probe.git](mailto:[email protected]:/home/git/probe.git)

6 提交代码到Git 仓库并创建Tag。如下:

root@jenkins psi-probe\]# touch psi-probe-web/src/main/webapp/a.html

[root@jenkins psi-probe]# git add .

[root@jenkins psi-probe]# git config --global user.email " 13363571949 @163.com"

[root@jenkins psi-probe]# git config --global user.name " huyang "

[root@jenkins psi-probe]# git commit -m "a"

7 创建标签:

root@jenkins \~\]# git tag 1.0.0

8 推送到Git 服务器。如下:

root@jenkins \~\]# git push origin 1.0.0

(四) 配置 Docker服务器

1 安装Docker,在所有主机上操作

root@localhost \~\]# wget -O /etc/yum.repos.d/CentOS-Base.repo [http://mirrors.aliyun.com/repo/Centos-7.repo](http://mirrors.aliyun.com/repo/Centos-7.repo "http://mirrors.aliyun.com/repo/Centos-7.repo") ****\[root@localhost \~\]# yum -y install yum-utils device-mapper-persistent-data lvm2****

root@localhost \~\]# yum-config-manager --add-repo [http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo](http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo "http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo") \[root@localhost \~\]# ls /etc/yum.repos.d/

root@localhost \~\]# yum -y install docker-ce

[root@localhost ~]# systemctl start docker

[root@localhost ~]# systemctl enable docker

[root@docker ~]# docker version

2 git主机 配置阿里云镜像加速器

root@docker \~\]# cat \<\< END \> /etc/docker/daemon.json { "registry-mirrors":\[ "https://nyakyfun.mirror.aliyuncs.com"

}

END

root@docker \~\]# systemctl daemon-reload \[root@docker \~\]# systemctl restart docker

(五) 部署镜像仓库

Docker Hub 作为 Docker 默认官方公共仓库;用户如果想自己搭建私有镜像仓库,官方提供了 registry 镜像,使其搭建私有仓库变的非常简单。

1 在git部署docker私有仓库

root@git \~\]# docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry \[root@git \~\]# docker ps -a \[root@git \~\]# docker images

2 测试 registry 可用性

由于 Docker CLI 默认以 HTTPS 访问,而部署的 registry 并未提供 HTTPS,因此,需要 在 pull 镜像的 Docker 主机添加 HTTP 可信任。

tomcat主机和 jenkins主机上操作 !!!

root@tomcat \~\]# cat /etc/docker/daemon.json \[root@tomcat \~\]# systemctl daemon-reload \[root@tomcat \~\]# systemctl restart docker

3 打标签并推送镜像到 registry

root@dtomcat \~\]# cat centos-7-x86_64.tar.gz \| docker import - centos:7 \[root@tomcat \~\]# docker tag centos:7 192.168.100.131:5000/centos:7 \[root@tomcat \~\]# docker push 192.168.100.131:5000/centos:7

4 查看 registry 上传的镜像:

root@tomcat \~\]# curl http://192.168.100.131:5000/v2/_catalog \[root@tomcat \~\]# curl http://192.168.100.131:5000/v2/centos/tags/list

5 从 registry 下载镜像:

root@tomcat \~\]# docker rmi 192.168.100.131:5000/centos:7 \[root@tomcat \~\]# docker pull 192.168.100.131:5000/centos:7 \[root@tomcat \~\]# docker images

6 构建 Tomcat 基础镜像

在jenkins和docker主机上安装JDK:

root@tomcat \~\]# tar xf jdk-8u191-linux-x64.tar.gz \[root@tomcat \~\]# mv jdk1.8.0_191/ /usr/local/java

root@tomcat \~\]# ls -l apache-tomcat-8.5.40.tar.gz \[root@tomcat \~\]# cat Dockerfile

root@tomcat \~\]# docker build -t 192.168.100.131:5000/tomcat-85 . \[root@tomcat \~\]# docker images

7 构建镜像并上传到registry:

root@tomcat docker-tomcat\]# docker push 192.168.100.131:5000/tomcat-85

(六) 配置Jenkins 环境

Jenkins 是一个开源软件项目,是基于 Java 开发的一种持续集成工具,用于代码编译、 部署、测试等工作。 Jenkins 也是一个跨平台的集成工具,大多数主流的平台都支持,而且安装很简单,这里将以部署 war 包方式安装。

官 网 下 载 地 址 : https://jenkins.io/download/

1 修改jenkins运行用户

root@jenkins \~\]# vim /etc/sysconfig/jenkins ****JENKINS_USER="root"****

[root@jenkins ~]#jenkins start 打断后再执行

2 Jenkins 配置全局工具配置

在 Jenkins 首页中点击"Manage Jenkins"->"Global Tool Configuration"->"JDK" ->新增"JDK",设置 JDK 别名为"JDK17"。去掉"Install automatically"选项,设置 "JAVA_HOME"为本案例中 JDK 实际安装路径。

[root@jenkins ~]# tar xf jdk- 17_ linux-x64.tar.gz

[root@jenkins ~]# mv jdk1 7.0.8 / /usr/local/java

[root@jenkins ~]# vim /etc/profile

root@jenkins \~\]# rm -rf /usr/bin/java \[root@jenkins \~\]# source /etc/profile \[root@jenkins \~\]# java -version

3、访问测试:http://192.168.100.132:8080/job/probe/

如图操作:配置JDK(JDK17,/usr/local/java)

4、配置maven

在"Global Tool Configuration"配置界面中找到 Maven 配置选项,然后点击"新增 Maven"并设置别名为"Maven3.5"。

[root@jenkins ~]# tar xf apache-maven-3.5.0-bin.tar.gz

[root@jenkins ~]# mv apache-maven-3.5.0 /usr/local/maven-3.5.0

为maven更换阿里云镜像站

root@jenkins \~\]# vim /usr/local/maven-3.5.0/conf/settings.xml ![](https://file.jishuzhan.net/article/1694699034192646145/7a58266d7ecb40ffb2bf9c7e1ba6ed94.png) ****5、Web操作:配置maven(maven-3.5.0,**** ****/usr/localmaven-3.5.0)**** ![](https://file.jishuzhan.net/article/1694699034192646145/20cd97bc0ec54e4b9b94b08bbc917a95.png) ****6、**** ****配置**** ****Git**** ****\[root@jenkins \~\]# which git**** ****/usr/bin/git**** ![](https://file.jishuzhan.net/article/1694699034192646145/cca049636f2f4c4ba29cb8658af5358a.png) ****以上全局基本配置完毕后,点击保存即可完成。**** ****7、**** ****Jenkins 安装必要插件**** Manage Jenkins-\>Plugins--\>安装SSH 插件---\> 安装Git Parameter 插件 ![](https://file.jishuzhan.net/article/1694699034192646145/6090c3fb760a4bbdbd0312f110b8ad71.png) ![](https://file.jishuzhan.net/article/1694699034192646145/1aea046cc0a44f6481e8724d25cae3fc.png) ****插件说明:**** > ****SSH:****用于SSH 远程Docker 主机执行Shell 命令。 > > ****Git Parameter:****动态获取Git 仓库Branch、Tag。 ****8、**** ****配置SSH 插件**** 创建一个用于连接Docker主机的凭据。Manage Jenkins-\>credentials-\>system-\>全局-\>add credentials ![](https://file.jishuzhan.net/article/1694699034192646145/95d1d4a89c5e459fa0e740bd28ce4c96.png) ****输入连接Docker 主机的用户名和密码**** ![](https://file.jishuzhan.net/article/1694699034192646145/e12fb3fe08724cc08ba7fa708603c65b.png) ****添加SSH 远程主机。**** Manage Jenkins-\> System,配置****SSH remote hosts****,输入内容如图: ****保存退出**** ![](https://file.jishuzhan.net/article/1694699034192646145/397513a991264406a00ce3a1d6279fd4.png) ## ****(七)**** ****Jenkins 创建项目并发布测试**** 主页面-\> 新建Item-\> 输入任务名称,构建一个Maven 项目 ![](https://file.jishuzhan.net/article/1694699034192646145/09bac8878c094ba19d5065c7bd01ab3b.png) ****注意:****如果没有显示"构建一个Maven 项目"选项,需要在管理插件里安装"MavenIntegration"插件。 ****1、**** ****动态获取Git 仓库tag,与用户交互选择Tag 发布**** ****,配置如图:**** ![](https://file.jishuzhan.net/article/1694699034192646145/60eccb05e1d74ae08823e683e67efbcb.png) ****2、**** ****指定项目Git 仓库地址**** ****,**** ****修改\*/master 为$Tag,Tag 是上面动态获取的变量名,表示根据用户选择打代码版本**** ![](https://file.jishuzhan.net/article/1694699034192646145/b04678fa46ab49e19423539cadf9844f.png) ****3、**** ****设置maven 构建命令选项"clean package -Dmaven.test.skip=true"**** ![](https://file.jishuzhan.net/article/1694699034192646145/458cbe94d15743a8a1d28b6d4c178b73.png) ****4、**** ****利用pom.xml 文件构建项目。**** 在Jenkins 本机镜像构建与推送到镜像仓库,并SSH远程连接到Docker 主机使用推送的镜像创建容器 ****选择Post Steps --\>Add post-build step -**** ****Execute**** ****shell,这样会调出第一个输入框**** ****,内容如下:**** ![](https://file.jishuzhan.net/article/1694699034192646145/75fc90301eeb459e8e9da7c114e45a6d.png) ****选择Post Steps --\>Execute shell script on remote host using ssh,这样会调出第二个输入框,内容如下:**** ![](https://file.jishuzhan.net/article/1694699034192646145/e8f5223055674e9ea1c8e0d962d695e7.png) ****pom.xml:**** 它是声明项目描述符遵循POM 模型版本。模型本身的版本很少改变,虽然如此,但它仍然是必不可少的,这是为了当Maven 引入新的特性或者其他模型变更的时候,确保稳定性。 ****第一个命令框内容**** > REPOSITORY=192.168.100.131:5000/probe:${Tag} > > # 构建镜像 > > cat \> Dockerfile \<\< EOF > > FROM 192.168.100.131:5000/tomcat-85:latest > > RUN rm -rf /usr/local/tomcat/webapps/ROOT > > COPY psi-probe-web/target/\*.war /usr/local/tomcat/webapps/ROOT.war > > CMD \["/usr/local/tomcat/bin/catalina.sh", "run"

EOF

docker build -t $REPOSITORY ./

上传镜像

docker push $REPOSITORY

第二个命令框内容

REPOSITORY=192.168.100.131:5000/probe:${Tag}

部署

docker rm -f probe |true

docker images rm $REPOSITORY|true

docker container run -d --name probe -v /usr/local/java:/usr/local/java -p 8090:8080 $REPOSITORY

注意:从部署命令当中可以看到最后一行容器名称是probe,暴露宿主机端口8090,即使用宿主机IP:8090 就可以访问probe项目。

5、 probe项目已配置完成,开始构建

6、 选择tag,开始构建

7、 在任务控制台输出构建日志的开始信息

8、 在任务控制台输出构建日志的结束信息

9、执行成功之后,结果测试:

Git主机:

Jenkins主机:

Tomcat主机:

浏览器访问 http://192.168.100.133:8090

(八) 版本回滚

****回滚(Rollback)****指的是程序或数据处理错误,将程序或数据恢复到上一次正确版本。回滚包括程序回滚和数据回滚等类型。对于本章而言,如果当前代码版本发布失败,回滚到上一个正常版本,尽快恢复业务。
****回滚思路:****重新run 指定老版本镜像。因为在每次发版过程中需要将代码封装到镜像中,并打上Tag,以此用来区分不同的版本。比如在发版过程中出现代码问题,需要运维工程师快速回滚到上一个版本,这样可以做到快速恢复业务正常化。

同样这个过程该怎样去实现呢?此时,可以重新创建一个"自由软件项目风格任务",通过参数化构建特定版本,也就是指定上一个正常版本镜像,然后重新执行创建容器命令即可回到之前正常的版本。

1、前提准备:

提交1.0.1版本代码

root@jenkins \~\]# cd psi-probe/ \[root@jenkins psi-probe\]# echo "test1" \> psi-probe-web/src/main/webapp/test1.html \[root@jenkins psi-probe\]# git add . \[root@jenkins psi-probe\]# git commit -m "test1" \[root@jenkins psi-probe\]#git tag 1.0.1 \[root@jenkins psi-probe\]#git push origin 1.0.1

提交1.0.2版本代码

root@jenkins psi-probe\]# echo "test2" \> psi-probe-web/src/main/webapp/test2.html \[root@jenkins psi-probe\]# git add . \[root@jenkins psi-probe\]# git commit -m "test2" \[root@jenkins psi-probe\]# git tag 1.0.2 \[root@jenkins psi-probe\]# git push origin 1.0.2

2、测试:

发布1.0.1版本

[root@docker ~]# docker exec -it probe /bin/bash

[root@6236806ba6c6 /]# ls /usr/local/tomcat/webapps/ROOT

1) 创建一个自由软件项目风格任务

2)新建item-->rollback-probe-->freestyle project

Gencral-->git parameter

输入如图:

3)源码管理配置如图:

4)Build steps选择:

Execute shell script on remote host using ssh

配置如下:

REPOSITORY=192.168.100.131:5000/probe:${Tag}

部署

docker rm -f probe |true

docker container run -d --name probe -v /usr/local/java:/usr/local/java -p 8090:8080 $REPOSITORY

保存退出

5)Build with parameters 回滚到1.0.0版本

回滚成功

3、结果验证:

Jenkins主机:

root@jenkins \~\]# docker images ![](https://file.jishuzhan.net/article/1694699034192646145/6a43954cdc584b7fbd0dd19d3b51f75a.png) ****Tomcat主机:**** \[root@tomcat \~\]# docker images \[root@tomcat \~\]# docker ps -l \[root@tomcat \~\]# docker exec -it probe /bin/bash ![](https://file.jishuzhan.net/article/1694699034192646145/de6556f3d8b04474840ec92204c8a609.png) ****4、同理验证1.0.2版本回滚1.0.0**** ****建立版本1.0.2项目**** ![](https://file.jishuzhan.net/article/1694699034192646145/43e2a894b93b4929a51030e3757133bd.png) ****Jenkins主机:**** ![](https://file.jishuzhan.net/article/1694699034192646145/80d6faa58763412bafcd853030ab5462.png) ****Tomcat主机:**** ![](https://file.jishuzhan.net/article/1694699034192646145/af4baa557edd4c2e9e304787abb7f273.png) ****回滚:**** ****Jenkins主机:**** ![](https://file.jishuzhan.net/article/1694699034192646145/48ed9d2f0bfb479985c8a7a4a5a6c1ad.png) ****Tomcat主机:**** ![](https://file.jishuzhan.net/article/1694699034192646145/e2a87a13afed434593a164ba933f29a9.png) ****5、总结:**** ****可以发现,1.0.1版本发布后,项目升级到1.0.1版本,回滚1.0.0之后,test1项目消失;同理升级1.0.2版本之后,项目升级到1.0.2版本,回滚1.0.0之后,test2项目消失;但是又可以发现,容器运行前后的ID号发生了变化。****

相关推荐
天水幼麟8 分钟前
Python学习笔记
笔记·python·学习
嘿rasa16 分钟前
2025最新系统 Linux 教程(三)
linux·运维·服务器
网硕互联的小客服19 分钟前
服务器风扇故障导致过热问题的解决方案
运维·服务器·chrome
facaixxx202427 分钟前
应用镜像是什么?轻量应用服务器的镜像大全
linux·运维·服务器
noravinsc1 小时前
Linux 下 Module 工具的介绍与使用
linux·运维·服务器
c无序1 小时前
【Docker-13】Docker Container容器
运维·docker·容器
虾球xz2 小时前
游戏引擎学习第230天
c++·学习·游戏引擎
云达闲人3 小时前
Proxmox VE 用户与权限管理命令大全
运维·网络·云原生·容器·proxmox·用户权限管理·命令大全
喆星时瑜3 小时前
【Docker】运行错误提示 unknown shorthand flag: ‘d‘ in -d ----详细解决方法
运维·docker·容器
ghost1433 小时前
Python自学第2天:条件语句,循环语句
开发语言·python·学习