1.使用jenkins.war包进行部署jenkins服务
1.1.jenkins官网下载jenkins.war包
1.2 参考ruoyi-vue项目中的ry.sh脚本进行改写
1.3 主要修改参数 jenkins的home目录及端口的修改
-DJENKINS_HOME=/www/devops/jenkins/data
--httpPort=8085
#1.4 完整的部署jenkins.war的shell脚本
#!/bin/sh
# ./ry.sh start 启动 stop 停止 restart 重启 status 状态
AppName=jenkins.war
# JVM参数
JVM_OPTS="-Xms1024m -Xmx2048m"
APP_HOME=`pwd`
LOG_PATH=$APP_HOME/logs/$AppName.log
if [ "$1" = "" ];
then
echo -e "未输入操作名"
exit 1
fi
if [ "$AppName" = "" ];
then
echo -e "未输入应用"
exit 1
fi
function start()
{
PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'`
if [ x"$PID" != x"" ]; then
echo "$AppName is running..."
else
nohup java -DJENKINS_HOME=/www/devops/jenkins/data $JVM_OPTS -jar $AppName --httpPort=8085 > /www/devops/jenkins/startup.log 2>&1 &
echo "Start $AppName success..."
fi
}
function stop()
{
echo "Stop $AppName"
PID=""
query(){
PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'`
}
query
if [ x"$PID" != x"" ]; then
kill -TERM $PID
echo "$AppName (pid:$PID) exiting..."
while [ x"$PID" != x"" ]
do
sleep 1
query
done
echo "$AppName exited."
else
echo "$AppName already stopped."
fi
}
function restart()
{
stop
sleep 2
start
}
function status()
{
PID=`ps -ef |grep java|grep $AppName|grep -v grep|wc -l`
if [ $PID != 0 ];then
echo "$AppName is running..."
else
echo "$AppName is not running..."
fi
}
case $1 in
start)
start;;
stop)
stop;;
restart)
restart;;
status)
status;;
*)
esac
2.搭建ssh
#生成id_rsa id_rsa.pub 如/root/.ssh
ssh-keygen
#使用scp将id_rsa.pub传递到需要控制的远程服务器
scp /root/.ssh/id_rsa.pub ip:tartgetPath
#在目标服务器使用cat 将id_rsa.pub 追加到authorized_keys
cat /tmp/id_rsa.pub /root/.ssh/authorized_keys
3.设置jenkins的tool
设置git,maven,java路径
安装插件maven integration
4.新建一个项目
5.编写脚本进行发布操作
#!/bin/bash
# 主机列表(服务器公网ip列表)
HOST_LIST="
"
#时间
DATE=$(date +%Y%m%d%H%M)
BASE_PATH=/work/projects/jif-server
# 服务名称。同时约定部署服务的 jar 包名字也为它。
SERVER_NAME=jif-server
#目标target路径
#TARGET_PATH=/root/.jenkins/workspace/jif-server/$SERVER_NAME/target
TARGET_PATH=$WORKSPACE/$SERVER_NAME/target
# java源码中年的application-dev.yml配置
PROFILES_ACTIVE=dev
#JVM参数
JVM_OPTS="-Xms512m -Xmx1024m"
function stop(){
#用于接收参数host
local host=$1
pid=$(ssh root@$host ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}')
if [ -n "${pid}" ]; then
# 正常关闭
echo "[stop] ruoyi-admin 运行中,开始 kill [${pid}]"
ssh root@$host "kill -15 ${pid}"
# 等待最大 120 秒,直到关闭完成。
for ((i = 0; i < 120; i++))
do
ssh root@$host sleep 1
pid=$(ssh root@$host ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}')
if [ -n "$pid" ]; then
echo -e ".\c"
else
echo "[stop] 停止 $BASE_PATH/$SERVER_NAME 成功"
break
fi
done
# 如果正常关闭失败,那么进行强制 kill -9 进行关闭
if [ -n "$pid" ]; then
echo "[stop] $BASE_PATH/$SERVER_NAME 失败,强制 kill -9 ${pid}"
ssh root@$host kill -9 $pid
fi
# 如果 Java 服务未启动,则无需关闭
else
echo "[stop] $BASE_PATH/$SERVER_NAME 未启动,无需停止"
fi
echo ${pid}
}
for host in $HOST_LIST; do
# 在目标主机找到目标程序的进程号`
stop $host
#备份文件
ssh root@$host "mv $BASE_PATH/$SERVER_NAME.jar $BASE_PATH/$SERVER_NAME--$DATE.jar"
#新建目录
ssh root@$host "mkdir -p $BASE_PATH"
echo $TARGET_PATH
# 将新的jar包复制到目标主机的应用路径下
#scp $TARGET_PATH/$SERVER_NAME.jar root@$host:${BASE_PATH}/${SERVER_NAME}.jar
#使用参考文章https://my.oschina.net/emacs_8777631/blog/17239903
rsync -avz -e "ssh" $TARGET_PATH/$SERVER_NAME.jar root@$host:${BASE_PATH}/${SERVER_NAME}.jar
# 在目标主机上启动应用
ssh root@$host "nohup /www/server/java/jdk-17.0.8/bin/java $JVM_OPTS -jar ${BASE_PATH}/${SERVER_NAME}.jar --spring.profiles.active=$PROFILES_ACTIVE &> /startup.log &"
echo "[start] 启动 $BASE_PATH/$SERVER_NAME.jar 完成"
done
ps 清除指定端口的运行的进程pid
#awk命令的使用解析
#https://www.runoob.com/linux/linux-comm-awk.html
netstat -tulnp | grep :48090 | awk '{print $7}' | awk -F'/' '{print $1}' | xargs kill -15