Jenkins调用shell脚本实现java集群自动部署和一键回退(六)

举报
jiangxl 发表于 2022/04/14 00:20:06 2022/04/14
【摘要】 Jenkins实现java集群自动部署 架构图 1.集群准备 1.1.环境概述 服务ipgitlab192.168.81.210Jenkins192.168.81.220nginx-lb192...

Jenkins实现java集群自动部署

架构图

20200904150821176

1.集群准备

1.1.环境概述

服务 ip
gitlab 192.168.81.210
Jenkins 192.168.81.220
nginx-lb 192.168.81.230
nginx+tomcat 192.168.81.240
nginx+tomcat 192.168.81.250

1.2.在web集群部署tomcat+nginx反向代理

配置nginx反向代理主要是为了动静分离,动态资源tomcat处理,静态资源nginx处理

web01配置

1.安装tomcat
[root@web01 ~]# yum -y install java

[root@web01 ~]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.37/bin/apache-tomcat-9.0.37.tar.gz
[root@web01 ~]# mkdir /application
[root@web01 ~]# tar xf apache-tomcat-9.0.37.tar.gz -C /application/

[root@web01 ~]# cd /application/
[root@web01 application]# ln -s apache-tomcat-9.0.37/ tomcat
[root@web01 application]# ./tomcat/bin/startup.sh 
Using CATALINA_BASE:   /application/tomcat
Using CATALINA_HOME:   /application/tomcat
Using CATALINA_TMPDIR: /application/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar
Tomcat started.


2.配置nginx反向代理
[root@web01 application]# yum -y install nginx
[root@web01 application]# vim /etc/nginx/conf.d/hello.conf
server {
        listen 80;
        server_name hello.jiangxl.com;

        location / {
                proxy_pass http://127.0.0.1:8080;
        }
}

[root@web01 application]# nginx -t
[root@web01 application]# systemctl restart nginx

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

web02配置

1.安装tomcat
[root@web02 ~]# yum -y install java

[root@web02 ~]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.37/bin/apache-tomcat-9.0.37.tar.gz
[root@web02 ~]# mkdir /application
[root@web02 ~]# tar xf apache-tomcat-9.0.37.tar.gz -C /application/

[root@web02 ~]#  cd /application/
[root@web02 application]# ln -s apache-tomcat-9.0.37/ tomcat
[root@web02 application]# ./tomcat/bin/startup.sh
Using CATALINA_BASE:   /application/tomcat
Using CATALINA_HOME:   /application/tomcat
Using CATALINA_TMPDIR: /application/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar
Tomcat started.


2.配置nginx反向代理
[root@web02 application]# yum -y install nginx
[root@web02 application]# vim /etc/nginx/conf.d/hello.conf
server {
        listen 80;
        server_name hello.jiangxl.com;

        location / {
                proxy_pass http://127.0.0.1:8080;
        }
}
[root@web02 application]# nginx -t
[root@web02 application]# systemctl restart nginx


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

1.3.配置nginx负载均衡

[root@nginxlb ~]# vim /etc/nginx/conf.d/proxy_hello.conf
upstream hello {
        server 192.168.81.240:80;
        server 192.168.81.250:80;
}

server {
        listen 80;
        server_name tomcat.jiangxl.com;
        location / {
                proxy_pass http://hello;
                proxy_set_header HOST $http_host;
        }
}

[root@nginxlb ~]# nginx -t
[root@nginxlb ~]# systemctl restart nginx

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

1.4.验证负载均衡

修改web站点内容,使得两个节点不太一样
1.web01配置
[root@web01 application]# vim tomcat/webapps/ROOT/index.jsp 
<h3>Developer Quick Start web01</h3>			#77行
[root@web01 application]# pkill java
[root@web01 application]# ./tomcat/bin/startup.sh 

2.web02配置
[root@web02 application]# vim tomcat/webapps/ROOT/index.jsp 
<h3>Developer Quick Start web02</h3>			#77行
[root@web02 application]# pkill java
[root@web02 application]# ./tomcat/bin/startup.sh

3.验证nginx负载均衡
负载成功

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

20200904152848011

2.实现java项目手动上线

2.1.准备java代码

这里准备了一个hello word的源码
[root@gitlab data]# unzip helloworld.zip 


  
 
  • 1
  • 2
  • 3

2.2.将java项目推送至gitlab服务器

2.2.1新增一个helloword项目

20200904164526898

2.2.2.将代码推送至giitlab

[root@gitlab helloworld]# git init
[root@gitlab helloworld]# git remote remove origin
[root@gitlab helloworld]# git remote add origin  origin git@gitlab.jiangxl.com:root/helloword.git
[root@gitlab helloworld]# git add .
[root@gitlab helloworld]# git commit -m "Initial commit"
[root@gitlab helloworld]# git push -u origin maste

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

20200904164750741

2.3.手动拉取源代码

通过克隆的方式把代码拉取代码
[root@jenkins data_gitlab]# git clone git@gitlab.jiangxl.com:root/helloworld.git
正克隆到 'helloworld'...
remote: Enumerating objects: 13, done.
remote: Counting objects: 100% (13/13), done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 13 (delta 0), reused 0 (delta 0)
接收对象中: 100% (13/13), done.

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2.4.对源代码进行编译成war包

2.4.1.编程成war包

1.安装maven
[root@jenkins ~]# yum -y localinstall maven

2.配置maven阿里云仓库
[root@jenkins ~]# vim /etc/maven/settings.xml 
#被子在159行
<mirror>
    <id>aliyunmaven</id>
    <mirrorOf>*</mirrorOf>
    <name>阿里云公共仓库</name>
    <url>https://maven.aliyun.com/repository/public</url>
</mirror>

3.进入代码目录
[root@jenkins ~]# cd /data_gitlab/helloworld
[root@jenkins helloworld]# mvn package
[INFO] Building war: /data_gitlab/helloworld/target/helloworld.war	#war包路径

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

在这里插入图片描述

2.4.2.maven打包报错解决

错误1
[ERROR] The goal you specified requires a project to execute but there is no POM in this directory (/data_gitlab/helloword). Please verify you invoked Maven from the correct directory. -> [Help 1]
解决:这是由于当前代码目录没有pom.xml导致的,需要准备pom.xml

  
 
  • 1
  • 2
  • 3

2.5.通过scp方式将war包推送至web集群

1.清空tomcat中webapps下的所以目录
[root@jenkins helloworld]# for i in 240 250
> do
> ssh root@192.168.81.${i} "rm -rf /application/tomcat/webapps/*"
> done

2.将代码scp至web集群
[root@jenkins helloworld]# for i in 240 250
> do
> scp /data_gitlab/helloworld/target/helloworld.war root@192.168.81.${i}:/application/tomcat/webapps/ROOT.war
> done


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2.6.重启tomcat

[root@jenkins helloworld]# for i in 240 250
> do
> ssh root@192.168.81.${i} "pkill java && sh /application/tomcat/bin/startup.sh"
> done
Tomcat started.
Tomcat started.

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.7.访问应用

http://tomcat.jiangxl.com/index.html

  
 
  • 1

在这里插入图片描述

3.Jenkins实现java项目自动编译

思路:

1.需要新建一个maven的项目并按照Maven intergration plugin插件

2.Jenkins抓取gitlab上的java代码

3.Jenkins调用maven进行编译构建

4.Jenkins调用shell进行推送

3.1.安装Maven Integration插件

在这里插入图片描述

如果在这里安装失败,请去http://updates.jenkins-ci.org/download/plugins/maven-plugin/2.14/maven-plugin.hpi这个链接下载hpi文件,然后点击高级上传即可

  
 
  • 1

在这里插入图片描述

3.2.创建一个maven项目

在这里插入图片描述

3.3.配置项目中的git源码管理

在这里插入图片描述

3.4.配置maven参数

配置maven参数,使得Jenkins识别maven部署路径、jdk部署路径,以便以能够对java代码进行编译,最后打包成war包即可发布。

查看maven部署路径以及jdk部署路径
[root@jenkins plugins]# mvn --version
Apache Maven 3.0.5 (Red Hat 3.0.5-17)	
Maven home: /usr/share/maven				#maven路径
Java version: 1.8.0_262, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.262.b10-0.el7_8.x86_64/jre		#jdk路径
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-957.el7.x86_64", arch: "amd64", family: "unix"

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Build就是配置maven参数

在这里插入图片描述

3.4.1.新增jdk安装路径

点击新增jdk----取消install automatically的对勾

在这里插入图片描述

填写别名和jdk路径

在这里插入图片描述

3.4.2.新增maven安装路径

点击新增—取消install automatically的对勾

在这里插入图片描述

填写部署路径—点击保存

在这里插入图片描述

3.4.3.填写maven选项

配置完maven和jdk后再次刷新项目配置页面会发现不再有刚刚的提示信息

Goals and options这里填写的就是maven的目录选项,因此只填写package即可
在这里插入图片描述

3.5.填写部署前操作

在这里插入图片描述

3.6.调用maven进行编译构建

先预先看一下效果,能否编译成功,如果能成功在配置脚本部署方面

部署前操作

在这里插入图片描述

编译成功,会看到war包的路径
在这里插入图片描述

4.改造maven 项目实现自动构建

4.1.增加参数化构建tag标签

在这里插入图片描述

源码管理—分支选择更改的${git_version}

在这里插入图片描述

4.2.编写自动构建脚本

思路:首先把打好的war包通过scp的方式拷贝至web集群的/opt目录,并在/opt目录进行解压,解压后再将tomcat/webapps目录的所有文件删掉,再将/opt目录解压的目录链接到tomcat/webapps/ROOT,最后重启tomcat即可实现自动部署。

[root@jenkins script]# vim java_deploy_tag.sh 
#!/bin/bash
Date=`date +%F-%H-%M`
monitor_dir=/var/lib/jenkins/workspace/freestyle-monitor
web_server="192.168.81.240 192.168.81.250"
NAME=${Date}-${git_version}
war_dir=/opt/ROOT-${NAME}
war_pack=/opt/ROOT-${NAME}.war
war_root=/application/tomcat/webapps

jenkins_work () {
        cd ${WORKSPACE}
}

scp_war(){
        for host in $web_server
        do
                scp -r target/*.war root@${host}:${war_pack}
                ssh root@$host "mkdir -p $war_dir && \
                                unzip ${war_pack} -d ${war_dir} && \
                                rm -rf ${war_pack} && \
                                rm -rf ${war_root}/ROOT* && \
                                ln -s $war_dir $war_root/ROOT && \
                                pkill java && \
                                sh /application/tomcat/bin/startup.sh"
        done
}

deploy(){
        jenkins_work
        scp_war
}

deploy


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

4.3.在项目中添加执行脚本

点击post steps----run only if build succeeds

run only if build succeeds:仅在maven构建成功后执行
Run only if build succeeds or is unstable:只有构建成功或不稳定的运行
Run regardless of build result:无论何时都要运行

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述

4.4.在git上打标签并推送至gitlab

1)修改代码
[root@gitlab helloworld]# vim src/main/webapp/index.html 
Hello World !
<p>
<p>
<h1> Jiangxl -v1.1</h1>

2)提交至gitlab
[root@gitlab helloworld]# git add .
[root@gitlab helloworld]# git commit -m "v1.1"
[root@gitlab helloworld]# git push origin master

3)打标签
[root@gitlab helloworld]# git tag -a "v1.1" -m "v1.1"
[root@gitlab helloworld]# git push origin v1.1


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在这里插入图片描述

4.5.根据版本进行构建

立即构建

在这里插入图片描述

控制台输出

在这里插入图片描述

如果构建报错如下图,请将jdk删掉重新安装

20200913172555901

4.6.访问页面查看效果

自动部署成功

20200906105659114

5.java项目自动回退

5.1.编写脚本

思路:增加一个rollback的函数,通过find目录查找到要回退的版本的目录,然后通过软连接挂到webapps下面即可,通过deplo_env来判断是部署还是回退,本次增加了防止重复构建的功能

[root@jenkins script]# vim java_deploy_rollback_tag.sh 
#!/bin/bash
Date=`date +%F-%H-%M`
monitor_dir=/var/lib/jenkins/workspace/freestyle-monitor
web_server="192.168.81.240 192.168.81.250"
NAME=${Date}-${git_version}
war_dir=/opt/ROOT-${NAME}
war_pack=/opt/ROOT-${NAME}.war
war_root=/application/tomcat/webapps

jenkins_work () {
        cd ${WORKSPACE}
}

scp_war(){
        for host in $web_server
        do
                scp -r target/*.war root@${host}:${war_pack}
                ssh root@$host "mkdir -p $war_dir && \
                                unzip ${war_pack} -d ${war_dir} && \
                                rm -rf ${war_pack} && \
                                rm -rf ${war_root}/ROOT* && \
                                ln -s $war_dir $war_root/ROOT && \
                                pkill java && \
                                sh /application/tomcat/bin/startup.sh"
        done
}

rollback () {
        for host in ${web_server}
        do
                back_file=$(ssh root@${host} "find /opt -maxdepth 1 -type d -name "ROOT-*${git_version}*"")
                ssh root@${host} "rm -rf ${war_root}/* && \
                                  ln -s $back_file $war_root/ROOT && \
                                  pkill java && \
                                  sh /application/tomcat/bin/startup.sh"
        done
}

deploy(){
        jenkins_work
        scp_war
}

if [ $deploy_env == "deploy" ];then
        if [ ${GIT_COMMIT} == ${GIT_PREVIOUS_SUCCESSFUL_COMMIT} ];then
                echo "该 ${git_version} 已经构建过了,无需再进行构建!!!"
        else
                deploy
        fi
elif [ $deploy_env == "rollback" ];then
        rollback
fi

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

5.2.改造项目

1.修改脚本路径
在这里插入图片描述

2.增加一个参数化构建choice parameters

在这里插入图片描述

扩展:项目中的框可以随意调至,比如把刚刚新增的choice参数拉倒上面

在这里插入图片描述

构建时就会看到choice参数在上面
在这里插入图片描述

5.3.打一个1.2版本的标签并将项目升级到1.2版本

5.3.1.打标签

1)打标签
[root@gitlab helloworld]# vim src/main/webapp/index.html 
Hello World !
<p>
<p>
<h1> Jiangxl -v1.2</h1>

2)提交代码到gitlab
[root@gitlab helloworld]# git add .
[root@gitlab helloworld]# git commit -m "v1.2"
[root@gitlab helloworld]# git push origin master

3)打标签并推送
[root@gitlab helloworld]# git tag -a "v1.2" -m "v1.2"
[root@gitlab helloworld]# git push origin v1.2 

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在这里插入图片描述

5.3.2.升级到1.2版本

开始构建1.2版本

在这里插入图片描述

升级成功
在这里插入图片描述

5.4.回退至1.1版本

一般来说还是把回退单独放新建一个项目好,省掉了git拉取代码的时间以及maven构建的时间

在这里插入图片描述

文章来源: jiangxl.blog.csdn.net,作者:Jiangxl~,版权归原作者所有,如需转载,请联系作者。

原文链接:jiangxl.blog.csdn.net/article/details/111190911

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。