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