项目需求:现场tomcat业务系统部署手动打包,业务系统比较多,国内批量备份并打包给到现场进行升级操作
shell脚本代码如下:
功能实现:自动打包,可以选择是否下载到本地,但是需要手动输入路径
#! /bin/bash
source /etc/profile #加载系统环境变量
source ~/.bash_profile #加载用户环境变量
set -o nounset #引用未初始化变量时退出
set -o errexit #执行shell命令遇到错误时退出
date_tar=$(date +%Y-%m-%d_%H-%M-%S)
date=$(date +%Y-%m-%d)
package_path=/opt/pe_to_agl/$date
package_version="V4.5"
if [ ! -e $package_path ];then
mkdir -p $package_path
fi
read -ep "请输入备份业务系统的路径: " choose_path
if [ ! -d ${choose_path} ];then
echo "请输入正确路径,已退出"
exit
else
echo "以下为检测到的业务系统:"
cd ${choose_path}
for dir in $(ls ${choose_path})
do
[ -d ${dir} ] && echo ${dir} #先判断是否是目录,然后再输出
done
cd ${choose_path}
read -ep "请输入要备份的业务系统: " choose_name
function action_size(){
mv ${choose_name}_${date_tar}_${package_version}.tar.gz $package_path
cd $package_path
size=$(du $package_path/${choose_name}_${date_tar}_${package_version}.tar.gz -sh | awk '{print $1}')
echo "系统${choose_name} 压缩完成,大小${size},查看路径 $package_path"
}
function tar_packages(){
cd ${choose_path}/${choose_name}
if [ ! -d "webapps" ];then
echo "$choose_path/${choose_name}下没有webapps文件夹,不符合Tomact备份格式,请确认后再试,已退出!"
exit
else
echo "开始压缩文件"
cd ${choose_path}/${choose_name}/webapps
if [ -d "ROOT" ];then
tar zcpvf ${choose_name}_${date_tar}_${package_version}.tar.gz ROOT
action_size
elif [ -d "cas" ];then
tar zcpvf ${choose_name}_${date_tar}_${package_version}.tar.gz cas
action_size
elif [ -d "xxl-job-admin" ];then
tar zcpvf ${choose_name}_${date_tar}_${package_version}.tar.gz xxl-job-admin xxl-job-k007-executor-01
action_size
fi
fi
}
if test `$choose_name` == `${dir}`;then
tar_packages
else
echo " 对不起,此路径不存在你输入的业务系统,即将退出!"
exit
fi
echo "########################################################################"
echo "########################################################################"
read -ep "是否下载文件到本地?(y/n)" judge
if [ $judge = 'y' -o $judge = 'Y' ];then
usage() {
echo "$0 [base|workFlowEngine|settings|access|order|risk]"
}
usage
if [ $# -eq 1 ];then
path=$1
tar=`find ${package_path}/*${path}* -name "*.tar.gz" -type f`
echo "============开始下载tar.gz文件 $tar ============"
sz -b $tar
else
echo "==============开始下载 $package_path 下所有tar.gz文件=============="
for tar in $(find ${package_path}/ -name "*.tar.gz" -type f); do sz -b $tar;done
fi
echo "==============下载成功,请到本地目录自行查看==================="
else
exit
fi
fi
附上前端web的打包脚本:
#! /bin/bash
source /etc/profile #加载系统环境变量
source ~/.bash_profile #加载用户环境变量
set -o nounset #引用未初始化变量时退出
set -o errexit #执行shell命令遇到错误时退出
date_tar=$(date +%Y-%m-%d_%H-%M-%S)
date=$(date +%Y-%m-%d)
package_path=/opt/pe_to_agl_web/$date
package_version="V4.5"
if [ ! -e $package_path ];then
mkdir -p $package_path
fi
read -p "请输入备份业务系统的路径: " choose_path
if [ ! -d ${choose_path} ];then
echo "请输入正确路径,已退出"
exit
else
echo "以下为检测到的业务系统:"
cd ${choose_path}
for dir in $(ls ${choose_path})
do
[ -d ${dir} ] && echo ${dir} #先判断是否是目录,然后再输出
done
cd ${choose_path}
read -p "请输入要备份的业务系统: " choose_name
function action_size(){
mv ${choose_name}_${date_tar}_${package_version}.tar.gz $package_path
cd $package_path
size=$(du $package_path/${choose_name}_${date_tar}_${package_version}.tar.gz -sh | awk '{print $1}')
echo "系统${choose_name} 压缩完成,大小${size},查看路径 $package_path"
}
if [ "${choose_name}" != ${dir} ];then
cd ${choose_path}/${choose_name}
if [ ! -d "dist" ];then
echo "$choose_path/${choose_name}下没有webapps文件夹,不符合Tomact备份格式,请确认后再试,已退出!"
exit
else
echo "开始压缩文件"
tar zcpvf ${choose_name}_${date_tar}_${package_version}.tar.gz dist
action_size
fi
else
echo " 对不起,此路径不存在你输入的业务系统,即将退出!"
exit
fi
echo "########################################################################"
echo "########################################################################"
read -p "是否下载文件到本地?(y/n)" judge
if [ $judge = 'y' -o $judge = 'Y' ];then
usage() {
echo "$0 [base|workFlowEngine|settings|access|order|risk]"
}
usage
if [ $# -eq 1 ];then
path=$1
tar=`find ${package_path}/*${path}* -name "*.tar.gz" -type f`
echo "============开始下载tar.gz文件 $tar ============"
sz -b $tar
else
echo "==============开始下载 $package_path 下所有tar.gz文件=============="
for tar in $(find ${package_path}/ -name "*.tar.gz" -type f); do sz -b $tar;done
fi
echo "==============下载成功,请到本地目录自行查看==================="
else
exit
fi
fi
附上更新后的前端脚本:【娇羞版本】
更新内容:
可以全部打包,也可以单独打包;
可以全部下载,也可以单独下载;
交互性更加完善
#! /bin/bash
###############################################我是分界线哦################################################################
###############################################开始加载了哦################################################################
source /etc/profile #加载系统环境变量
source ~/.bash_profile #加载用户环境变量
#set -o nounset #引用未初始化变量时退出
#set -o errexit #执行shell命令遇到错误时退出
###############################################下面是定义变量区了哦#########################################################
#定义打包的日期
date_tar=$(date +%Y-%m-%d_%H-%M-%S)
#定义日期
date=$(date +%Y-%m-%d)
#定义版本号
package_version="V4.5"
#定义备份路径
package_path=/opt/pe_to_agl_web/${date}_${package_version}
###############################################下面是定义函数区了哦#########################################################
#定义输入Ctrl+c不能退出的函数
#trap 'onCtrlc' INT
function onCtrlc(){
echo "输入"quit"/"exit"才能离开我哦,你就这么忍心嘛~"
}
#准备工作的函数
function init(){
if [ ! -e $package_path ];then
mkdir -p $package_path
fi
echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
echo ">>>百因必有果!你的报应就是我!我来啦!哈哈哈!!!"
while true; do
read -ep ">>>快告诉我你的愿望吧,想要备份的路径是啥!" choose_path
[ -f "${choose_path}/list.txt" ] && rm -f ${choose_path}/list.txt && rm -f ${choose_path}/single_list.txt
if [ ! -d ${choose_path} ];then
echo ">>>这不是一个正确路径呢,你这个骗子,好好想想再告诉我!<<<"
continue
elif [[ -z "${choose_path}" ]]; then
echo ">>>你啥都没告诉我啊,让我怎么干活!快点儿再输入一次吧!<<<"
continue
else
echo ">>>下面是人家为你找到的业务系统哦!<<<"
echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
#遍历目录列表并打印
cd ${choose_path}
for dir in $(ls ${choose_path})
do
[ -d ${dir} ] && echo ${dir} && echo ${dir} >> ${choose_path}/list.txt #先判断是否是目录,然后再输出
done
break
fi
done
}
#定义全部下载到本地的函数
function all_download(){
echo "########################################################################"
echo "########################################################################"
echo ">>>人家发现有下面这么多可下载的前端压缩文件呢!快夸我吧!<<<"
#遍历文件并打印
cd ${package_path}
for file in $(ls ${package_path})
do
[ -f ${file} ] && echo ${file} #先判断是否是文件,然后再输出
done
read -ep ">>>我就插一句!你是否要全部下载文件到本地呢?(y/n)" all_down
if [ $all_down = 'y' -o $all_down = 'Y' ];then
all_tar=`find ${package_path}/ -name "*.tar.gz" -type f`
echo "##################开始下载 $package_path 下所有tar.gz文件了哦#####################"
for tr in $all_tar;
do
echo "==============开始下载 $tr文件了哦=============="
sz -b $tr
if [[ $? == 0 ]];then
echo "==============$tr系统下载完成了呢,请回到本地目录仔细查看哦==================="
fi
done
#判断是否下载完成
if [[ $? == 0 ]];then
echo "#################恭喜呀!系统全部下载完成了呢,请回到本地目录仔细查看哦######################"
fi
else
#判断备份路径下是否存在列表文件,有的话删除
[ -f "${choose_path}/list.txt" ] && rm -f ${choose_path}/list.txt && rm -f ${choose_path}/single_list.txt
exit
fi
}
#定义所有文件打包的函数
function all_action_size(){
cd ${choose_path}
cat_list=`cat ${choose_path}/list.txt`
#遍历list中的文件列表,并进行打包
for sys in ${cat_list};do
sleep 2
#判断目录下是否存在dist文件夹
cd ${choose_path}/${sys}
if [ ! -d "dist" ];then
echo ">>>人家在$choose_path/${sys}下没有dist文件夹呢,是不是你记错了呢?请确认后再来找我吧!我好累,要休息了哦"
exit
else
echo ">>>开始压缩文件了哦"
tar zcpvf ${sys}.tar.gz dist
mv ${sys}.tar.gz $package_path
cd $package_path
size=$(du $package_path/${sys}.tar.gz -sh | awk '{print $1}')
if [[ $? == 0 ]];then
echo ">>>系统${sys} 压缩完成了呢,大小${size},路径 $package_path下可以查看信息哦!"
fi
fi
done
all_download
}
#定义单独下载某个文件的函数
function single_download(){
read -ep "是否将${single}-web下载到本地呢?(y/n) " single_down
if [ $single_down = 'y' -o $single_down = 'Y' ];then
single_tar=`find ${package_path}/ -name "${single}-web.tar.gz" -type f`
echo "============开始下载tar.gz文件 $single_tar 喽!============"
sz -b $single_tar
if [[ $? == 0 ]];then
echo "==============系统${single}-web 下载完成了呢,请回到本地目录仔细查看吧!==================="
echo "短暂的相遇就这样匆匆而过!"
fi
else
echo "短暂的相遇就这样匆匆而过!"
fi
}
#定义单独打包某个文件夹的函数
function single_action_size(){
cat_single_list=`cat ${choose_path}/single_list.txt`
while true;
do
#判断要打包的文件夹是否在列表中
if [ `grep -c "${single}-web" ${choose_path}/list.txt` -ne '0' ];then
for sg in ${cat_single_list};do
#判断路径下是否存在dist文件夹
if [ ! -d "${choose_path}/${sg}/dist" ];then
echo ">>>人家在$choose_path/${sg}下没有发现dist文件夹呢,是不是你记错了呢?请确认后重新告诉我吧<<<"
continue
break
else
echo ">>>开始压缩文件喽!<<<"
cd ${choose_path}/${sg}
tar zcpvf ${sg}.tar.gz dist
mv ${sg}.tar.gz $package_path
cd $package_path
size=$(du $package_path/${sg}.tar.gz -sh | awk '{print $1}')
if [[ $? == 0 ]];then
echo ">>>系统${sg} 压缩完成了呢,大小${size},路径 $package_path 下可以查看信息哦!<<<"
fi
fi
done
single_download
break
else
echo ">>>不好意思呢,人家在这个路径下没找到你输入的业务系统呀!<<<"
break
fi
done
}
###############################################下面是工作区了哦#########################################################
#调用准备工作的函数
init
#定义退出变量,直到用户输入的字符串是quit时,until循环才会退出
QUIT_COMMAND=quit
#until [ "${USER_INPUT}" = "${QUIT_COMMAND}" ]
while true;
do
echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
echo ">>>人家还是个宝宝,记得输入正确的字符哦!不然我不懂呢"
echo "(温馨提示:输入 "quit"/"exit" 退出程序)"
#调用输入Ctrl+c不能退出的函数
trap 'onCtrlc' INT
read -ep ">>>现在有两种选择:全部备份(A/a),单个备份(B/b),告诉我你的选择吧!" USER_INPUT
echo
echo ">>您选择的是 $USER_INPUT呢!"
#对用户的输入进行匹配
case $USER_INPUT in
"A" | "a")
echo ">>>正在备份路径下所有的web系统呦~请耐心等待哦~"
#调用全部打包的函数
all_action_size
echo ">>>恭喜!web系统已全部备份完成了! 轻轻的我走了,正如我轻轻地来~Byebye~"
[ -f "${choose_path}/list.txt" ] && rm -f ${choose_path}/list.txt && rm -f ${choose_path}/single_list.txt
exit
;;
"B" | "b")
while true; do
echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
read -ep ">>>请输入想要备份的web系统名称,只用前缀就可以了哦~:" single
#判断输入是否为空
if [[ -z "${single}" ]]; then
echo ">>>你啥都没告诉我啊,让我怎么干活!请再输入一次!<<<"
continue
else
#清空之前的单独打包的列表,并打印
cat /dev/null > ${choose_path}/single_list.txt && echo ${single}-web >> ${choose_path}/single_list.txt
echo ">>>正在备份${single}-web呦~请耐心等待哦~"
#调用单独打包的函数
single_action_size
#输入quit才能退出
until [ "${USER_INPUT}" = "${QUIT_COMMAND}" ]
# while true;
do
#判断是否打包完成
if [[ $? == 0 ]];then
read -ep ">>>恭喜!${single}-web 已备份完成了呢!是否陪我继续呢?(y/n):" single2
else
read -ep ">>>是否陪我继续呢?(y/n):" single2
echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
fi
case $single2 in
"Y" | "y" )
echo ">>>嘻嘻,我又回来了呦,就知道你想我呢!"
echo ">>>开始干活喽!以下是人家为您检测到的业务系统哦,快夸我吧!<<<"
echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
cat ${choose_path}/list.txt
break
;;
"N" | "n")
[ -f "${choose_path}/list.txt" ] && rm -f ${choose_path}/list.txt && rm -f ${choose_path}/single_list.txt
echo ">>>说好的爱我一辈子呢!你这个骗子!哼!不理你了!我走了!!!"
echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
exit
;;
*)
echo ">>>能不能认真点儿!不是说了我还小嘛,太复杂的我不懂哦~看你这么诚恳,再给你次机会吧:"
;;
esac
done
break
fi
done
;;
"quit" | "exit")
break
;;
*)
echo ">>>能不能认真点儿!不是说了我还小嘛,太复杂的我不懂哦~看你这么诚恳,再给你次机会吧:"
;;
esac
echo
done
echo ">>>百因必有果,你的报应就是我,记得爱我,么么哒~"
[ -f "${choose_path}/list.txt" ] && rm -f ${choose_path}/list.txt && rm -f ${choose_path}/single_list.txt
exit 0
###############################################下面是注释区了哦#########################################################
###############################################都是改版前用到的#########################################################
#QUIT_COMMAND=quit
##直到用户输入的字符串是quit时,until循环才会退出
#until [ "$USER_INPUT" = "$QUIT_COMMAND" ]
#do
# echo "Please input command"
# echo "(type command $QUIT_COMMAND to exit)"
# read USER_INPUT
# echo
# echo ">>your command is $USER_INPUT"
#
# #对用户的输入进行匹配
# case $USER_INPUT in
# "open")
# echo ">>opening..."
# ;;
# "close")
# echo ">>closed"
# ;;
# *)
# echo ">>Unknown command"
# ;;
# esac
# echo
# done
# echo "Bye."
# exit 0
#init
#read -ep "请选择:全部备份(A/a),单个备份(B/b):" choose
# if [ $choose = 'A' -o $choose = 'a' ];then
# echo "正在备份路径下所有web系统,请稍后..."
# all_action_size
# echo "恭喜!web系统已全部备份完成!"
# [ -f "${choose_path}/list.txt" ] && rm -f ${choose_path}/list.txt && rm -f ${choose_path}/single_list.txt
# elif [ $choose = 'B' -o $choose = 'b' ];then
# read -ep "请输入想要备份的web系统名称:" single
# cat /dev/null > ${choose_path}/single_list.txt && echo $single >> ${choose_path}/single_list.txt
# echo "正在备份$single 请稍后..."
# single_action_size
# echo "恭喜!$single 已备份完成!"
# [ -f "${choose_path}/list.txt" ] && rm -f ${choose_path}/list.txt && rm -f ${choose_path}/single_list.txt
# exit
# else
# echo "您输入的字符不符合规则,不理你了..."
# [ -f "${choose_path}/list.txt" ] && rm -f ${choose_path}/list.txt && rm -f ${choose_path}/single_list.txt
# exit
# fi
###############################################我是分界线哦#########################################################