使用jenkins自动化部署tomcat业务
一、部署前环境
运维机(81)上部署jenkins,使用jenkins创建任务自动拉取gitee上源代码,运行源代码中deploy.sh部署脚本进行本地tomcat业务部署。
所需软件:
jenkins-2.332.3-1.1.noarch.rpm ---Jenkins软件包
jenkins-2.332.3-plugins.tar.gz --- Jenkins插件包
git
二、部署过程
运维机(81)安装jenkins
软件包上传到运维机(81)上。安装、查看jar包路径、java运行。
[root@jx-ops-81 opt]# yum install -y jenkins-2.332.3-1.1.noarch.rpm
[root@jx-ops-81 opt]# rpm -ql jenkins
/etc/init.d/jenkins
/etc/logrotate.d/jenkins
/etc/sysconfig/jenkins
/usr/bin/jenkins
/usr/lib/systemd/system/jenkins.service
/usr/sbin/rcjenkins
/usr/share/java/jenkins.war
/usr/share/jenkins
/usr/share/jenkins/migrate
/var/cache/jenkins
/var/lib/jenkins
/var/log/jenkins
[root@jx-ops-81 opt]# nohup java -jar /usr/share/java/jenkins.war &
默认的用户是admin,密码在`/root/.jenkins/secrets/initialAdminPassword`。
把插件包解压到`/root/.jenkins/plugins`内。重启Jenkins。
tar -zxvf jenkins-2.332.3-plugins.tar.gz -C /root/.jenkins/plugins
至此jenkins部署完毕。
我们需要做一条映射,在网关服务器(254)上添加一条指向运维服务器(81)的8080端口。并且虚拟机也要做一条映射。
# 254 网关映射
iptables -t nat -A PREROUTING -d 10.0.3.15/32 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 10.10.10.81:8080
# 虚拟机映射
127.0.0.1 8080 -> 8080
我们可以通过访问http://127.0.0.1/a.html网址访问业务。
1.Jenkins任务创建过程
新建任务-》创建一个自由风格的软件项目名称叫做jx1206-》源码管理选择git(这里需要gitee项目网址我们一会在说怎样获取)-》构建选择执行shell->(bash -x deploy.sh)保存。
gitee项目网址获取:
在运维机(81)上输入git remote -v 。
[root@jx-ops-81 jx1206]# git remote -v
origin https://gitee.com/smithlee/jx1206.git (fetch)
origin https://gitee.com/smithlee/jx1206.git (push)
我们点击工程jx1206,左侧点击立即构建,任务开始执行,执行过程可以点击控制台输出查看详情。
我们来看控制台的输出
Started by user admin
Running as SYSTEM
Building in workspace /root/.jenkins/workspace/jx1206
The recommended git tool is: NONE
No credentials specified
> git rev-parse --resolve-git-dir /root/.jenkins/workspace/jx1206/.git # timeout=10
Fetching changes from the remote Git repository
> git config remote.origin.url https://gitee.com/smithlee/jx1206.git # timeout=10
Fetching upstream changes from https://gitee.com/smithlee/jx1206.git
> git --version # timeout=10
> git --version # 'git version 2.27.0'
> git fetch --tags --force --progress -- https://gitee.com/smithlee/jx1206.git +refs/heads/*:refs/remotes/origin/* # timeout=10
> git rev-parse refs/remotes/origin/master^{commit} # timeout=10
Checking out Revision dd3afa1cdcc23ff7f32839786c8b9e0b4368b567 (refs/remotes/origin/master)
> git config core.sparsecheckout # timeout=10
> git checkout -f dd3afa1cdcc23ff7f32839786c8b9e0b4368b567 # timeout=10
Commit message: "添加脚本运行环境变量"
> git rev-list --no-walk 4518fa79d1d6c6873c6d41bbeb3bb3e55c32a946 # timeout=10
[jx1206] $ /bin/sh -xe /tmp/jenkins5849578395838537736.sh
+ bash -x deploy.sh
+ export BUILD_ID=dontkillme
+ BUILD_ID=dontkillme
+ mvn package
[INFO] Scanning for projects...
[INFO]
[INFO] ---------------------------< com.jx:virstu >----------------------------
[INFO] Building virstu 0.0.1-SNAPSHOT
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ virstu ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ virstu ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:3.1.0:testResources (default-testResources) @ virstu ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /root/.jenkins/workspace/jx1206/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ virstu ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ virstu ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-war-plugin:3.2.3:war (default-war) @ virstu ---
[INFO] Packaging webapp
[INFO] Assembling webapp [virstu] in [/root/.jenkins/workspace/jx1206/target/virstu]
[INFO] Processing war project
[INFO] Copying webapp resources [/root/.jenkins/workspace/jx1206/src/main/webapp]
[INFO] Webapp assembled in [39 msecs]
[INFO] Building war: /root/.jenkins/workspace/jx1206/target/virstu.war
[INFO]
[INFO] --- spring-boot-maven-plugin:2.3.2.RELEASE:repackage (repackage) @ virstu ---
[INFO] Replacing main artifact with repackaged archive
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.239 s
[INFO] Finished at: 2024-12-21T14:58:20+08:00
[INFO] ------------------------------------------------------------------------
+ ps -ef
+ grep tomcat
+ grep -v grep
+ awk '{print $2}'
+ xargs kill
kill: not enough arguments
+ rm /opt/tomcat8/webapps/ROOT /opt/tomcat8/webapps/ROOT.war -rf
+ cp /root/.jenkins/workspace/jx1206/target/virstu.war /opt/tomcat8/webapps/ROOT.war
+ true
++ netstat -anp
++ grep 80 -w
+ have=
+ '[' -n '' ']'
+ break
+ /opt/tomcat8/bin/startup.sh
Tomcat started.
+ true
+ curl 127.0.0.1/a.html
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
curl: (7) Failed to connect to 127.0.0.1 port 80: Connection refused
+ '[' 7 -eq 0 ']'
+ sleep 3
+ true
+ curl 127.0.0.1/a.html
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 18 100 18 0 0 243 0 --:--:-- --:--:-- --:--:-- 243
<p>ffffffffff</p>
+ '[' 0 -eq 0 ']'
+ break
+ echo 'deploy done...'
deploy done...
[jx1206] $ /bin/sh -xe /tmp/jenkins4548583400132320619.sh
Finished: SUCCESS
它先从gitee拉取最新代码到工作区`/root/.jenkins/workspace/jx1206/`,后面的所有操作都在工作区进行。
他的工作路径可以使用`echo $WORKSPACE`获取。
执行完任务后我们测试业务发现无法访问,查看tomcat进程发现没有进程。通过网上查资料发现jenkins中启动tomcat程序后退出后会杀掉该进程。
需要保留进程,我们需要在部署脚本(`deploy.sh`)中代码最开始添加环境变量参数。
#添加环境变量不要杀掉脚本
export BUILD_ID=dontkillme
再次执行jenkins后,业务访问成功了。
2.部署脚本
deploy.sh
#!/bin/bash
#拉取最新代码
#git pull --all
#添加环境变量不要杀掉脚本
export BUILD_ID=dontkillme
#自定义获取包版本号
sed -i "s/__ver/ver:$BUILD_NUMBER/g" src/main/webapp/WEB-INF/cgi/head.sh
# 打包
mvn package
# 结束tomcat进程
#killall java
ps -ef | grep tomcat |grep -v grep | awk '{print $2}' | xargs kill
# 删除旧war包
rm /opt/tomcat8/webapps/* -rf
# 更新war包
cp $WORKSPACE/target/virstu.war /opt/tomcat8/webapps/ROOT.war
#循环等待80端口释放
while true; do
have=$(netstat -anp | grep 80 -w)
if [ -n "$have" ]; then
sleep 2
else
break
fi
done
# 启动tomcat程序
/opt/tomcat8/bin/startup.sh
# 测试127.0.0.1
while true; do
curl 127.0.0.1/a.html
if [ $? -eq 0 ]; then
break
fi
sleep 3
done
echo "deploy done..."
注意脚本这里:
我们使用jenkins工作空间路径或者用相对路径,不可以用绝对路径。因为它是先把代码拷贝一份到工作路径,后续所有动作都是基于工作路径的。
cp $WORKSPACE/target/virstu.war /opt/tomcat8/webapps/ROOT.war
评论区