對於一些jenkins無法管理的項目,該如何做自動發布?
最近遇到了一些使用jenkins無法發布的java項目,比如用nohup java -jar xxx.jar & 啟動的項目,在用jenkins發布時會遇到進程夯住的情況。
所以我們需要把對應的項目做成linux下的服務,可以做成systemd管理的服務。這樣我們在發布完項目之后只需執行systemctl restart xxx即可。
如xxl-job項目
- 首先我們需要寫好腳本
cat /opt/shell/manage-service/restart-jar-service.sh
#!/bin/bash
# 專門用來管理老的用java -jar的方式啟動服務,解決無法通過jenkins 服務重啟該服務的問題
# author: Yangning
# datetime: 20210816
# 如
# jarName="xxl-job-admin-2.3.0-SNAPSHOT.jar"
# workDir="/data/server/dubbo-service/xxl-job/"
if [[ "$#" -ne 3 ]];then
echo "total required three parameters"
echo "Usage: $0 service/work/directory jarname start|stop|status)"
exit 1
fi
if [[ ! -d "$1" ]] || [[ ! -f "$1/$2" ]];then
echo "$1 is not directory or $1$2 is not file"
exit 2
fi
if [[ "$3" != "start" ]] && [[ "$3" != "stop" ]] && [[ "$3" != "status" ]];then
echo "Third parameter is error, $3 must be start|stop|status"
exit 3
fi
source /etc/profile
workDir=$1
jarName=$2
action=$3
set -x
function start (){
start_check_pid=$(ps -ef|grep -v grep|egrep "java\s+-jar\s+$jarName"|awk '{print $2}')
if [[ "$start_check_pid" == "" ]];then
echo $(which java)
cd $workDir && java -jar "$jarName" > /dev/null 2>&1 &
start_pid=$(ps -ef|grep -v grep|egrep "java\s+-jar\s+$jarName"|awk '{print $2}')
if [[ "$start_pid" != "" ]];then
echo "$jarName start success, runing... PID $start_pid"
else
echo "$jarName start failed"
fi
else
echo "$jarName is Already start, running PID $start_check_pid"
fi
}
function stop (){
stop_check_pid=$(ps -ef|grep -v grep|egrep "java\s+-jar\s+$jarName"|awk '{print $2}')
if [[ "$stop_check_pid" == "" ]];then
echo "$jarName Already stoped"
else
kill -9 $stop_check_pid
stop_pid=$(ps -ef|grep -v grep|egrep "java\s+-jar\s+$jarName"|awk '{print $2}')
if [[ "$stop_pid" == "" ]];then
echo "$jarName stoped success, PID $stop_check_pid is gone "
else
echo "$jarName stop failed"
fi
fi
}
# 這個函數在systemd中沒有用到
function status (){
server_status=$(ps -ef|grep -v grep|egrep "java\s+-jar\s+$jarName")
echo $server_status
if [[ "$server_status" == "" ]];then
echo "$jarName died..."
else
echo "$jarName running..."
fi
}
case $action in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status
;;
*)
exit
;;
esac
- 做成systemd管理的服務
cat /usr/lib/systemd/system/xxl-job.service
[Unit]
Description=xxl-job server
Wants=network-online.target
After=network.target
[Service]
Type=forking
WorkingDirectory=/opt/shell/manage-service/
ExecStart=/bin/bash restart-jar-service.sh /data/server/dubbo-service/xxl-job/ xxl-job-admin-2.3.0-SNAPSHOT.jar start
ExecStop=/bin/bash restart-jar-service.sh /data/server/dubbo-service/xxl-job/ xxl-job-admin-2.3.0-SNAPSHOT.jar stop
ExecReload=/bin/bash restart-jar-service.sh /data/server/dubbo-service/xxl-job/ xxl-job-admin-2.3.0-SNAPSHOT.jar restart
Restart=on-failure
[Install]
WantedBy=multi-user.target