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

news2024/11/23 7:11:21

第四阶段提升

时  间:2023年8月24日

地  点:2304教室

授课人:李凤海

参加人:全班人员

内  容:

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

目录

一、案例概述

二、案例知识点

三、案例环境

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

(二)案例需求

(三)配置 Git 仓库

(四)配置 Docker服务器

(五)部署镜像仓库

(六)配置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 git@192.168.100.131

测试免交互登录

[root@jenkins ~]# ssh git@192.168.100.131

[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 git@192.168.100.131:/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

[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

[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

 

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

[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 打断后再执行

 

2Jenkins 配置全局工具配置

        在 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 jdk17.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

 

 5、Web操作:配置maven(maven-3.5.0,

/usr/localmaven-3.5.0)

 

6、配置Git

[root@jenkins ~]# which git

/usr/bin/git

 

以上全局基本配置完毕后,点击保存即可完成。

7、Jenkins 安装必要插件

Manage Jenkins->Plugins-->安装SSH 插件--->

安装Git Parameter 插件

插件说明:

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

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

8、配置SSH 插件

创建一个用于连接Docker主机的凭据。Manage Jenkins->credentials->system->全局->add credentials

 

输入连接Docker 主机的用户名和密码

 

添加SSH 远程主机。Manage Jenkins-> System,配置SSH remote hosts,输入内容如图:

保存退出

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

主页面-> 新建Item-> 输入任务名称,构建一个Maven 项目

 

        注意:如果没有显示“构建一个Maven 项目”选项,需要在管理插件里安装“MavenIntegration”插件。

1、动态获取Git 仓库tag,与用户交互选择Tag 发布,配置如图:

 

2、指定项目Git 仓库地址修改*/master 为$Tag,Tag 是上面动态获取的变量名,表示根据用户选择打代码版本

 

3、设置maven 构建命令选项“clean package -Dmaven.test.skip=true”

 

4、利用pom.xml 文件构建项目。

        在Jenkins 本机镜像构建与推送到镜像仓库,并SSH远程连接到Docker 主机使用推送的镜像创建容器

选择Post Steps –>Add post-build step -Execute shell,这样会调出第一个输入框,内容如下:

 

        选择Post Steps –>Execute shell script on remote host using ssh,这样会调出第二个输入框,内容如下:

 

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

Tomcat主机:

[root@tomcat ~]# docker images

[root@tomcat ~]# docker ps -l

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

4、同理验证1.0.2版本回滚1.0.0

建立版本1.0.2项目

 

Jenkins主机:

 

Tomcat主机:

 

回滚:

Jenkins主机:

 

Tomcat主机:

 

5、总结:

        可以发现,1.0.1版本发布后,项目升级到1.0.1版本,回滚1.0.0之后,test1项目消失;同理升级1.0.2版本之后,项目升级到1.0.2版本,回滚1.0.0之后,test2项目消失;但是又可以发现,容器运行前后的ID号发生了变化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/923614.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++类成员的访问权限以及类的封装

C通过 public、protected、private 三个关键字来控制成员变量和成员函数的访问权限&#xff0c;它们分别表示公有的、受保护的、私有的&#xff0c;被称为成员访问限定符。所谓访问权限&#xff0c;就是你能不能使用该类中的成员。 Java、C# 程序员注意&#xff0c;C 中的 publ…

大数据-玩转数据-Flink时间滚动动窗口

一、说明 时间窗口包含一个开始时间戳(包括)和结束时间戳(不包括), 这两个时间戳一起限制了窗口的尺寸. 在代码中, Flink使用TimeWindow这个类来表示基于时间的窗口. 这个类提供了key查询开始时间戳和结束时间戳的方法, 还提供了针对给定的窗口获取它允许的最大时间戳的方法(m…

HTTP原理与实现

一、基本概念 一、基本原理* 1、全称&#xff1a; HyperText Transfer Protocol (超文本传输协议) 2、底层实现协议&#xff1a;建立在 TCP/IP 上的无状态连接。 3、基本作用&#xff1a;用于客户端与服务器之间的通信&#xff0c;规定客户端和服务器之间的通信格式。包括请…

PTS性能测试工具-使用记录

因为PTS使用是要收费的&#xff0c;所以文中会有大量图片记录&#xff0c;为我自己以后工作中&#xff0c;可能会再次使用PTS做个参照&#xff0c;以免时间长&#xff0c;容易忘记~ 目录 一、创建场景 二、填写一个压测节点 1、填写节点基本信息 2、Body / Header填写 …

牡丹宣言|对国潮化妆品品牌的理解

化妆品的国潮概念&#xff1f; ■ 是中国的时代潮流。 ■ 是传统元素与现代元素的碰撞。 ■ 是一股年轻的力量。 ■ 是大国崛起的象征。 ■ 是中国文化自信的体现。 如何正确认知化妆品&#xff1f; ■ 化妆品不是药品 ■ 化妆品是一种观念 ■ 化妆品是一种习惯 ■ 化…

自动化测试工具:Airtest入门教程

目录 1.什么是Airtest&#xff1f; 2.AirtestIDE下载安装 3.如何开始使用 4.Airtest入门特例教程 5.总结 1.什么是Airtest&#xff1f; Airtest是一款基于 Python 的、跨平台的UI自动化测试框架。因为它基于 图像识别 的原理&#xff0c;所以适用于所有 Android、 iOS和 …

Linux系统安装(虚拟机安装;系统分区;Linux系统安装;远程登录管理工具)

文章目录 1. VMware虚拟机安装与使用2. 系统分区2.1 磁盘分区2.2 格式化2.3 硬件设备文件名2.4 分区设备文件名2.5 挂载2.6 文件系统结构2.7 总结 3. Linux系统安装4. 远程登录管理工具 1. VMware虚拟机安装与使用 VMware是一个虚拟PC的软件&#xff0c;可以在现有的操作系统上…

opencv 车牌号的定位和识别+UI界面识别系统

目录 一、实现和完整UI视频效果展示 主界面&#xff1a; 识别结果界面&#xff1a;&#xff08;识别车牌颜色和车牌号&#xff09; 查看历史记录界面&#xff1a; 二、原理介绍&#xff1a; 车牌检测->图像灰度化->Canny边缘检测->膨胀与腐蚀 边缘检测及预处理…

【C++11】future和async等

C11的future和async等关键字 1.async和future的概念 std::async 和 std::future 是 C11 引入的标准库功能&#xff0c;用于实现异步编程&#xff0c;使得在多线程环境中更容易处理并行任务。它们可以帮助你在不同线程中执行函数&#xff0c;并且能够方便地获取函数的结果。 在…

mysql(八)事务隔离级别及加锁流程详解

目录 MySQL 锁简介什么是锁锁的作用锁的种类共享排他锁共享锁排它锁 粒度锁全局锁表级锁页级锁行级锁种类 意向锁间隙临键记录锁记录锁间隙锁 加锁的流程锁的内存结构加锁的基本流程根据主键加锁根据二级索引加锁根据非索引字段查询加锁加锁规律 锁信息查看查看锁的sql语句 数据…

npm install sentry-cli失败的问题

1. 目前报错 2. 终端运行 npm set ENTRYCLI_CDNURLhttps://cdn.npm.taobao.org/dist/sentry-cli npm set sentrycli_cdnurlhttps://cdn.npm.taobao.org/dist/sentry-cli3. 再安装 npx sentry/wizardlatest -i nextjs即可成功

信创测试的应用是什么

信创测试作为评估创意和创新项目的工具&#xff0c;为企业的发展提供了重要的支持和指导。它能够帮助企业降低风险、优化资源配置&#xff0c;促进创意与创新的迭代和改进。其具体应用&#xff0c;小编带大家一起来看看详情吧! 一、产品和服务创新 信创测试可以用于评估新产品和…

linux并发服务器 —— 动态库和静态库实战(一)

-E 预处理指定源文件 -S 编译指定源文件 -c 汇编指定源文件 -o 生成可执行文件 -I directory 指定Include包含文件的搜索目录 -g 编译的时候生成调试信息 -D 在程序编译时指定一个宏 -w 不生成任何的警告信息 -Wall 生成所有警告 -On n:0~3&#xff1b;表示编译器的优…

Kubernetes(K8S)使用PV和PVC做存储安装mysql

Kubernetes使用PV和PVC做存储安装mysql 环境准备什么是PV和PVC环境准备配置nfs安装nfs配置nfs服务端 创建命名空间配置pv和pvcpv的yaml文件pvc的yaml文件 部署mysql创建mysql的root密码的secret创建mysql部署的yaml部署mysql链接mysql外部链接内部链接 环境准备 首先你需要一个…

【路由器】小米 WR30U 解锁并刷机

文章目录 解锁 ssh环境准备解锁过程 刷入 mt798x uboot简介刷入流程 刷入 ImmortalWrt简介刷入流程 刷为原厂固件参考资料 本文主要记录个人对小米 WR30U 路由器的解锁和刷机过程&#xff0c;整体步骤与 一般安装流程 类似&#xff0c;但是由于 WR30U 的解锁 ssh 和刷机的过程中…

Docker打包JDK20镜像

文章目录 Docker 打包 JDK 20镜像步骤1.下载 jdk20 压缩包2.编写 dockerfile3.打包4.验证5.创建并启动容器6.检查 Docker 打包 JDK 20镜像 步骤 1.下载 jdk20 压缩包 https://www.oracle.com/java/technologies/downloads/ 2.编写 dockerfile #1.指定基础镜像&#xff0c;并…

MongoDB Long 类型 shell 查询

场景 1、某数据ID为Long类型&#xff0c;JAVA 定义实体类 Id Long id 2、查询数据库&#xff0c;此数据存在 3、使用 shell 查询&#xff0c;查不到数据 4、JAVA代码查询Query.query 不受任何影响 分析 尝试解决&#xff08;一&#xff09; long 在 mongo中为 int64 类型…

ARM-汇编指令

一&#xff0c;map.lds文件 链接脚本文件 作用&#xff1a;给编译器进行使用&#xff0c;告诉编译器各个段&#xff0c;如何进行分布 /*输出格式&#xff1a;32位可执行程序&#xff0c;小端对齐*/ OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm",…

ELFNet: Evidential Local-global Fusion for Stereo Matching

论文地址&#xff1a;https://arxiv.org/pdf/2308.00728.pdf 源码地址&#xff1a;https://github.com/jimmy19991222/ELFNet 概述 针对现有立体匹配模型面临可靠性和跨域泛化的问题&#xff0c;本文提出了Evidential Local-global Fusion&#xff08;ELF&#xff09;框架&…

十一、内部类(2)

本章概要 为什么需要内部类 闭包与回调内部类与控制框架 继承内部类内部类可以被重写么&#xff1f;局部内部类内部类标识符 为什么需要内部类 至此&#xff0c;我们已经看到了许多描述内部类的语法和语义&#xff0c;但是这并不能同答“为什么需要内部类”这个问题。那么&a…