基于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 分钟前
Vue 学习随笔系列二十三 -- el-date-picker 组件
前端·vue.js·学习
Alice-YUE31 分钟前
【HTML5学习笔记1】html标签(上)
前端·笔记·学习·html·html5
好吃的肘子35 分钟前
Elasticsearch架构原理
开发语言·算法·elasticsearch·架构·jenkins
linkingvision1 小时前
H5S 视频监控AWS S3 对象存储
linux·运维·aws·视频监控s3对象存储
jerry6091 小时前
LLM笔记(五)概率论
人工智能·笔记·学习·概率论
doupoa1 小时前
Fabric 服务端插件开发简述与聊天事件监听转发
运维·python·fabric
BillKu1 小时前
服务器多JAR程序运行与管理指南
运维·服务器·jar
QQ2740287561 小时前
BlockMesh Ai项目 监控节点部署教程
运维·服务器·web3
南棱笑笑生2 小时前
20250512给NanoPi NEO core开发板在Ubuntu core20.04系统更新boot.img
linux·运维·ubuntu
小锋学长生活大爆炸3 小时前
【教程】Docker更换存储位置
运维·docker·容器