(一)用sh和Jenkins优化部署Jar/Docker -- sh部署Jar篇

一、背景

        在开发中,经常需要在开发服务器上部署JAR包,重复性的需要完成查进程ID,kill进程,执行命令启动,查看日期是否启动成功等操作,本着不做重复工作的原则,通过sh脚本实现这些操作,在部署时执行执行一下sh脚本就好。

二、思路

        1、通过命令查询进程ID

                方式①,通过Jar名称查询

pid=($(ps -ef|grep xxx.jar|awk '{print $2}'))

                 方式②,通过端口号查询       

port='8080'
pid_str=($(netstat -ltnp|grep :$port | awk '{print $7}'))
pid=${pid_str///java/}

        建议用方式②,应为方式①可能存在相同jar名称的多个进程,如此无法区分;但是通过端口号查询进程ID一定是唯一准确的。

        2、 通过命令结束运行中应用 

#判断并停止服务
length=${#pid[@]}
if [ $length -gt 0 ] ;then
	kill -9 $pid
	echo "服务已停止"
fi

       3、 重新启动应用

#这样命令启动,日志按照logback配置的输出
nohup java -jar xxx.jar >/dev/null 2>&1 &

      4、 通过日志检查是否启动完成

                1、通过搜索日志中启动完成的标志字符串判断是否完成启动

                2、标志字符串比如:Started MySpringBootApplication,根据项目不同设定

                3、设置最长等待时间,睡眠每2秒检测一次是否启动完成        

#启动过程等待完成

today=($(date --date today +%Y-%m-%d))
#echo "今日:$tody"
log_file_path="xxx/logs/info-${today}.log"
fun_echo_yellow "服务今日日志文件:$log_file_path"

#保存当前已有日志文件
if [ -f $log_file_path ] 
then 
	log_file_path_backup="xxx/logs/info-${today}_backup_$(date +'%H时%M分%S秒').log"
	fun_echo_yellow "服务今日日志文件 备份:$log_file_path_backup"
	cp $log_file_path $log_file_path_backup
fi

#清空当前日志文件内容
echo "" > $log_file_path

##清空错误日志文件内容
error_file_path="xxx/logs/error-${today}.log"
echo "" > $error_file_path

#睡眠总时长
sleep_seconds=2


sleep 2
startFlagLine=($(grep "$start_complete_flag"  $log_file_path |  awk '{print $10  $11}'))
while([ -z "Started MySpringBootApplication" ])
do
    fun_echo_g_white "启动中... 耗时: ${sleep_seconds}秒"
    startFlagLine=($(grep "$start_complete_flag"  $log_file_path |  awk '{print $10  $11}'))
    if [ $sleep_seconds -gt $waiting_max_seconds ];then
		break
    fi
    sleep 2
    sleep_seconds=$(expr $sleep_seconds + 2) 
done

if [ $sleep_seconds -gt $waiting_max_seconds ];then
	fun_echo_red "耗时太久,未找到启动完成标志,请看看日志"
else
	fun_echo_green "部署完成"
fi

fun_echo_yellow "**************************************** 部署结束。。。 "

三、写好一个部署的脚本deploy.sh

#!/bin/bash
#公共变量定义
#jar名称
jar_name="xxx.jar"
#项目基础路径
project_base_dir="/xxx/xxx/"
#等待最长时间 
waiting_max_seconds=60;
#日志中启动完成标志字符串
start_complete_flag="Started MySpringBootApplication"
#程序占用端口
port="18801"

#定义函数
################################### 定义函数 start #################################
#控制台输出 - (默认)
function fun_echo(){
	echo $1
}
#控制台输出 - 红色字 - (错误)
function fun_echo_red(){
	echo -e "\033[31m $1 \033[0m"
}
#控制台输出 - 绿色字 - (成功)
function fun_echo_green(){
	echo -e "\033[32m $1 \033[0m"
}
#控制台输出 - 黄色字 - (警告)
function fun_echo_yellow(){
	echo -e "\033[33m $1 \033[0m"
}
#控制台输出 - 绿底白字 - (警告)
function fun_echo_g_white(){
	echo -e "\033[47;42m $1 \033[0m"
}
################################### 定义函数 end #################################


echo "部署服务$jar_name..."
fun_echo_yellow "**************************************** 开始部署。。。 "
echo "第一步、停止服务"
#查找正确运行中的服务pid
platform=($(netstat -ltnp|grep :$port | awk '{print $7}'))
platform=${platform///java/}
echo "程序ID:$platform"
#判断并停止服务
length=${#platform[@]}
if [ $length -gt 0 ] ;then
	kill -9 $platform
	echo "服务已停止"
fi

echo "第二步、启动服务"
cd $project_base_dir/jar/
#nohup java -jar ldapsso-back-test.jar &>log.txt &
#这样命令启动,日志文件按照logback配置的输出
nohup java -jar $jar_name >/dev/null 2>&1 &


#启动过程等待完成

today=($(date --date today +%Y-%m-%d))
#echo "今日:$tody"
log_file_path="$project_base_dir/logs/info-${today}.log"
fun_echo_yellow "服务今日日志文件:$log_file_path"

#保存当前已有日志文件
if [ -f $log_file_path ] 
then 
	log_file_path_backup="$project_base_dir/logs/info-${today}_backup_$(date +'%H时%M分%S秒').log"
	fun_echo_yellow "服务今日日志文件 备份:$log_file_path_backup"
	cp $log_file_path $log_file_path_backup
fi

#清空当前日志文件内容
echo "" > $log_file_path

##清空错误日志文件内容
error_file_path="$project_base_dir/logs/error-${today}.log"
echo "" > $error_file_path

#睡眠总时长
sleep_seconds=2


sleep 2
startFlagLine=($(grep "$start_complete_flag"  $log_file_path |  awk '{print $10  $11}'))
while([ -z "$startFlagLine" ])
do
    fun_echo_g_white "启动中... 耗时: ${sleep_seconds}秒"
    startFlagLine=($(grep "$start_complete_flag"  $log_file_path |  awk '{print $10  $11}'))
    if [ $sleep_seconds -gt $waiting_max_seconds ];then
		break
    fi
    sleep 2
    sleep_seconds=$(expr $sleep_seconds + 2) 
done

if [ $sleep_seconds -gt $waiting_max_seconds ];then
	fun_echo_red "耗时太久,未找到启动完成标志,请看看日志"
else
	fun_echo_green "部署完成"
fi

fun_echo_yellow "**************************************** 部署结束。。。 "

四、部署执行deploy.sh展示

[root@app jar]# ./deploy.sh 
部署服务xxx.jar...
 **************************************** 开始部署。。。  
第一步、停止服务
程序ID:8221
服务已停止
第二步、启动服务
 服务今日日志文件:/xxx/xxx/logs/info-2023-03-24.log 
 服务今日日志文件 备份:/xxx/xxx/logs/info-2023-03-24_backup_11时38分25秒.log 
 启动中... 耗时: 2秒 
 启动中... 耗时: 4秒 
 启动中... 耗时: 6秒 
 启动中... 耗时: 8秒 
 启动中... 耗时: 10秒 
 启动中... 耗时: 12秒 
 启动中... 耗时: 14秒 
 启动中... 耗时: 16秒 
 启动中... 耗时: 18秒 
 启动中... 耗时: 20秒 
 启动中... 耗时: 22秒 
 启动中... 耗时: 24秒 
 部署完成 
 **************************************** 部署结束。。。  
[root@app jar]# 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值