Jenkins构建CI/CD

CI/CD

软件开发的连续方法基于自动执行脚本,以最大限度地减少在开发应用程序时引入错误的可能性。从新代码的开发到部署,它们需要较少的人为干预甚至根本不需要干预。

它涉及在每次小迭代中不断构建,测试和部署代码更改,从而减少基于有缺陷或失败的先前版本开发新代码的机会。

这种方法有三种主要方法,每种方法都根据最适合的策略进行应用。

持续集成(Continuous Integration, CI):  代码合并,构建,部署,测试都在一起,不断地执行这个过程,并对结果反馈。

持续部署(Continuous Deployment, CD): 部署到测试环境、预生产环境/灰度环境、生产环境。

持续交付(Continuous Delivery, CD):  将最终产品发布到生产环境、给互联网用户使用。

持续集成/持续发布--项目---开发(git) -->git主库-->jenkins(调用maven打包+测试)-->发布到后端服务器 

一、jenkins介绍

Jenkins是帮我们将代码进行统一的编译打包、还可以直接放到后端服务器中进行发布。我们通过配置jenkins,将以前:编译、打包、上传、部署到后端服务器中的过程交由Jenkins,Jenkins通过给定的代码地址URL,将代码拉取到其“宿主服务器”(Jenkins的安装位置),进行编译、打包和发布到web容器中。

1、Jenkins概述

Jenkins是一款开源的、提供友好操作界面的持续集成(CI/CD)工具,主要用于持续、自动的构建的一些定时执行的任务。Jenkins用Java语言编写,可在Tomcat等流行的容器中运行,也可独立运行。

jenkins通常与版本管理工具(SCM)、构建工具结合使用;常用的版本控制工具有SVN、GIT。jenkins构建工具有Maven、Ant、Gradle。

2、Jenkins目标

提高开发效率以及过程控制:
jenkins的主要目标是监控软件开发流程,快速显示问题。 所以能保证开发人员以及相关人员省时省力提高开发效率。
CI系统在整个开发过程中的主要作用是控制:当系统在代码库中检测到修改时,它将运行构建的任务委托给构建过程本身。如果构建失败了,那么CI系统将通知相关人员,然后继续监视代码库。

3、Jenkins特性

1.易于安装    #不需要安装、不需要数据库,只需通过java  -jar jenkins.war或部署到一个java容器中
2.易于配置    #所有的配置都可能通过jenkins提供的web界面完成,当然如果你喜欢,也可以通过手动修改xml文件进行配置
3.文件识别    #jenkins能跟踪每次构建生成的是war包还是jar包,以及使用哪个版本的包。
4.分布式构建  #支持Jenkins能够让多台计算机一起构建/测试。
5.任务(Job)和构建(build) #任务:(Job)是Jenkins的一个执行计划,是一系列操作的集合。构建:是Jenkins的任务的一次运行。
6.插件支持    #jenkins可以通过第三方插件扩展,也可以根据团队需要开发插件
6.跨平台      #支持所有的平台

工作流程图:

测试环境中:
1.开发者会将代码上传到版本库中。
2.jenkins通过配置版本库的连接地址,获取到源代码。
3.jenkins获取到源代码之后通过参数化构建(或者触发器)开始编译打包。
4.jenkins通过调用maven(Ant或者Gradle)命令实现编译打包过程。
5.生成的war/jar包通过ssh插件上传到远程后端服务器中通过shell脚本自动发布项目。
生产环境:
测试环境将项目测试没问题后,将项目推送到线上正式环境。
1.可以选择手动。
2.也可以通过调用脚本推送过去。

4、Jenkins面试

jenkins如何将代码发布到后端服务器的?使用的ssh的方式

jenkins如何获取到代码的?在jenkins配置git仓库url地址

Jenkins使用什么命令进行的打包?前端使用npm;后端使用maven

jenkins的上线流程(使用什么方式上线?)

二、部署Jenkins实战

1、准备环境

三台机器
​
git-server    ----https://github.com/bingyue/easy-springmvc-maven
​
jenkins-server    ---192.168.246.212---最好是3个G以上
​
java-server   -----192.168.246.210
​
https://github.com/bingyue/easy-springmvc-maven 或者
https://gitee.com/bingyu076/easy-springmvc-maven.git

1. 部署jenkins服务器

安装git客户端
[root@jenkins-server ~]# yum install -y git   #安装git客户端
[root@jenkins-server ~]# ssh-keygen
[root@jenkins-server ~]# ssh-copy-id -i root@192.168.246.210   #拷贝到后端java服务器
开始部署jenkins:
从Jenkins2.164(2019年2月10日发布)和 LTS 2.164.1(ETA:3月14日)开始,在 Jenkins 中全面支持 Java 11。
1.配置安装jdk11
[root@jenkins-server ~]# tar xzf jdk-11.0.20_linux-x64_bin.tar.gz -C /usr/local/
[root@jenkins-server ~]# cd /usr/local/
[root@jenkins-server local]# mv jdk-11.0.20/ java
2.安装tomcat
[root@jenkins-server ~]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.52/bin/apache-tomcat-9.0.52.tar.gz
[root@jenkins-server ~]# tar xzf apache-tomcat-8.5.42.tar.gz -C /usr/local/
[root@jenkins-server ~]# cd /usr/local/
[root@jenkins-server local]# mv apache-tomcat-8.5.42/ tomcat
3.安装maven
[root@jenkins-server ~]# wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz
[root@jenkins-server ~]# tar xzf apache-maven-3.5.4-bin.tar.gz -C /usr/local/java
[root@jenkins-server ~]# cd /usr/local/java
[root@jenkins-server java]# mv apache-maven-3.5.4/ maven
设置环境变量
[root@jenkins-server ~]# vim /etc/profile
JAVA_HOME=/usr/local/java
PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
MAVEN_HOME=/usr/local/java/maven
export JAVA_HOME MAVEN_HOME PATH
[root@jenkins-server ~]# source /etc/profile
验证:
[root@jenkins-server ~]# java -version 
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
[root@jenkins-server ~]# mvn -v 
Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T02:33:14+08:00)
Maven home: /usr/local/java/maven
Java version: 1.8.0_191, vendor: Oracle Corporation, runtime: /usr/local/java/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-693.el7.x86_64", arch: "amd64", family: "unix"
​
下载jenkins的安装包
安装jenkins:2.426.1  ----通过官网直接下载war包。
官网:https://www.jenkins.io/download/
[root@jenkins-server ~]# wget https://get.jenkins.io/war-stable/2.426.1/jenkins.war --no-check-certificat
​
最新版本的jenkins需要字体支持,但是目前系统缺少字体--需要安装字体
[root@jenkins-server ~]# yum install fontconfig -y
部署jenkins
[root@jenkins-server ~]# cd /usr/local/tomcat/webapps/
[root@jenkins-server webapps]# rm -rf * 
[root@jenkins-server webapps]# cp /root/jenkins.war .
[root@jenkins-server webapps]# ../bin/startup.sh 
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/java
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.

如果启动了访问提示

解决办法在

[root@jenkins-server ~]# cd /usr/local/tomcat/conf/
[root@jenkins-server conf]# vim context.xml  -----添加如下内容:
    <Resources
        cachingAllowed="true"
        cacheMaxSize="100000"
    />

重启tomcat

2.如果还是不行:

[root@jenkins ~]# cd .jenkins/updates/ 到jenkins的工作目录下
[root@jenkins updates]# vim default.json
把 "connectionCheckUrl":"http://www.google.com/" 改为  "connectionCheckUrl":"http://www.baidu.com/"

3.要是还是不行:

需要你进入jenkins的工作目录,打开-----hudson.model.UpdateCenter.xml
把http://updates.jenkins-ci.org/update-center.json
改成
http://mirror.xmission.com/jenkins/updates/update-center.json
每次改完记得重启!

使用运行war的形式安装jenkins,因为伟大的墙出现,“该jenkins实例似乎已离线” 问题:

解决办法:

​
需要你进入jenkins的工作目录,打开-----hudson.model.UpdateCenter.xml将 url 中的 https://updates.jenkins.io/update-center.json 更改为http://updates.jenkins.io/update-center.json,即去掉 https 中的 s 。
或者更改为https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
是国内的清华大学的镜像地址。
然后重启tomcat

========================================================================

访问界面: ---需要多等一会

http://192.168.246.212:8080/jenkins

2、登录jenkins

[root@jenkins-server ~]# cat /opt/jenkins/secrets/initialAdminPassword
b36b8b04c5b84e659701304dfe848999    ---复制这个密码粘贴到上面提示的空格里面。

点击:安装推荐的插件 

等待安装 

填写管理员信息 ,这里密码设置的为123456

如果安装失败,打开settings.xml添加阿里源

[root@jenkins-server ~]# vim /usr/local/java/maven/conf/settings.xml +160
# 添加阿里源
    </mirror>
    <mirror>
          <id>aliyunmaven</id>
          <mirrorOf>*</mirrorOf>
          <name>阿里云公共仓库</name>
          <url>https://maven.aliyun.com/repository/public</url>
        </mirror>
  </mirrors>

点击保存完成

 开始使用Jenkins

3、安装插件

安装插件:
所需的插件:
• Maven插件 Maven Integration plugin
• 发布插件 Deploy to container Plugin
需要安装插件如下:
=======================================================
安装插件
Deploy to container    ---支持自动化代码部署到tomcat容器
GIT pligin  可能已经安装
Maven Integration   :jenkins利用Maven编译,打包所需插件
Publish Over SSH  :通过ssh连接将打包的war包拷贝到后端服务器
ssh  插件
Email Extension Plugin  安装邮件插件
安装过程:
系统管理--->插件管理---->可选插件--->过滤Deploy to container---->勾选--->直接安装

输入插件名后按回车!

安装gitlab插件

以上所有插件安装完成

4、配置Jenkins

配置ssh

翻到最下面

key:指的是jenkins服务器用哪个用户去远程连接程序服务器就是那个用户的私钥。

[root@localhost ~]# cat .ssh/id_rsa
添加远程ssh-server

配置邮件

(用于之后项目构建后发送邮件)

配置扩展邮件通知 

邮件主题:
构建通知:${BUILD_STATUS} - ${PROJECT_NAME} - Build # ${BUILD_NUMBER} !
邮件内容:
<!DOCTYPE html>    
<html>    
<head>    
<meta charset="UTF-8">    
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>    
</head>    
    
<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"    
    offset="0">    
    <table width="95%" cellpadding="0" cellspacing="0"  style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">    
        <tr>    
            本邮件由系统自动发出,无需回复!<br/>            
            各位同事,大家好,以下为${PROJECT_NAME }项目构建信息</br> 
            <td><font color="#CC0000">构建结果 - ${BUILD_STATUS}</font></td>   
        </tr>    
        <tr>    
            <td><br />    
            <b><font color="#0B610B">构建信息</font></b>    
            <hr size="2" width="100%" align="center" /></td>    
        </tr>    
        <tr>    
            <td>    
                <ul>    
                    <li>项目名称 : ${PROJECT_NAME}</li>    
                    <li>构建编号 : 第${BUILD_NUMBER}次构建</li>    
                    <li>触发原因: ${CAUSE}</li>    
                    <li>构建状态: ${BUILD_STATUS}</li>    
                    <li>构建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>    
                    <li>构建  Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li>    
                    <li>工作目录 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>    
                    <li>项目  Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>    
                </ul>    
​
<h4><font color="#0B610B">失败用例</font></h4>
<hr size="2" width="100%" />
$FAILED_TESTS<br/>
​
<h4><font color="#0B610B">最近提交(#$SVN_REVISION)</font></h4>
<hr size="2" width="100%" />
<ul>
${CHANGES_SINCE_LAST_SUCCESS, reverse=true, format="%c", changesFormat="<li>%d [%a] %m</li>"}
</ul>
详细提交: <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a><br/>
​
            </td>    
        </tr>    
    </table>    
</body>    
</html>
设置邮箱触发器

可根据实际情况选择触发条件,此处选择 总是

管理监控配置--->系统管理员邮件地址:along@163.com,要和下面的用户名一致;

邮件通知,配置如下:可以点击测试,是否配置成功

然后应用保存

配置jdk,maven命令,git全局配置

构建发布任务

调用maven命令

指定打包文件:pom.xml

配置构建后操作模块

部署java服务器,做jenkins打包上线

[root@java-server ~]# mkdir -p /data/application
上传jdk
[root@java-server ~]# tar xzf jdk-8u191-linux-x64.tar.gz -C /usr/local/
[root@java-server ~]# cd /usr/local/
[root@java-server local]# mv jdk1.8.0_191/ java
下载tomcat
[root@java-server ~]# wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.42/bin/apache-tomcat-8.5.42.tar.gz
[root@java-server ~]# tar xzf apache-tomcat-8.5.42.tar.gz -C /data/application/
[root@java-server ~]# cd /data/application/
[root@java-server application]# mv apache-tomcat-8.5.42/ tomcat
设置环境变量
[root@java-server ~]# vim /etc/profile
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
export TOMCAT_HOME=/data/application/tomcat
[root@java-server ~]# source /etc/profile
测试:
[root@java-server ~]# java -version 
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
删除tomcat默认发布目录下面的内容:
[root@java-server ~]# rm -rf /data/application/tomcat/webapps/*
[root@java-server ~]# cd /data/application/tomcat/webapps/
[root@java-server webapps]# ls
创建目录和脚本:
[root@java-server ~]# mkdir /opt/script  #创建脚本目录
[root@java-server ~]# vim app-jenkins.sh   #创建脚本
脚本内容在后面
[root@java-server ~]# chmod +x app-jenkins.sh  #添加执行权限
[root@java-server ~]# mv app-jenkins.sh /opt/script/

回到jenkins页面开始构建任务

登陆java-server服务器查看

脚本内容:
[root@java-server script]# cat app-jenkins.sh 
#!/usr/bin/bash
#本脚本适用于jenkins持续集成,实现备份war包到代码更新上线!使用时请注意全局变量。
#================
#Defining variables
export JAVA_HOME=/usr/local/java
webapp_path="/data/application/tomcat/webapps"
tomcat_run="/data/application/tomcat/bin"
updata_path="/data/update/`date +%F-%T`"
backup_path="/data/backup/`date +%F-%T`"
tomcat_pid=`ps -ef | grep tomcat | grep -v grep | awk '{print $2}'`
files_dir="easy-springmvc-maven"
files="easy-springmvc-maven.war"
job_path="/root/upload"

#Preparation environment
echo "Creating related directory"
mkdir -p $updata_path
mkdir -p $backup_path

echo "Move the uploaded war package to the update directory"
mv $job_path/$files $updata_path

echo "========================================================="
cd /opt
echo "Backing up java project"
if [ -f $webapp_path/$files ];then
	tar czf $backup_path/`date +%F-%H`.tar.gz $webapp_path
	if [ $? -ne 0 ];then
		echo "打包失败,自动退出"
		exit 1
	else
		echo "Checking if tomcat is started"
		if [ -n "$tomcat_pid" ];then
			kill -9 $tomcat_pid
			if [ $? -ne 0 ];then
				echo "tomcat关闭失败,将会自动退出"
				exit 2
			fi
		fi
		cd $webapp_path
		rm -rf $files && rm -rf $files_dir
		cp $updata_path/$files $webapp_path
		cd /opt
		$tomcat_run/startup.sh
		sleep 5
		echo "显示tomcat的pid"
		echo "`ps -ef | grep tomcat | grep -v grep | awk '{print $2}'`"
		echo "tomcat startup"
		echo "请手动查看tomcat日志。脚本将会自动退出"
	fi
else
	echo "Checking if tomcat is started"
        if [ -n "$tomcat_pid" ];then
        	kill -9 $tomcat_pid
                if [ $? -ne 0 ];then
                	echo "tomcat关闭失败,将会自动退出"
                       	exit 2
                fi
        fi
	cp $updata_path/$files $webapp_path
	$tomcat_run/startup.sh
        sleep 5
        echo "显示tomcat的pid"
        echo "`ps -ef | grep tomcat | grep -v grep | awk '{print $2}'`"
        echo "tomcat startup"
        echo "请手动查看tomcat日志。脚本将会自动退出"
fi

这个脚本的主要功能是:

定义了一些关键路径和变量,如 Tomcat 的路径、备份目录、更新目录等。
创建了必要的目录来存储更新文件和备份文件。
将上传的 war 包移动到更新目录。
如果 webapps 下存在同名的 war 包,则先进行备份。
根据是否存在旧的 war 包,决定是否停止 Tomcat 服务,然后更新应用并重新启动 Tomcat。
输出 Tomcat 的进程 ID,并提示用户检查 Tomcat 日志。

三、jenkins参数化构建实现版本回退

通过回滚git仓库的版本号实现

1.git机器安装git
[root@gitlab-server ~]# yum install -y git
创建裸库
[root@gitlab-server ~]# mkdir /git-test
[root@gitlab-server ~]# useradd git
[root@gitlab-server ~]# passwd git
[root@gitlab-server ~]# cd /git-test/
[root@gitlab-server git-test]# git init --bare pm-test
[root@gitlab-server git-test]# chown git.git /git-test -R

利用后端服务器充当git客户端创建密钥

[root@java-server ~]# ssh-keygen
[root@java-server ~]# ssh-copy-id -i git@172.16.229.150  #将秘钥传输到git服务器中的git用户
[root@java-server ~]# git clone git@172.16.229.150:/git-test/pm-test  #克隆仓库
正克隆到 'pm-test'...
warning: 您似乎克隆了一个空版本库。
[root@java-server ~]# ls
anaconda-ks.cfg  pm-test

模拟开发角色在后端服务器充当开发端提交代码

[root@java-server ~]# yum install -y git
[root@java-server ~]# git config --global user.email "liming@163.com"
[root@java-server ~]# git config --global user.name "liming"
[root@java-server opt]# git clone https://github.com/bingyue/easy-springmvc-maven --克隆源代码
[root@java-server opt]# cd easy-springmvc-maven/
[root@java-server easy-springmvc-maven]# cp -r * /root/pm-test/  #将代码复制到自己的仓库中
​
提交代码到master
[root@java-server opt]# cd /root/pm-test/
[root@java-server pm-test]# git add .
[root@java-server pm-test]# git commit -m 'test 1'
[master 0f556ca] test 1
 9 files changed, 286 insertions(+), 3 deletions(-)
 create mode 100644 pom.xml
 create mode 100644 src/main/java/spring/demo/control/DemoController.java
 create mode 100644 src/main/java/spring/demo/service/DemoService.java
 create mode 100644 src/main/webapp/WEB-INF/applicationContext.xml
 create mode 100644 src/main/webapp/WEB-INF/dispatcher-servlet.xml
 create mode 100644 src/main/webapp/WEB-INF/web.xml
 create mode 100644 src/main/webapp/index.jsp
 create mode 100644 src/main/webapp/result.jsp
[root@java-server pm-test]# git push origin master
Counting objects: 22, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (20/20), 5.16 KiB | 0 bytes/s, done.
Total 20 (delta 1), reused 0 (delta 0)
To git@172.16.229.150:root/pm-test.git
   f341e1d..0f556ca  master -> master
[root@java-server pm-test]# 

配置jenkins页面

选择参数化构建,选择选项参数 

[root@jenkins-server ~]# cat .ssh/id_rsa

将jenkins服务器上面的root用户的公钥添加到git服务的git用户中

[root@jenkins-server ~]# ssh-copy-id -i git@172.16.229.150

可以看到jenkins界面已经ok

添加执行shell命令

定义ssh传输内容

第一个不需要写,写下面的就可以了

修改Java后端的app-jenkins.sh 

[root@java-server ~]# cat /opt/script/app-jenkins.sh
#!/usr/bin/bash
#本脚本适用于jenkins持续集成,实现备份war包到代码更新上线!使用时请注意全局变量。
#================
#Defining variables
export JAVA_HOME=/usr/local/java
webapp_path="/data/application/tomcat/webapps"
tomcat_run="/data/application/tomcat/bin"
updata_path="/data/update/`date +%F-%T`"
backup_path="/data/backup/`date +%F-%T`"
tomcat_pid=`ps -ef | grep tomcat | grep -v grep | awk '{print $2}'`
#files_dir="easy-springmvc-maven"  #注释掉
files="*.war" #修改为*.war
job_path="/root/upload"
​
#Preparation environment
echo "Creating related directory"
mkdir -p $updata_path
mkdir -p $backup_path
​
echo "Move the uploaded war package to the update directory"
mv $job_path/$files $updata_path
​
echo "========================================================="
cd /opt
echo "Backing up java project"
if [ -f $webapp_path/$files ];then
        tar czf $backup_path/`date +%F-%H`.tar.gz $webapp_path
        if [ $? -ne 0 ];then
                echo "打包失败,自动退出"
                exit 1
        else
                echo "Checking if tomcat is started"
                if [ -n "$tomcat_pid" ];then
                        kill -9 $tomcat_pid
                        if [ $? -ne 0 ];then
                                echo "tomcat关闭失败,将会自动退出"
                                exit 2
                        fi
                fi
                cd $webapp_path
                rm -rf $files && rm -rf *  #这里也需要修改
                cp $updata_path/$files $webapp_path
                cd /opt
                $tomcat_run/startup.sh
                sleep 5
                echo "显示tomcat的pid"
                echo "`ps -ef | grep tomcat | grep -v grep | awk '{print $2}'`"
                echo "tomcat startup"
                echo "请手动查看tomcat日志。脚本将会自动退出"
        fi
else
        echo "Checking if tomcat is started"
        if [ -n "$tomcat_pid" ];then
                kill -9 $tomcat_pid
                if [ $? -ne 0 ];then
                        echo "tomcat关闭失败,将会自动退出"
                        exit 2
                fi
        fi
        cp $updata_path/$files $webapp_path
        $tomcat_run/startup.sh
        sleep 5
        echo "显示tomcat的pid"
        echo "`ps -ef | grep tomcat | grep -v grep | awk '{print $2}'`"
        echo "tomcat startup"
        echo "请手动查看tomcat日志。脚本将会自动退出"
fi

登陆jenkins服务器编写脚本

这里需要理解:
在 Jenkins 部署脚本当中加入 git rev-parse HEAD 命令记录每次发布的版本的唯一版本号,并将此记录在一个log文件里,如果需要回滚,则由脚本取出上一次发布的版本号(命令为:tail -n $version+1 version.log | head -n 1)进行版本的回退,而后在回退的基础上再发布即可。
============================================
我这里的脚本是每构建一次将会的当前版本库的版本号记录下来。当回滚的时候通过看那个version.log文件里面的版本号的顺序,最新构建的版本号在最下面也就是当前版本号,在脚本里面当前版本号定义的是1,如果想回退一版那么这个版本号就在倒数第二行,两版就是倒数第三行,依次类推。那么在参数化构建的时候在version的那一栏里面输入对应数字1,就是回退上一版本,输入数字2回退上上次版本。
脚本里面定义的是Newversion=`expr $version + 1`
$version默认为0
git rev-parse HEAD >> $WORKSPACE/version.log:将版本号记录在工作目录下面的version.log文件里面,方便版本回退
[root@jenkins-server ~]# cd /opt/
[root@jenkins-server opt]# vim version.sh
#!/bin/bash
#本脚本用于参数化构建,项目发布与版本回滚,请慎用!
#============================
deploy(){
echo "deploy: $option"
cd $WORKSPACE
git rev-parse HEAD >> $WORKSPACE/version.log
}
rollback(){
Newversion=`expr $version + 1`
Head=`tail -n $Newversion $WORKSPACE/version.log | head -n 1`
cd $WORKSPACE
#git rev-parse HEAD >> $WORKSPACE/version.log
git reset --hard $Head
}
​
case $option in
deploy)
deploy
;;
rollback)
rollback
;;
*)
echo $"Usage: {deploy|rollback}" 
exit 1
;;
esac
[root@jenkins-server opt]# chmod +x version.sh

回到jenkins页面发布

查看版本号jenkins服务器(192.168.157.128)

[root@jenkins-server ~]# cd .jenkins/workspace/pm-test
[root@jenkins-server pm-test]# ls
pom.xml  README.md  src  target  version.log
[root@jenkins-server pm-test]# cat version.log 
f1a9440c7095457617c3e714fc3124c90415b962

查看后端服务器(192.168.157.131)

[root@java-server ~]# cd /data/application/tomcat/webapps/
[root@java-server webapps]# ls
easy-springmvc-maven  easy-springmvc-maven.war
[root@java-server webapps]# netstat -lntp | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      66398/java 

修改war包内容模拟代码更新

注意:为了区分,这里修改一个源代码重新上传到仓库中去。
克隆自己的仓库
[root@java-server ~]# git clone git@172.16.229.150:root/pm-test.git
正克隆到 'pm-test'...
remote: Enumerating objects: 23, done.
remote: Counting objects: 100% (23/23), done.
remote: Compressing objects: 100% (16/16), done.
remote: Total 23 (delta 1), reused 0 (delta 0), pack-reused 0
接收对象中: 100% (23/23), 5.35 KiB | 0 bytes/s, done.
处理 delta 中: 100% (1/1), done.
[root@java-server ~]# vim /opt/easy-springmvc-maven/src/main/webapp/index.jsp 
#修改源代码内容
[root@java-server ~]# cd pm-test/  
[root@java-server pm-test]# rm -rf *
[root@java-server pm-test]# cp /root/Client
Client/     Client.zip  
[root@java-server pm-test]# cp -r /opt/easy-springmvc-maven/* .
[root@java-server pm-test]# git add -A   #将代码提交到仓库
[root@java-server pm-test]# git commit -m "test 2"
[root@java-server pm-test]# git push origin master

登陆后端服务器查看

[root@java-server ~]# netstat -lntp | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      66594/java          
[root@java-server ~]# cd /data/application/tomcat/webapps/
[root@java-server webapps]# ls
Client  Client.war
[root@java-server webapps]# cd /data/backup/  #查看是否备份成功
[root@java-server backup]# ls
2020-11-22-17:40:59

开始回滚

将现在的client的war包回滚到easy-springmvc-maven.war包
查看版本号,回滚到上个版本
[root@jenkins-server ~]# cat /root/.jenkins/workspace/测试项目1/version.log 
553e0c651502098cf2cc165bb82a15fc81bbca03
560794a7ec1fa71cdf67c87069729c3f08d8e1c3

验证

[root@java-server ~]# netstat -lntp | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      122877/java         
[root@java-server ~]# cd /data/application/tomcat/webapps/
[root@java-server webapps]# ls
easy-springmvc-maven  easy-springmvc-maven.war
[root@java-server webapps]# cd /data/backup/
[root@java-server backup]# ls
2024-09-04-19:34:28 2024-09-04-19:44:55

到此根据git仓库每次提交的版本号回滚成功!

四、gitlab webhook + jenkins 实现代码自动化发布

Webhook(网络钩子)本质上也是API。一般与jenkins联合使用,gitlab的某个项目的代码更新了后就触发 webhook中配置的 url ,这个url一般是jenkins中某一个job的url。即gitlab代码更新后就会触发 jinkins的任务自动进行构建。
​
Webhook工作原理
为了及时通知,此时就产生了Webhook这种概念,其实就是为了更好地去通知调用的结果。在我们发出请求的时候,可以向服务器注册一个vWebhook的地址,告诉服务器说,等调用结果一出来,第一时间通过这个Webhook地址通知我,我好处理接下来的步骤。

gitlab创建项目

如上配置gitlab,登录gitlab

密码12345678

创建一个项目

Jenkins构建使用自由风格的软件项目

在Jenkins中创建一个新的任务:在Jenkins的首页,点击“新建任务”创建一个新的任务,选择自由风格的软件项目。

登录gitlab
获取git仓库地址

添加Gitlab认证用户和用户私钥 

添加git认证用户 

选择SSH 用户名私钥 

[root@jenkins-server ~]# useradd jenkins
[root@jenkins-server ~]# su - jenkins
[jenkins@jenkins-server ~]$ ssh-keygen
[jenkins@jenkins-server ~]$ cat .ssh/id_rsa  #查看jenkins用户的私钥

gitlab添加jenkins用户公钥

登录到jenkins服务器中
[jenkins@jenkins-server ~]$ cat .ssh/id_rsa.pub  #查看jenkins用户的公钥
​

注意: 先添加到验证文件中。
在jenkins机器上面执行 连接gitlab机器,
[root@jenkins-server ~]# ssh 192.168.157.129 -o StrictHostKeyChecking=no 

jenkins界面已经ok

构建触发器

选择项目后配置构建触发器,勾选Build when......,已勾选的不需取消,默认即可,下拉点击高级选项。再点击Generate,生成Secret token(后续Gitlab的WebHooks会用)

复制URL 

 

复制私钥 

gitlab配置Webhooks

复制Jenkins的URL和认证密钥,切换到gitlab,点击进入对应的git库项目,

点击setting --> Webhooks,粘贴URL和秘钥

 粘贴URL和秘钥

测试是否配置成功 

出现Hook executed successfully: HTTP 200即为成功。

如果添加完成之后报错

这是因为gitlab 10.6 版本以后为了安全,不允许向本地网络发送webhook请求,设置如下:

登录管理员账号

然后再次添加webhook
回到jenkins页面

测试

代码推送至master时,WebHooks会告知Jenkins开启部署

我这里在gitlab机器上面测试:
[root@git-server ~]# ssh-keygen #生成秘钥
[root@git-server ~]# cat .ssh/id_rsa.pub  #查看生成的公钥添加到gitlab里面去

[root@git-server ~]# git clone git@192.168.153.156:root/test1.git
Cloning into 'test1'...
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (6/6), done.
​
[root@git-server ~]# ls
anaconda-ks.cfg  test1  upload
[root@git-server ~]# cd test1/
[root@git-server test1]# ls
README.md 
[root@git-server test1]# touch a.txt 
[root@git-server test1]# git add .
[root@git-server test1]# git commit -m 'test'
[master 2451295] test
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 a.txt
[root@git-server test1]# git push origin master
Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 296 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.153.156:root/test1.git
   f3848d7..2451295  master -> master
返回到jenkins页面查看是否自动发布

 1.jenkins怎么备份恢复

导航到Jenkins的根目录,拷贝根目录主home下面的 .jenkins打个包,下次要恢复就用这个覆盖,所有的东西就都一模一样了。其实就是配置的东西都在这里面,plugins目录包含所有已安装的插件

​2.Jenkins主要整合了两个组成部分?

Jenkins与以下两个组件集成在一起:
持续集成(Continuous Integration, CI)持续交付/部署(Continuous Delivery/Deployment, CD/CD)。
1.GIT, SVN等版本控制系统
2.构建时打包Maven之类的工具。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue2+ueditor集成秀米编辑器

一、百度富文本编辑器 1.首先下载 百度富文本编辑器 下载地址&#xff1a;GitHub - fex-team/ueditor: rich text 富文本编辑器 2.把下载好的文件整理好 放在图片目录下 3. 安装插件vue-ueditor-wrap npm install vue-ueditor-wrap 4.在你所需要展示的页面 引入vue-uedito…

判断给定的一个不限长的数字串大小变化趋势、经典面试题:猴子排成圈踢出求最后剩下大王编号以及Debian服务器php中安装IMAP扩展各种报错解决过程

一、判断给定的一个不限长的数字串大小变化趋势 自制了一道面试题&#xff1a;给定一个不限长的数字字符串&#xff0c;判断每一位数字的大小变化趋势是否是^或v趋势&#xff0c;如果是就返回true&#xff0c;如果不是就返回false。比如121即属于^&#xff0c;322129即属于v。这…

Verilog和Matlab实现RGB888互转YUV444

文章目录 一、色彩空间1.1 RGB色彩空间1.2 CMYK色彩空间1.3 YUV色彩空间 二、色彩空间转换公式2.1 RGB转CMYK2.2 CMYK转RGB2.3 RGB888转YUV4442.4 YUV444转RGB888 三、MATLAB实现RGB888转YUV4443.1 matlab代码3.2 matlab结果 四、Verilog实现RGB888转YUV444 一、色彩空间 色彩空…

【区块链 + 物联网】区块链边缘计算网关设备 | FISCO BCOS应用案例

目前边缘端设备主要以人工智能应用为主&#xff0c;或以数据采集网络设备为主&#xff0c;还未有区块链边缘计算网关设备&#xff0c;难以 在依托终端设备的传统行业中进行区块链 应用。本项目研制区块链边缘计算网关&#xff0c;将区块链、计算与网络集成 在一起&#xff0c;…

单片机学习笔记

一、单片机帝国的诞生与发展 1.1 单片机的基本概念 单片机是一种集成电路芯片&#xff0c;采用超大规模的集成电路把具有数据处理功能的中央处理器存储器、输入输出端口、外围电路和相关外设集成在一块硅片上构成一个小而完整的微型计算机系统。 一般而言&#xff0c;单片机也…

Java语言程序设计基础篇_编程练习题**17.21 (十六进制编辑器)

目录 题目&#xff1a;**17.21 (十六进制编辑器) 代码示例 结果展示 题目&#xff1a;**17.21 (十六进制编辑器) 编写一个 GUI 应用程序&#xff0c;让用户在文本域输入一个文件名&#xff0c;然后按回车键&#xff0c;在文本域显示它的十六进制表达形式。用户也可以修改十六…

分类预测|基于蜣螂优化极限梯度提升决策树的数据分类预测Matlab程序DBO-Xgboost 多特征输入单输出 含基础模型

分类预测|基于蜣螂优化极限梯度提升决策树的数据分类预测Matlab程序DBO-Xgboost 多特征输入单输出 含基础模型 文章目录 一、基本原理1. 数据准备2. XGBoost模型建立3. DBO优化XGBoost参数4. 模型训练5. 模型评估6. 结果分析与应用原理总结 二、实验结果三、核心代码四、代码获…

1-9 图像膨胀 opencv树莓派4B 入门系列笔记

目录 一、提前准备 二、代码详解 kernel np.ones((3, 3), np.uint8) _, binary_image cv2.threshold(image, 127, 255, cv2.THRESH_BINARY) dilated_image cv2.dilate(binary_image, kernel, iterations1) 三、运行现象 四、完整代码 五、完整工程贴出 一、提前准备 …

scrapy 爬取微博(一)【最新超详细解析】:创建微博爬取工程

本项目属于个人学习记录&#xff0c;爬取的数据会于12小时内销毁&#xff0c;且不可用于商用。 1 初始化环境 首先我们需要有python环境&#xff0c;先安装一下python&#xff0c;然后配置环境变量&#xff0c;这边给出windows的配置&#xff1a; 我这边的安装目录是D:\pyt…

PHP轻量级高性能HTTP服务框架 - webman

摘要 webman 是一款基于 workerman 开发的高性能 HTTP 服务框架。webman 用于替代传统的 php-fpm 架构&#xff0c;提供超高性能可扩展的 HTTP 服务。你可以用 webman 开发网站&#xff0c;也可以开发 HTTP 接口或者微服务。 除此之外&#xff0c;webman 还支持自定义进程&am…

Django发送邮件

【图书介绍】《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》_django 5企业级web应用开发实战(视频教学版)-CSDN博客 Django 5框架Web应用开发_夏天又到了的博客-CSDN博客 本文学习怎么使用Django发送邮件。 尽管使用Python的smtplib模块发送电子邮件…

vant 动态查询下拉菜单(可用)

动态查询item项 <van-form submit"onSubmit" ref"formRef"><Title title"企业信息" title-line title-size"19" class"ml-[18px] mb-[18px]"></Title><van-cell-group inset class"py-[18px]&quo…

【JavaSE基础】Java 基础知识

Java 转义字符 Java 常用的转义字符 在控制台&#xff0c;输入 tab 键&#xff0c;可以实现命令补全 转义字符含义作用\t制表符一个制表位&#xff0c;实现对齐的功能\n &#xff1a;换行符\n换行符一个换行符\r回车符一个回车键 System.out.println(“韩顺平教育\r 北京”);&…

pod基础和镜像拉取策略

目录 pod概念 pod的分类 1.基础容器 pause 2.初始化容器 init 实验&#xff1a;定义初始化容器 init容器的作用 实验&#xff1a;如何在容器内部进行挂载 镜像拉取策略 pod概念 pod是k8s里面的最小单位&#xff0c;pod也是最小化运行容器的资源对象。容器是基于pod在k…

黑马点评10——用户签到-BitMap数据结构

文章目录 BitMap用法签到功能签到统计 BitMap用法 其实数据库完全可以实现签到功能 但签到数据比较大&#xff0c;借鉴签到卡的思想 布隆过滤器也是使用BitMap实现的. 签到功能 因为是当前用户的当天&#xff0c;所以保存需要的年月日不需要参数&#xff0c;可以直接获取。…

matter中的Fabric(网络结构)

什么是Fabric&#xff1f; Fabric可以被理解为一组相互信任的设备和控制器&#xff0c;它们共享一个共同的信任域。这意味着在同一个Fabric中的设备和控制器之间可以进行安全的通信&#xff0c;而无需额外的身份验证或安全检查。每个Fabric有一个唯一的标识&#xff0c;确保Fab…

Android调整第三方库PickerView宽高--回忆录

一、效果 // 时间选择implementation com.contrarywind:Android-PickerView:4.1.9 多年前&#xff0c;使用到事件选择器&#xff0c;但是PickerView默认宽度使满屏的&#xff0c;不太符合业务需求&#xff0c;当时为此花了许多时间&#xff0c;最终找到了解决方案&#xff0c;…

使用 Milvus 和 Streamlit 搭建多模态产品推荐系统

我们可以使用 Milvus 搭建多模态 RAG 应用&#xff0c;用于产品推荐系统。用户只需简单上传一张图片并输入文字描述&#xff0c;Google 的 MagicLens 多模态 Embedding 模型就会将图像和文本编码成一个多模态向量。然后&#xff0c;使用这个向量从 Milvus 向量数据库中找到最相…

JVM——Java虚拟机内存初识(面经篇之JVM内存)

网上说的太详细了,真不利于我的初识和记忆&#xff0c; 例如&#xff1a;堆区的young&#xff0c; old&#xff0c;讲了一大堆&#xff0c;结果&#xff0c;我连这些区域是干什么的都不知道&#xff0c;存储什么的都不知道&#xff0c; 害得是我自己总结&#xff1a; 堆&#x…

JavaWeb【day08】--(MySQL-Mybatis入门)

数据库开发-MySQL 1. 多表查询 1.1 概述 1.1.1 数据准备 SQL脚本&#xff1a; #建议&#xff1a;创建新的数据库 create database db04; use db04; ​ -- 部门表 create table tb_dept (id int unsigned primary key auto_increment comment 主键ID,name v…