推荐一个适合小公司的自动化部署脚本
在小小的公司里面,挖呀挖呀挖。快挖不动了,一件事重复个 5 次,还在人肉手工,身体和心理就开始不舒服了,并且违背了个人的座右铭:“偷懒”是人类进步的第一推动力。
每次想要去测试环境验证个新功能,又或者被测试无情的催促着部署新版本后;都需要本地打那个 200 多 M 的 jar 包;以龟速般的每秒几十 KB 网络,通过 ftp 上传到服务器;用烂熟透的 jps 命令查找到进程,kill 后,重启服务。是的,我想偷懒,想从已陷入到手工部署的沼泽地里走出来。
如何救赎?自我救赎之路我的诉求很简单,想要一款“一键 CI/CD 的工具”,然后可以继续偷懒。为了省事,我做了以下工作找了一款停止服务的脚本,并做了小小的优化首推 陈皮大哥的停服脚本(我在里面加了个 sleep 5);脚本见下文。只需要修改 APP_MAINCLASS 的变量“XXX-1.0.0.jar”替换为自己 jar 的名字即可,其它不用动。该脚本主要是通过 jps + jar 的名字获得进程号,进行 kill。
( 脚本很简单,注释也很详细,就不展开了,感兴趣可以阅读下,不到 5 分钟,写过代码的你能看懂的)把以下脚本保存为 stop.shshell 复制代码 #!/bin/bash
主类
APP_MAINCLASS="XXX-1.0.0.jar"
进程 ID
psid=0
记录尝试次数
num=0
获取进程 ID,如果进程不存在则返回 0,当然你也可以在启动进程的时候将进程 ID 写到一个文件中,然后使用的使用读取这个文件即可获取到进程 ID
getpid() {javaps=jps -l | grep $APP_MAINCLASS
if [ -n "$javaps" ]; thenpsid=echo $javaps | awk '{print $1}'
elsepsid=0fi}stop() {getpidnum=expr $num + 1
if [ psid -ne 0 ]; then# 重试次数小于3次则继续尝试停止服务if [ "num" -le 3 ];thenecho "attempt to kill... num:psidsleep 5else# 重试次数大于 3 次,则强制停止 echo "force kill..."kill -9 $psid
fi
检查上述命令执行是否成功
elseecho "App is not running"fi}stop
编写 2 行的 shell 启动脚本修改脚本中的 XXX-1.0.0.jar 为你自己的 jar 名称即可。保存脚本内容为 start.sh。jvm 参数可自行修改 shell 复制代码 basepath=$(cd dirname $0
; pwd)nohup java -server -Xmx2g -Xms2g -Xmn1024m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseParNewGC -XX:-UseAdaptiveSizePolicy -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails -Xloggc:logs/gc.log -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:HeapDumpPath=logs/dump.hprof -XX:ParallelGCThreads=4 -jar $basepath/XXX-1.0.0.jar &>nohup.log &
复用之前 jenkins,自己写部署脚本脚本一定要放到 Post Steps 里
这 9 行脚本,主要干了几件事:
备份正在运行的 jar 包;(万一有啥情况,还可以快速回滚)把 jenkins 上打好的包,复制到目标服务上执行停服脚本执行启动服务脚本
脚本见下文:shell 复制代码 ssh -Tq $IP << EOFsource /etc/profile#进入应用部署目录 cd /data/app/test##备份时间戳 DATE=date +%Y-%m-%d_%H-%M-%S
#删除备份 jar 包 rm -rf /data/app/test/xxx-1.0.0.jar.bak*#备份历史 jar 包 mv /data/app/test/xxx-1.0.0.jar /data/app/test/xxx-1.0.0.jar.bakDATE#从jenkins上拉取最新jar包scp root@jenkisIP:/data/jenkins/workspace/test/target/XXX-1.0.0.jar /data/app/test
执行停止应用脚本
sh /data/app/test/stop.sh#执行重启脚本 sh /data/app/test/start.shexitEOF
注:
jenkisIP 是 jenkins 所在的服务器 ip。 在部署前请设置 jenkins 服务器和部署服务器之间 ssh 免密登录/data/app/test 是部署 jar 包存放路径 stop.sh 是上文的停止脚本 start.sh 是上文的启动脚本
总结如果不想把时间浪费在本地打包,忍受不了上传 jar 包的龟速网络,人肉停服和启动服务。请尝试下这款自动部署化脚本。小小的投入,带来大大的回报。
评论