rokevin
移动
前端
语言
  • 基础

    • Linux
    • 实施
    • 版本构建
  • 应用

    • WEB服务器
    • 数据库
  • 资讯

    • 工具
    • 部署
开放平台
产品设计
  • 人工智能
  • 云计算
计算机
其它
GitHub
移动
前端
语言
  • 基础

    • Linux
    • 实施
    • 版本构建
  • 应用

    • WEB服务器
    • 数据库
  • 资讯

    • 工具
    • 部署
开放平台
产品设计
  • 人工智能
  • 云计算
计算机
其它
GitHub

SpringBoot部署方式

服务端脚本

# java -xxx
unset BUILD_ID

help(){
    echo " 参数: "
    echo " ./$0 start|stop|status|restart|dst|deploy|help"
    echo " -j jar包存放目录 /xxx/xxx"
    echo " -c config文件目录 /xxx/xxx"
    echo " -g 配置文件名称 application.config"
    echo " -d pid文件名称 application.pid"
    echo " -s jenkins打包出来的jar文件"
    echo " -m 目标机器 127.0.0.1"
    echo " -p 端口号port 8282"
    echo " -v 版本version 201804082112_afsd12"
    echo " -h 帮助文档"
}

########################################################

# 查看pid文件是否存在,存在说明服务在运行,不存在则说明服务停止了
checkPidFile() {

    echo ${pid_file}
    
    if [ -f ${pid_file} ];then
        echo "pid file is exist so is running"
        return 1
    else
        echo "pid file is not exist so is not running"
        return 0
    fi
}

# start service..
start() {

    echo "start ....."
    
    checkPidFile 
    
    if [ $? -eq 1 ];then 
        
        echo $project is running...
        
        exit 2
    fi
    
    cd ${jar_dir}
    
    # 不让jenkins杀死此job执行的命令
    #BUILD_ID=dontKillMe 
    
    echo $PWD
    
    `nohup java -Xmx8192M -jar ./${version}.jar > nohup.out  2>&1 &`
    # var1="java -jar ./${version}.jar"
    #    echo $var1
    #    $var1
    
    echo $PWD
    
    progress_line=0
    
    count=0
    
    while(($progress_line == 0))
    
    do
    
        sleep 2;
        
        checkPidFile
        
        progress_line=$?
        
        count=$(($count+1))
        
        echo "第$count次检查完毕"
        
        [ ${count} -eq 20 ] && echo start is fault .... && exit 3 
    done
    
    echo start is successful ....
}
# stop service...
stop() {
	
    echo "stop ....."
    
    checkPidFile
    
    if [ $? -eq 1 ];then
        
        # 获取进程ID
        echo `cat ${pid_file}`
    
        kill `cat ${pid_file}`
    fi
    
    progress_line=1
    
    count=0
    
    while(($progress_line != 0))
    
    do
    
        checkPidFile
        
        progress_line=$?
        
        sleep 2;
        
        count=$(($count+1))
        echo "第$count次检查完毕"
        [ ${count} -eq 20 ] && echo stop is fault .... && exit 3
    
    done
        
    echo "stop is successful ...."
}

# 分发用在jenkins服务器,往其它服务器拷贝jar包
distribute() {

    # 部署服务器创建项目目录
    ssh $machine "mkdir -pv ${jar_dir}"  
    
    # 分发jar包到部署服务器
    scp ${jenkins_jar_file} $machine:${jar_dir}/${version}.jar
    
    # 1. 分发配置文件到部署服务器 2. 直接修改配置文件后能重启
    # scp ${config_file} $machine:${jar_dir}
    
    # $? 上个命令的退出状态,或函数的返回值
    if [ $? -eq 0 ];then
        echo "distribute ${version} is successful...." 
    else
        echo "distribute ${version} is fault...." 
        exit 4;
    fi
}

# deploy project 
deploy(){

    jarfile=${jar_dir}/${version}.jar
    
    echo $jarfile
    
    if [ -f ${jarfile} ];then
        
        stop
    
        start
    
    else
        echo ${version}"版本文件不存在"
        exit 2
    fi 
}

restart() {
    stop
    start
}

checkStatus(){
    checkPidFile
    if [ $? -eq 1 ];then
    echo "Running"
    else
    echo "not Running"
    fi
}

# 默认什么都不输入显示帮助
if [ $# -eq 0 ]; then
    help
    exit 1
fi

COMMAND=$1
shift
while getopts "j:c:g:d:s:m:p:v:h" opt
do
    echo "export param $opt, $OPTARG"
    
    case $opt in
    
    j) jar_dir=$OPTARG;;
    c) config_dir=$OPTARG;;
    g) config_file=$OPTARG;;
    d) pid_file=$OPTARG;;
    s) jenkins_jar_file=$OPTARG;;
    m) machine=$OPTARG;;
    p) port=$OPTARG;;
    v) version=$OPTARG;;
    h) help
    
    echo "export port $opt" ;;
    esac
done

if [ ${COMMAND} == start ]; then 
    start 
elif [ ${COMMAND} == status ];then
    checkStatus 
elif [ ${COMMAND} == stop ]; then
    stop
elif [ ${COMMAND} == restart ]; then
    stop
    start 
elif [ ${COMMAND} == dst ];then
    distribute 
elif [ ${COMMAND} == deploy ];then
    deploy
elif [ ${COMMAND} == "help" ];then
    help
elif [ ${COMMAND} == "h" ];then
    help
else
    help
fi

Jenkins的部署job

# 环境
environment='xx测试'

# 项目
project='kevin'

# 远程服务器列表
machines=(kevin@xx.xx.xx.xx)

# 端口号
port='18080'

# 根目录
root_dir=/kevin

# 本地服务器脚本目录
sh_dir=${root_dir}/sh

# 远程服务器启动时产生的pid文件地址
pid_file=${root_dir}/jar/${project}/application.pid

# 打包后jenkins生成的jar文件地址
jenkins_jar_file=~/.jenkins/workspace/$JOB_NAME/target/${project}-0.0.1-SNAPSHOT.jar

# 远程服务器的jar目录
jar_dir=${root_dir}/jar/${project}

# 本地服务器配置文件地址
config_file=${root_dir}/config/${project}/application.properties

# 项目版本
version=`date "+%Y%m%d%H%M"`'_'${GIT_COMMIT:0:6}

# 打包
mvn clean package

for machine in ${machines[@]} ; do
 
    # 拷贝脚本到远程服务器
    ssh $machine "scp ${sh_dir}/${project}_spring_boot.sh /tmp/"
    
    # 分发
    ssh $machine "sh /tmp/${project}_spring_boot.sh dst -m ${machine} -v ${version} -s ${jenkins_jar_file} -j ${jar_dir} -g ${config_file}"
    
    echo '服务器:'$machine ${environment}'环境分发完毕,版本号:'${version}
	
    echo '完成时间:'`date "+%F %H:%M"`
    
    # 部署
    ssh $machine "sh /tmp/${project}_spring_boot.sh deploy -v ${version} -p ${port} -j ${jar_dir} -d ${pid_file}"
    
    echo '服务器:'$machine ${environment}'环境部署完毕,版本号:'${version}
	
    echo '完成时间:'`date "+%F %H:%M"`
    
done

Tomcat部署方式

服务端脚本

#!/bin/bash

#define variable
export JAVA_HOME=/home/hlvan/setup/jdk1.8.0
export JRE_HOME=/home/hlvan/setup/jdk1.8.0/jre
app_name="hm"

tomcat_name="tomcat-hm"
tomcat_dir="/jenkins/tomcat/${tomcat_name}"
#run_command="app-server"
project_dir="/jenkins/project/${app_name}"
http_address=$(hostname)
##########################################################
printHelp(){
   echo " Usage: "
   echo " ./$0 start|stop|status|restart|distribute|deploy "
   echo "   -p port  "
   echo "   -c  dev/conf the conf file to use"
   echo "   -v  version"
   echo "   -t ${app_name} / ${app_name}_ro"
   echo "   -b is bms.."
}

SUB_COMMAND=$1
	shift
	while getopts "p:c:v:t:f" opt
	do
	  echo "export param $opt, $OPTARG"
	  case $opt in
	  p)
	     PORT=$OPTARG;;
	  c)
	     echo "export port $opt, $OPTARG"
	     CONF_FILE=$OPTARG;;
	  v)

	     VERSION=$OPTARG;;
	  t)
	     TYPE=$OPTARG;;
          
      f)    
         FORCE=1;;

	 \?) printHelp
	     echo "export port $opt"
	  esac
	done

# 参数处理
if [ $# -eq 0 ]; then
   printHelp
   exit 1
fi

########################################################
port1=`echo ${PORT} | cut -d" " -f1`
port2=`echo ${PORT} | cut -d" " -f2`
port3=`echo ${PORT} | cut -d" " -f3`

# target_dir /jenkins/project/hm/target
target_dir="${project_dir}/target"
pid_file="${project_dir}/${port1}.pid"

version_dir="${project_dir}/${VERSION}"
sourcefile="/jenkins/war/${app_name}/${VERSION}.war"

########################################################
# mark last version
mark() {
	last_version=`ls -ld ${target_dir} | awk '{print $NF}'|awk -F'/' '{print $NF}'`
	echo ${last_version} > "${project_dir}/${TYPE}.version"

}

# check run status
isrunning() {
	
	progress_line=`netstat -lnutp|grep -c ":${port1}[[:space:]]"`
	
	if [ ${progress_line} -ge 1 ];then
	   	echo $port is running...
	   	return 0
	else
        echo $port is not running...
	    return 1
	fi
}

# start service..
start() {

	echo "start ....."
	
	isrunning 
	
	if [ $? -eq 0 ];then 
	   	
	   	echo $port1 is running...
	   	
	   	exit 2
	fi

	# 不让jenkins杀死此job执行的命令
    BUILD_ID=dontKillMe 

    ${tomcat_dir}/bin/startup.sh 
	
	progress_line=0
	
	count=0
	
	while(($progress_line == 0))
	
	do
	
		sleep 2;
	
	  	progress_line=`netstat -lnutp|grep -c ":$port1[[:space:]]"`
	
	  	count=$(($count+1))
	  	
	  	echo $count
	  	
	  	[ ${count} -eq 20 ] && echo start is fault .... && exit 3 
	done

	echo start is successful ....
}
# stop service...
stop() {
	
	echo "stop ....."
	
	isrunning
	
	if [ $? -eq 0 ];then
	   	
	   	# 获取进程ID
	   	progress=`netstat -lnupt|grep ":$port1[[:space:]]"|awk -F "[ /]+" '{print $7}' `
	   	echo "kill $progress"

	   	# 不让jenkins杀死此job执行的命令
    	BUILD_ID=dontKillMe

        ${tomcat_dir}/bin/shutdown.sh
	fi

	progress_line=1
	
	count=0
	
	while(($progress_line != 0))
	
	do

	  	progress_line=`netstat -lnutp|grep -c ":$port1[[:space:]]"`
	  
	  	sleep 2;
	  
	  	count=$(($count+1))
        echo $count
        [ ${count} -eq 20 ] && echo stop is fault .... && exit 3
	
	done
        echo "stop is successful ...."
}

# distribute code file
distribute() {
        
    flag=${FORCE} 
    
    echo ${flag}

    # 判断 flag 这个变量是不是空字符串,如果不是返回真
    if [ ! -z $flag ];then
	  
		if [ $flag -eq 1 ];then 
	     
	    	stop
        
	        if [ $? -eq 0 ];then
	             
		    	rm -rf ${version_dir}
	            
	        fi
	  
	  	fi
    
    fi  
	
	# check version_dir exist
	if [ -d ${version_dir} ];then
	   	echo ${version_dir} is exist ....
	   	exit 3;
	fi   

    # 解压war包 o 不必先询问用户,unzip执 行后覆盖原有文件 -p 与-c参数类似,会将解压缩的结果显示到屏幕上,但不会执行任何的转换。
    unzip -oq ${sourcefile} -d ${version_dir} 1>/dev/null

    # $? 上个命令的退出状态,或函数的返回值
    if [ $? -eq 0 ];then
       	echo "distribute ${VERSION} is successful...." 
    else
       	echo "distribute ${VERSION} is fault...." 
       	exit 4;
    fi
}

# deploy project 
deploy(){

# check version_dir exist
	if [ ! -d ${version_dir} ];then
	   echo ${version_dir} is not exist ....
	   exit 3;
	fi   

	stop

	mark
        echo "delete soft link...."
	/bin/rm -rf ${target_dir}
        echo "create soft link...."
	/bin/ln -s ${version_dir} ${target_dir}

	start

}
restart() {
	stop
	start
}
checkStatus(){
	isRunning
	if [ $? -eq 0 ];then
	echo "Running"
	else
	echo "not Running"
	fi

}

if [ ${SUB_COMMAND} == start ]; then 
    start 
elif [ ${SUB_COMMAND} == status ];then
   checkStatus 
elif [ ${SUB_COMMAND} == stop ]; then
  stop
elif [ ${SUB_COMMAND} == restart ]; then
  stop
  start 
elif [ ${SUB_COMMAND} == dst ];then
   distribute 
elif [ ${SUB_COMMAND} == deploy ];then
   deploy
else
   printHelp
fi


Jenkins的部署job

# 环境名称
Environment='xx测试'

# 项目名称
ProjectName='kevin'

# 根目录
DirRoot=/kw

# 部署服务器列表
machineList=(kevin@xx.xx.xx.xx)

echo "集群个数为: ${#machineList[*]}"

# 本地服务器jenkins项目路径
ProjectJenkins=~/.jenkins/workspace/$JOB_NAME/target/${ProjectName}-0.0.1-SNAPSHOT.war

# 项目版本
VersionName=`date "+%Y%m%d%H%M"`'_'${GIT_COMMIT:0:6}

# 部署服务器项目目录
DirProject=${DirRoot}/project/${ProjectName}

# 部署服务器存放WAR包目录
DirWar=${DirRoot}/war/${ProjectName}

# 本地服务器配置文件目录
DirConf=${DirRoot}/conf/${ProjectName}

# 本地服务器脚本目录
DirSH=${DirRoot}/sh

# 打包
mvn clean package

echo ${Environment}'环境打包完毕'

echo '完成时间:'`date "+%F %H:%M"`

# 分发
echo ${Environment}'环境开始分发'

for machine in ${machineList[@]} ; do

	echo "分发到服务器: $machine"
    
    # 部署服务器创建项目目录
    ssh $machine "mkdir -pv ${DirProject}"  
    
    # 部署服务器创建war包目录
    ssh $machine "mkdir -pv ${DirWar}"  
    
    # 分发war包到部署服务器
    scp ${ProjectJenkins} $machine:${DirWar}/${VersionName}.war
    
    # 分发操作脚本到部署服务器
    ssh $machine "scp ${DirSH}/deploy_${ProjectName}.sh /tmp/"
    
    # 使用分发命令把war解压到项目目录下
    ssh $machine "sh /tmp/deploy_${ProjectName}.sh dst -v ${VersionName}"
    
    # 拷贝配置文件到部署服务器的配置目录下
    ssh $machine "rm -rf ${DirProject}/${VersionName}/WEB-INF/classes/cer"
    
    # 拷贝配置文件到部署服务器的配置目录下
    ssh $machine "scp -r ${DirConf}/* ${DirProject}/${VersionName}/WEB-INF/classes/"
    
    echo '服务器:'$machine ${Environment}'环境分发完毕,版本号:'${VersionName}
	
    echo '完成时间:'`date "+%F %H:%M"`
    
done

Jenkins的发布job

# 环境名称
Environment='xx测试'

# 项目名称
ProjectName='kevin'

# 端口号
Port='18080'

# 根目录
DirRoot=/kw

# 部署服务器列表
machineList=(kevin@xx.xx.xx.xx)

echo "集群个数为: ${#machineList[*]}"

# 部署

for machine in ${machineList[@]} ; do

	echo "部署到服务器: $machine"
    
    # 部署操作脚本到部署服务器
    ssh $machine "scp ${DirRoot}/sh/deploy_${ProjectName}.sh /tmp/"
    
    # 使用分发命令把war解压到项目目录下
    ssh $machine "sh /tmp/deploy_${ProjectName}.sh deploy -v ${version} -p ${Port} -t service"
    
    echo '服务器:'$machine ${Environment}'环境部署完毕,版本号:'${version}
	
    echo '完成时间:'`date "+%F %H:%M"`
    
done
最近更新:: 2020/7/26 21:46
Contributors: luokaiwen