背景
最近在研究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、监控服务
以上就是今天分享的全部心得了,码字不易,希望能帮到有需要的家人们。