Qiuliang's Site

做一个独立思考和具备创新能力的人,打造谦逊和强大的内心

【jenkins实战】利用shell实现远程重启tomcat

在前一篇文章中,介绍了如何利用jenkins来搭建一个持续集成平台,该平台可以帮助我们完成从获取代码、编译、打包、部署等一系列的事情,极大的方便了我们的日常开发工作。

但在实际使用中发现,之前使用的部署方式,是基于tomcat的热部署,这种方式不是很稳定,尤其在部署次数多了以后,经常出现内存溢出等错误,需要人工干预,这显然不是我们所希望的结果。如果是在一个比较大的研发团队,一般都会有一套自己开发的比较成熟的部署平台,比如我之前所在的团队,专门开发了一套自动化部署平台,简单来说就是在目标server上安装一个agent,利用该agent,可以干很多事情,比如执行前、后置脚本,收集日志、监控server等等。如果在一个创业型的中小规模技术团队,这个事情的成本是比较高的,因此需要另想办法。

其实解决部署稳定性的问题,一个比较简单的办法就是部署前先停止应用,部署完成后再把应用启动起来。

如果你的业务无法忍受短暂的停机,需要考虑部署时的容错,该方案不在本文讨论之列。

有了大致思路,开始实施就比较简单了,最后总结为如下几个点:

首先需要建立jenkins server和目标server的ssh信任关系

ssh-keygen -t [rsa|dsa]
ssh-copy-id -i ~/.ssh/id_rsa.pub user@your_ip_address

编写重启脚本

#!/bin/bash

# author : qiuliang
# date : 2015-10-15

# =====deploy变量=====

# 应用程序的context path,如果是根路径,变量值为 ROOT
app_context_path=salesvc
# 应用程序端口号
app_port=8082
# tomcat目录名称应该满足如下规范,例如:tomcat-端口号
app_tomcat_path=/home/work/tomcat-8082
# build完成的war包名称
war_name=api-1.0-SNAPSHOT.war
# war包地址
war_url='http://ci.aaa.com/job/api-sales/api/1.0-SNAPSHOT/api-1.0-SNAPSHOT.war'
# =====deploy变量 end=====

# 进入tomcat应用程序目录
cd $app_tomcat_path/webapps
# 备份最近一次的包
mv $app_context_path.war $app_context_path.war.bak
# 下载最后一次build的包,该地址需要根据应用具体地址修改
wget $war_url
# kill tomcat实例
tomcat_pid=`/usr/sbin/lsof -n -P -t -i :$app_port`
[ -n "$tomcat_pid" ] && kill -9 $tomcat_pid
# 删除应用程序目录
rm -fr $app_tomcat_path/webapps/$app_context_path
# 重命名context path
mv $war_name $app_context_path.war
# 重新启动tomcat
export JAVA_HOME=/usr/local/jdk1.7.0_79
cd $app_tomcat_path/bin/
./startup.sh

修改jenkins job配置

增加build post步骤,选择shell:

ssh 192.168.220.180 'bash -x -s' < api/src/main/resources/ci/deploy_test.sh

完成上述步骤后,执行job,如果最终显示SUCCESS,则大功告成。