Jekins 自启动Java应用的Shell笔记

     背景

        最近在研究jdk 的jvisualvm 对JVM服务远程监控时,意外的与jekins接轨了。公司使用jekins自动从Git上获得源码,打包后传到测试服务器并启动jar包,实现自动部署,而我需要做的是在测试服务器启动jar包时添加几个我设置的命令,因此不得不花功夫研究了下集成在jekins里的shell命令。之前对这方面的知识积累的比较浅薄(可以说是毫无积累),正好趁着这个机会,我好好熟悉一下shell脚本。(PS:以下脚本全都是公司的胡大佬无偿提供给大家学习参考的,趁他没发现之前,友友们赶紧学起来!)

     实践

        1、首先,我们来看jekins配置。在“构建触发器中”,构建时执行的命令如下:

cd ${WORKSPACE}
echo "开始构建: leixi-test"
sleep 2
bash ./deploy.sh

        这个命令一目了然,本质上是在执行包里的./deploy.sh脚本,那么我们来看看deploy.sh脚本。

        2、编写deploy.sh

        这是从项目中拷出来的deploy.sh脚本,是胡大佬一行行敲出来的,大概是怕我们这群菜鸡看不懂,他给每一行都加了注释。通过脚本和注释可以看出,jekins执行这个脚本主要的作用是打包,然后把包传到测试服务器上。至于在服务器上怎么启动,咱们还得看deploy.sh中的最后一行里写的update-leixi-test.sh。

#########################################################################
# File Name: deploy.sh
# desc: 将jenkins构建的包自动推送到测试服务器,并执行开发服务器上的相关脚本。
# Author: 胡大佬
#########################################################################
# 引入functions,以便在脚本中使用 /etc/init.d/functions 文件中的函数,后面几行均是如此
. /etc/init.d/functions
. /etc/sysconfig/network
. /etc/profile
. /etc/bashrc
# 在当前shell 环境中执行 ~/.bash_profile 文件中的命令
. ~/.bash_profile
# 设置环境变量 SHELL=/bin/bash
export SHELL=/bin/bash
# 开启调试模式
set -x
# 脚本执行出现错误时自动退出脚本
set -e

# 设置变量serverHost 为 10.0.6.183
serverHost=10.0.6.183

# 获取当前脚本的目录路径,赋值给CMD_PATH
CMD_PATH=`dirname $0`
# 输出当前工作目录的路径, echo 是标准输出指令,$PWD指当前路径
echo "current cmd path:$PWD"
# 进入当前脚本目录路径
cd $CMD_PATH

#执行打包操作,跳过单元测试
mvn clean package -DskipTests
#休眠两秒
sleep 2

# 删除旧jar包
rm -rf dist
# 创建dist文件夹,这时候的dist是在当前脚本目录的路径下
mkdir dist

# 复制新jar包到dist文件夹下
cp $CMD_PATH/target/leixi-test.jar ./dist/leixi-test.jar

# 发送jar包到部署机器
cd dist
# 复制jar包到serverHost服务器的www用户下的/opt/www/upload/ 路径下
scp ./leixi-test.jar  www@$serverHost:/opt/www/upload/leixi-test.jar
leixi-test
sleep 2
# 执行脚serverhost服务器的www用户下的update-leixi-test.sh脚本
ssh -t www@$serverHost "/opt/www/update-leixi-test.sh"

        上面的脚本中涉及到两个很重要的操作:往目标服务器发送文件,远程执行目标服务器的脚本,这个在操作时会遇到权限方面的限制,胡大佬给推荐了一个权限配置的教程,大家参考下:

      【Linux】两台机器互发文件scp命令以及配置ssh免密登陆

       

         3、编写update.sh

        这个文件是在测试服务器(我们公司10.0.6.183)上的/opt/www/文件夹下的,各个项目都大同小异,为了让各项目都独立启动,脚本的名字一般会加上项目名用于区分。

#跟上面的脚本一样,引入其他脚本,执行基础命令
. /etc/init.d/functions
. /etc/sysconfig/network
. /etc/profile
. /etc/bashrc
. ~/.bash_profile
export SHELL=/bin/bash

set -e

#设置项目名的变量
var=leixi-test
path=/opt/www

#设置启动时使用的配置文件为dev,启动jar包时会自动使用application-dev.yml
parm=-Dspring.profiles.active=dev


echo "开始更新:$var"


cd $path


# 1、ps -ef|grep -w ${var}.jar 找到leixi-test.jar 的进程 
# 2、grep -v grep 过滤掉 grep命令本身所产生的进程信息
# 3、awk '{print "kill -9 "$2";"}' 找到第2步符合条件的进程id,拼成kill -9 ID的命令
# 4、bash 执行生成的命令 
ps -ef|grep -w ${var}.jar|grep -v grep |awk '{print "kill -9 "$2";"}'|bash

# 递归创建/opt/www/leixi-test目录
mkdir -pv $path/$var
# 将/opt/www/upload下的文件leixi-test.jar拷到/opt/www/leixi-test下面,和上一个脚本接上了
cp ./upload/${var}.jar $path/$var/${var}.jar

cd $path/$var
#执行启动jar包的命令,这是原本的执行方式,为了在visualVm中监控这个服务,这里注释掉了,改用下面的方式。
#nohup java -Xms512m -Xmx512m  $parm -jar ${var}.jar >$path/logs/${var}.log &

# 这是可以通过visualVm监控jar包启动结果的启动方式
# -Xms512m  -Xmx512m 最小内存和最大内存都是512M
# -Dcom.sun.management.jmxremote 是否支持远程JMX访问,默认为true  
# -Dcom.sun.management.jmxremote.port=9999  JMX远程端口号,如果服务器开启了防火墙,需要将端口号配置在白名单里
# -Dcom.sun.management.jmxremote.ssl=false  是否对连接开启SSL加密
# -Dcom.sun.management.jmxremote.authenticate=false 是否需要开启用户认证
# -Djava.rmi.server.hostname=10.0.6.183 监控服务器的主机地址
# -Dcom.sun.management.jmxremote.rmi.port=9999 RMI端口号,与JMX端口号相同
nohup java -Xms512m  -Xmx512m -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false \
-Djava.rmi.server.hostname=10.0.6.183 -Dcom.sun.management.jmxremote.rmi.port=9999  $parm -jar ${var}.jar >$path/logs/${var}.log &

echo "升级 $var 完成"
echo ""

        这里也附上开启端口的命令,在CentOs的系统中,开启防火墙的状态下,可以通过cat /etc/sysconfig/iptables 查看开放的端口号:

        可以修改该文件,按相应的格式在文件中添加内容,或者执行以下命令来开放端口: 

        sudo iptables -A INPUT -p tcp --dport 9999 -j ACCEPT

        (注意,之前在另一个服务器里没找到/etc/sysconfig/iptables文件,我才用的以上命令,但是后来检查过,那个服务器并没有开启防火墙,所以我也不知道这个命令是否有效,有iptables时推荐直接改iptables)

        开放端口后,记得重启下访问控制服务

        /etc/init.d/iptables restart 或 sudo service iptables restart

        4、JVM远程监控

        完成以上步骤后,咱们在jekins上重启服务,再在本地打开[JAVA_HOME]\bin\jvisualvm,配置脚本中写的主机名和端口号,即可监控到远程服务器10.0.6.183上的java应用的运行情况了。具体过程如下:

        4.1、左侧菜单-->远程-->添加远程主机,输入主机IP

        4.2、点击远程主机-->点击JMX连接-->添加端口号

        4.3、监控服务

        以上就是今天分享的全部心得了,码字不易,希望能帮到有需要的家人们。

  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值