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

2023-11-05

 

案例知识点


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地址

主机名

角色

CentOS7.5

192.168.200.111

git

Git/Docker registry

CentOS7.5

192.168.200.112

jenkins

Jenkins

CentOS7.5

192.168.200.113

docker

Docker

基于 Jenkins+Git+Docker 发布 Java 项目


所有主机上操作

[root@localhost ~]# setenforce 0

[root@localhost ~]# iptables -F

[root@localhost ~]# systemctl stop firewalld

[root@localhost ~]# systemctl stop NetworkManager

案例需求

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

1、配置 Git 仓库


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

使用 yum 安装 Git 并配置

[root@git ~]# yum -y install git

[root@git ~]# useradd git

[root@git ~]# echo "123456" | passwd --stdin git

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

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

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

[root@jenkins ~]# ssh-copy-id git@192.168.200.111

测试免交互登录

[root@jenkins ~]# ssh git@192.168.200.111

[git@git ~]$ exit

登出

Connection to 192.168.200.111 closed.

在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 版本库于 /home/git/probe.git/

[git@localhost probe.git]$ exit

登出

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

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

[root@jenkins ~]# cd psi-probe/

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

 [root@jenkins psi-probe]# git remote remove origin

[root@jenkins psi-probe]# git remote add origin git@192.168.200.111:/home/git/probe.git

提交代码到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 "crushlinux@163.com"

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

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

[master 5354df1] a

 1 file changed, 0 insertions(+), 0 deletions(-)

 create mode 100644 web/src/main/webapp/a.html 

[root@jenkins psi-probe]# git tag 1.0.0
[root@jenkins psi-probe]# git push origin 1.0.0


枚举对象: 40775, 完成.
对象计数中: 100% (40775/40775), 完成.
使用 2 个线程进行压缩
压缩对象中: 100% (12232/12232), 完成.
写入对象中: 100% (40775/40775), 23.41 MiB | 43.34 MiB/s, 完成.
总共 40775 (差异 24175),复用 40740 (差异 24160)
To 192.168.200.111:/home/git/probe.git
 * [new tag]             1.0.0 -> 1.0.0

2、配置 Docker服务器


【安装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/

backup  Centos-aliyun.repo  CentOS-Media.repo  docker-ce.repo

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

[root@localhost ~]# systemctl start docker

[root@localhost ~]# systemctl enable docker

[root@docker ~]# docker version

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

[root@git ~]# cat << END > /etc/docker/daemon.json

{

        "registry-mirrors":[ "https://nyakyfun.mirror.aliyuncs.com" ]

}

END

[root@git ~]# systemctl daemon-reload

[root@git ~]# systemctl restart docker

3、部署镜像仓库


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

在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 -l

[root@git ~]# docker images

测试 registry 可用性

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

【Docker和jenkins主机上操作 !!!】

[root@docker ~]# vim /etc/docker/daemon.json

{"insecure-registries":["192.168.200.111:5000"]}

[root@docker ~]# systemctl daemon-reload

[root@docker ~]# systemctl restart docker

打标签并推送镜像到 registry

  [root@docker ~]# cat centos-7-x86_64.tar.gz | docker import - centos:7

[root@docker ~]# docker tag centos:7 192.168.200.111:5000/centos:7

[root@docker ~]# docker images 

[root@docker ~]# docker push 192.168.200.111:5000/centos:7 

查看 registry 上传的镜像:

[root@docker ~]# curl http://192.168.200.111:5000/v2/_catalog

{"repositories":["centos"]}

[root@docker ~]# curl http://192.168.200.111:5000/v2/centos/tags/list

{"name":"centos","tags":["7"]}

从 registry 下载镜像:

[root@docker ~]# docker rmi 192.168.200.111:5000/centos:7

[root@docker ~]# docker pull 192.168.200.111:5000/centos:7

[root@localhost ~]# docker images

构建 Tomcat 基础镜像

在jenkins和docker主机上安装JDK:

[root@docker ~]# tar xf jdk-8u191-linux-x64.tar.gz

[root@docker ~]# mv jdk1.8.0_191/ /usr/local/java

[root@docker ~]# ls -l apache-tomcat-8.5.40.tar.gz

[root@docker ~]# vim Dockerfile

FROM centos:7

MAINTAINER crushlinux

ENV VERSION=8.5.40

ENV JAVA_HOME /usr/local/java

ADD ./apache-tomcat-${VERSION}.tar.gz /tmp

RUN cd /tmp && \

    mv apache-tomcat-${VERSION} /usr/local/tomcat && \

    rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/* && \

    mkdir /usr/local/tomcat/webapps/ROOT

EXPOSE 8080

CMD ["/usr/local/tomcat/bin/catalina.sh", "run"]

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

[root@docker ~]# docker images

构建镜像并上传到registry:

[root@docker ~]# docker pull tomcat

[root@docker ~]# docker tag tomcat 192.168.200.111:5000/tomcat-85

[root@docker docker-tomcat]# docker push 192.168.200.111:5000/tomcat-85

5、配置Jenkins 环境


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

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

修改jenkins运行用户

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

JENKINS_USER="root"

[root@jenkins ~]# jenkins  restart

Restarting jenkins (via systemctl):            

Jenkins 配置全局工具配置

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

rz 导入jdk-8u191-linux-x64.tar.gz的包如果有则不用

[root@jenkins ~]# tar xf jdk-8u191-linux-x64.tar.gz

[root@jenkins ~]# mv jdk1.8.0_191/ /usr/local/java

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

export JAVA_HOME=/usr/local/java

export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar

export PATH=$JAVA_HOME/bin:$PATH

[root@jenkins ~]# rm -rf /usr/bin/java

【Java版本也可不改】

[root@jenkins jenkins]# mkdir updates

[root@jenkins ~]# cd /var/lib/jenkins/updates

[root@jenkins updates]# touch default.json

[root@jenkins updates]# sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json

[root@jenkins updates]# sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json

[root@jenkins ]# jenkins restart

 

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

【如果没有apache-maven-3.5.0-bin.tar.gz自行导入】

[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

    <mirror>

        <id>nexus-aliyun</id>

        <mirrorOf>central</mirrorOf>

        <name>Nexus aliyun</name>

        <url>http://maven.aliyun.com/nexus/content/groups/public</url>

    </mirror>

Git 配置

[root@jenkins ~]# which git

/usr/bin/git

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

Jenkins 安装必要插件

Manage Jenkins-> Manage Plugins

 

安装SSH 插件

 安装Git Parameter 插件

 

插件说明:

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

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

配置SSH 插件

创建一个用于连接Docker主机的凭据。主页面-> 凭据-> 系统-> 全局凭据-> 添加凭据。

 

 

输入连接Docker 主机的用户名和密码(描述写上 docker)

添加SSH 远程主机。Manage Jenkins-> Configure System。

配置SSH remote hosts

6Jenkins 创建项目并发布测试


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

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

Integration”插件。

配置Git 参数化构建

动态获取Git 仓库tag,与用户交互选择Tag 发布

指定项目Git 仓库地址

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

利用pom.xml 文件构建项目。在Jenkins 本机镜像构建与推送到镜像仓库,并SSH远程连接到Docker 主机使用推送的镜像创建容器

选择Post Steps –>Add post-build step ->执行shell,这样会调出第一个输入框

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

 pom.xml: 它是声明项目描述符遵循POM 模型版本。模型本身的版本很少改变,虽然如此,但它仍然是必不可少的,这是为了当Maven 引入新的特性或者其他模型变更的时候,确保稳定性。

第一个命令框内容

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

# 构建镜像

cat > Dockerfile << EOF

FROM 192.168.200.111: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.200.111: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

[root@docker ~]# vim /etc/docker/daemon.json

{"insecure-registries":["192.168.200.111:5000"]}

[root@docker ~]# systemctl daemon-reload

[root@docker ~]# systemctl restart docker

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

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

选择tag,开始构建

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

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

[root@docker ~]# docker ps -a

执行成功后,浏览器访问测试probe项目:http://192.168.200.113:8090

7、版本回滚


回滚(Rollback)指的是程序或数据处理错误,将程序或数据恢复到上一次正确版本。回滚包括程序回滚和数据回滚等类型。对于本章而言,如果当前代码版本发布失败,回滚到上一个正常版本,尽快恢复业务。

回滚思路:重新run 指定老版本镜像。因为在每次发版过程中需要将代码封装到镜像中,并打上Tag,以此用来区分不同的版本。比如在发版过程中出现代码问题,需要运维工程师快速回滚到上一个版本,这样可以做到快速恢复业务正常化。同样这个过程该怎样去实现呢?此时,可以重新创建一个”自由软件项目风格任务“,通过参数化构建特定版本,也就是指定上一个正常版本镜像,然后重新执行创建容器命令即可回到之前正常的版本。

提交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"

[master 7b36b14] test1

 1 file changed, 1 insertion(+)

 create mode 100644 web/src/main/webapp/test1.html

[root@jenkins psi-probe]#git tag 1.0.1

[root@jenkins psi-probe]#git push origin 1.0.1

Counting objects: 12, done.

Compressing objects: 100% (6/6), done.

Writing objects: 100% (7/7), 574 bytes | 0 bytes/s, done.

Total 7 (delta 2), reused 0 (delta 0)

To git@192.168.200.111:/home/git/probe.git

 * [new tag]         1.0.1 -> 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"

[master eb617d6] test2

 1 file changed, 1 insertion(+)

 create mode 100644 web/src/main/webapp/test2.html

[root@jenkins psi-probe]# git tag 1.0.2

[root@jenkins psi-probe]# git push origin 1.0.2

Counting objects: 12, done.

Compressing objects: 100% (6/6), done.

Writing objects: 100% (7/7), 577 bytes | 0 bytes/s, done.

Total 7 (delta 2), reused 0 (delta 0)

To git@192.168.200.111:/home/git/probe.git

 * [new tag]         1.0.2 -> 1.0.2  

发布1.0.1版本

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

[root@1b57d0ebb506 /]# ls /usr/local/tomcat/webapps/ROOT

META-INF  WEB-INF  a.html  css  flags  index.jsp  js  test1.html

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

 

 

 

REPOSITORY=192.168.200.111: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

 

[root@docker ~]# docker ps -l

 

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

[root@6991b6b06f6d /]# ls /usr/local/tomcat/webapps/ROOT

META-INF  WEB-INF  a.html  css  flags  index.jsp  js

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于Jenkins CICD的代码发布与回滚 的相关文章

随机推荐

  • html5中的localStorage 临时存储

    localStorage 临时存储 localStorage 用于长久保存整个网站的数据 只支持 string 类型的存储 容量一般在2 5Mb左右 保存的数据没有过期时间 直到手动去删除 而sessionStorage在网页回话结束时失效
  • 一个“程序员的自我修养”是什么?

    在 喜剧之王 中 周星驰扮演的尹天仇 一直梦想成为一名演员 而他不管是在扮演跑龙套 或者在街坊中开设演员训练班 亦或成为主角时 他对待演员的态度 始终是认真 热爱而又投入的 而那一本他随身携带的书 演员的自我修养 尽管不知道里面具体写的是什
  • Transformer warning: [encoder.embed_tokens.weight] is newly initialized

    在使用transformer 加载预训练的T5 encoder参数的时候 经常会出现 Some weights of T5EncoderModel were not initialized from the model checkpoint
  • Vue下载文件不成功及下载文件名称问题

    看代码 import axiosDown from axios downloadFile path return axiosDown url path method get responseType blob 这一步也很关键 一定要加上 r
  • Qt对动态库(*.dll)的封装以及使用

    创建工程 首先先择左侧项目的Library 再选择右侧的C Library库然后点击下一步 接下来需要设置工程名以及路径 点击下一步 下一步即可 这里需要设置Type为共享库Shared Library 并设置类名 然后一路默认即可 工程结
  • Fluid-数据缓存亲和性调度原理解析

    前言 在Fluid中 Dataset资源对象中所定义的远程文件是可被调度的 这意味着你能够像管理你的Pod一样管理远程文件缓存在Kubernetes集群上的存放位置 另外 Fluid同样支持对于应用的数据缓存亲和性调度 这种调度方式将应用
  • Windows——python版本的OpenCV的安装方法

    1 点进OpenCV的python版本下载网站 https pypi org project opencv python 2 点击历史版本 3 找到合适的版本 复制命令 4 打开cmd 粘贴已复制的命令
  • python中的异常处理方法

    目录 1 什么是异常 3 异常的分类 4 异常的类型 有很多 不一一列举 异常处理实操 基本语法结构 异常处理了解操作 1 什么是异常 代码运行出错之后就是异常 异常会导致程序立刻停止 是我们以后在编程过程中需要极力避免的情况 异常的外号
  • 爬虫之xpath插件下载与使用

    文章目录 1 下载xpath文件 2 打开chrome浏览器 3 点击右上角小圆点 4 更多工具 阔展程序 5 拖拽xpath插件放到阔展程序 6 如果失效 需要将后缀改为zip 7 再次拖拽 8 关闭浏览器重新打开 9 按ctrl shi
  • Pycharm连接Mysql8.0的坑

    Pycharm连接Mysql8 0 1 错误 S1009 The connection property zeroDateTimeBehavior acceptable values are CONVERT TO NULL EXCEPTIO
  • 数据数仓的三种建模方式

    所谓水无定势 兵无常法 不同的行业 有不同行业的特点 因此 从业务角度看 其相应的数据模型是千差万别的 目前业界较为主流的是数据仓库厂商主要是 IBM 和 NCR 这两家公司的除了能够提供较为强大的数据仓库平台之外 也有各自的针对某个行业的
  • 新基建时期助力打造数字化智慧交通体系

    在没多久之前公布的政府工作报告中 明晰了将重点扶持 两新一重 基础建设的战略方针 并且对 两新一重 体系的实际价值给出了 既促消费惠民生又调结构增后劲 的评价 两新一重 体系包含三个基础建设方向 即增强新型基础设施建设 发展新一代的信息网络
  • Struts2 标签详解(学习深入)

    Struts2 标签详解 详细的说明了struts2所有标签 a a标签创建一个HTML超链接 等价于HTML 的
  • 软件测试 - 自动化测试工具 selenium1

    1 什么是自动化测试 2 自动化测试金字塔 2 1 单元测试 2 2 接口测试 2 3 UI 自动化测试 3 为什么要使用 selenium 自动化框架 4 什么样的项目适合自动化测试 5 Selenium IDE 6 Webdriver
  • 手写一个服务器代码将 《vue电商后台管理系统》部署上去 上线、打包

    我将在博文中全程以cnpm作为代码格式 为了好复制 它快啊 你要知道node安装包自带npm npm下载cnpm才可以使用cnpm 今日目标 1 上线vue电商后台管理项目 2 手写搭建服务器并挂载 node 3 打包优化 完成上线 前期回
  • MySQL的数据查询详解

    MySQL查询数据 一 基本查询语句 二 单表查询 三 常用函数查询 四 连接查询 五 子查询 六 合并查询结果 七 为表和字段取别名 八 使用正则表达式查询 一 基本查询语句 数据库管理系统的一个最重要的功能就是数据查询 数据查询不只是简
  • 【AI实战营第二期】第三次作业——基于 RTMDet 的气球检测(包含数据集)

    作业 基于 RTMDet 的气球检测 背景 熟悉目标检测和 MMDetection 常用自定义流程 任务 基于提供的 notebook 将 cat 数据集换成气球数据集 按照视频中 notebook 步骤 可视化数据集和标签 使用MMDet
  • three.js---一个基础的demo

    在学习three js过程中 不难发现 每新开发一个3D场景都会从创建场景 scene 创建物体 创建相机这三个基础的方法开始 从而在其身上衍生出其他的一些API 为了方便日后的开发 特此记录一个简单基础的demo 在之后的开发中可直接使用
  • python测试网络连通性_PYTHON 测试服务器连通性

    coding utf 8 import os import sys import urllib2 import pygame import re import socket import subprocess 输入要测试的site值 pri
  • 基于Jenkins CICD的代码发布与回滚

    案例知识点 1 Jenkins 介绍 Jenkins 原名 Hudson 2011 年改为现在的名字 它是一个开源的实现持续集成的软件工具 官方网站 https jenkins io Jenkins 能实施监控持续集成过程中所存在的问题 提