jenkins系列---【springBoot+持续集成+自动部署到指定服务器+回滚到指定版本】

前提:

  1.至少两台装有jdk8服务器,其中一台装maven和jenkins;

  2.仓库用的gitee;

  3.一个springBoot项目(springcloud项目同理)。

步骤:

  1.新建jenkins任务

   2.配置参数

   3.配置git仓库

 

   4.构建选择Execute shell,配置执行脚本。

 下面这两个脚本不用改,原样复制粘贴就行

#!/bin/sh -l
case $Status  in
  Deploy)
    pwd
    mvn clean compile package -Dmaven.test.skip=true  #前提是jenkins这台机器上装的有maven,并配置了全局环境变量
    echo "Status:$Status"
    path="${WORKSPACE}/bak/${BUILD_NUMBER}"      #创建每次要备份的目录
    if [ -d $path ];
    then
        echo "The files is already  exists "
    else
        mkdir -p  $path
    fi
    cp -f ${WORKSPACE}/target/*.jar $path        #将打包好的war包备份到相应目录,覆盖已存在的目标
    echo "Completing!"
    ;;
  Rollback)
      echo "Status:$Status"
      echo "Version:$Version"
      cd ${WORKSPACE}/bak/$Version            #进入备份目录
      cp -f *.jar ${WORKSPACE}/target/       #将备份拷贝到程序打包目录中,并覆盖之前的war包
      ;;
  *)
  exit
      ;;
esac

自动删除多余的备份,只保留最近5次的记录

ReservedNum=5  #保留文件数
FileDir=${WORKSPACE}/bak/
date=$(date "+%Y%m%d-%H%M%S")
 
cd $FileDir   #进入备份目录
FileNum=$(ls -l | grep '^d' | wc -l)   #当前有几个文件夹,即几个备份
 
while(( $FileNum > $ReservedNum))
do
    OldFile=$(ls -rt | head -1)         #获取最旧的那个备份文件夹
    echo  $date "Delete File:"$OldFile
    rm -rf $FileDir/$OldFile
    let "FileNum--"
done

  5.这里建议先保存上面的操作,执行一下Deploy,再配置远程服务器(要部署应用的服务器)

#!/bin/sh -l
cd /app/test/target
./app.sh stop /app/test/target/springboot_validator-1.0.0-SNAPSHOT.jar springboot_validator

./app.sh start /app/test/target/springboot_validator-1.0.0-SNAPSHOT.jar springboot_validator

至此,保存即可!然后去Deploy就行。

脚本app.sh,放到要部署服务的目录下的target目录里cd /app/test/target,再手动创建个logs目录。

#!/bin/sh -l
#spring boot Jar包目录
APP_NAME=$2
LOG_NAME=$3
#PID=$(ps -ef | grep $APP_NAME| grep -v grep | awk '{print $2}')

PID=$(jps -l |grep $APP_NAME |awk '{print $1}')
#使用说明,用来提示输入参数
usage() {
    echo "Usage: sh start.sh [start|stop|restart|status] [APP_NAME]"
    exit 1
}
 
#检查程序是否在运行
is_exist(){
  #pid=$(ps -ef | grep $APP_NAME| grep -v grep | awk '{print $2}')
  #如果不存在返回1,存在返回0     
  if [ -z "${PID}" ]; then
    return 1
  else
    return 0
  fi
}
 
#启动方法
start(){
  is_exist
  if [ $? -eq 0 ]; then
    echo "${APP_NAME} is already running. pid=${PID}"
  else
        #这个dontKillMe 是一定要加的,不然jenkins会杀死这个进程,导致服务退出
        BUILD_ID=dontKillMe
        #将日志输出到out,可以自己命名,下面会输出“2021-10-19 23:17:07_log.out”样式的文件
        current_date=`date "+%Y-%m-%d %H:%M:%S"`
    nohup java -jar ${APP_NAME}  >logs/${LOG_NAME}_${current_date}.out 2>&1 &
    if [ $? -eq 0 ]; then
            echo "应用${APP_NAME} 启动成功!pid=$(jps -l |grep $APP_NAME |awk '{print $1}')"
         echo "启动日志输出到:logs/${current_date}_log.out"
      else
        echo "${APP_NAME} 启动失败!"
    fi
  fi
}
 
#停止方法
stop(){
  is_exist
  if [ $? -eq "0" ]; then
   echo "应用${APP_NAME}停止服务!pid=${PID}!"
    kill -9 ${PID}
  else
    echo "${APP_NAME} is not running"
  fi  
}
 
#输出运行状态
status(){
  is_exist
  if [ $? -eq "0" ]; then
    echo "${APP_NAME} is running. Pid is ${PID}"
  else
    echo "${APP_NAME} is NOT running."
  fi
}
 
#重启
restart(){
  stop
  sleep 5
  start
}
 
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
  "start")
    start
    ;;
  "stop")
    stop
    ;;
  "status")
    status
    ;;
  "restart")
    restart
    ;;
  *)
    usage
    ;;
esac

愿你走出半生,归来仍是少年!
原文地址:https://www.cnblogs.com/hujunwei/p/15478433.html