写点什么

推荐一个适合小公司的自动化部署脚本

  • 2023-11-16
    福建
  • 本文字数:1711 字

    阅读完需:约 6 分钟

推荐一个适合小公司的自动化部署脚本

在小小的公司里面,挖呀挖呀挖。快挖不动了,一件事重复个 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_MAINCLASSif [ -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

检查上述命令执行是否成功

if [ $? -eq 0 ]; then   echo "Shutdown success..."else   echo "Shutdown failed..."fi# 重新获取进程ID,如果还存在则重试停止getpidif [ $psid -ne 0 ]; then   echo "getpid... num:$psid"   stopfi
复制代码


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 包的龟速网络,人肉停服和启动服务。请尝试下这款自动部署化脚本。小小的投入,带来大大的回报。


用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
推荐一个适合小公司的自动化部署脚本_程序员_白日梦批发商_InfoQ写作社区