使用jenkins发布ruoyi-vue-pro项目到远程服务器

121 阅读2分钟

1.使用jenkins.war包进行部署jenkins服务

1.1.jenkins官网下载jenkins.war1.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.新建一个项目

image.png

image.png

image.png

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