Jenkins调用shell脚本实现java集群自动部署和一键回退(六)
Jenkins实现java集群自动部署
架构图
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
2.实现java项目手动上线
2.1.准备java代码
这里准备了一个hello word的源码
[root@gitlab data]# unzip helloworld.zip
- 1
- 2
- 3
2.2.将java项目推送至gitlab服务器
2.2.1新增一个helloword项目
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
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删掉重新安装
4.6.访问页面查看效果
自动部署成功
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
- 点赞
- 收藏
- 关注作者
评论(0)