说明:前端Angular项目;部署在tomcat的/webapps/root目录下;在jenkins的【执行 shell】模块完成了编译和压缩包:myApp.tar.gz;构建使用了选项参数,用来传输回滚的版本序号(前提是开发心里知道哪个版本的内容);
脚本主要内容:备份num数量的版本;获取jenkins传入参数指定回滚的序号(从近到远对备份进行排序),进行回滚;
#项目部署路径
deployPath="/data/tomcat/webapps/root"
#项目名称
dicP="TestProject"
#backup history项目历史备份目录
dicBH="TestProjectBACK"
#编译包压缩后的名称
packageFile="myApp.tar.gz"
# num 历史备份文件数量,目前设置为10个。需要和Jenkins端传入最大传入参数值保持一致。
num=5
cd ${deployPath}
if [ ! -d ${dicBH} ]
then
echo "备份文件夹${dicBH}不存在,新建中..."
mkdir ${dicBH}
echo "备份文件夹${dicBH}新建成功。"
fi
cd ${deployPath}
if [ ${DeployOrRollback} = 0 ]
then
if [ -d ${dicP} ]
then
echo " ${dicP}项目存在,需要进行备份"
#历史备份
tar -czf ${dicBH}/${dicP}.`date +%Y%m%d%H%M%S`.tar.gz ${dicP}
#备份完进行删除
rm -rf ${dicP}
cd ${deployPath}/${dicBH}
packageFilenumb=$(ls -ltr| grep -v 'total' | grep "^-" | grep .tar.gz | wc -l)
echo ${packageFilenumb}
#packageFilenumb=$(ls -tr|grep .tar.gz|wc -l)
if [ ${packageFilenumb} -gt ${num} ]
then
echo "备份文件只保留${num}个。多余的进行删除。"
let numbDel=${packageFilenumb}-${num}
ls -ltr| grep -v 'total' | grep "^-" | grep .tar.gz | awk '{print $9}' | head -n ${numbDel} | xargs rm -rf
fi
else
echo "使用中的项目${dicP}不存在,不进行备份操作。"
fi
cd ${deployPath}
if [ -f ${packageFile} ]
then
echo "开始部署"
echo ${dicP}
tar -xzf ${packageFile}
# mv myApp ${dicP}
mv ${packageFile%.tar.gz} ${dicP}
echo "部署成功"
else
echo "=====没有获取到部署包,请检查======="
fi
else
cd ${deployPath}/${dicBH}
packageFilenumb=$(ls -ltr| grep -v 'total' | grep "^-" | grep .tar.gz | wc -l)
#packageFilenumb=$(ls -tr|grep .tar.gz|wc -l)
echo ${packageFilenumb}
if [ ${DeployOrRollback} -le ${packageFilenumb} ]
then
#获取备份文件中回滚指定的那一版本的文件名称 tr '\n' ' ' 把换行符替换为空格,实现多行变成一行
#backPackageName=$(ls -t|tr '\n' ' '|awk -v c="${DeployOrRollback}" '{print $c}')
backPackageName=$(ls -lt|grep -v 'total'|grep "^-"|awk '{print $9}'|tr '\n' ' '|awk -v c="${DeployOrRollback}" '{print $c}')
#tar -xzf ${backPackageName} -C ${deployPath}
#rm -rf ${backPackageName}
mv ${backPackageName} ${deployPath}
cd ${deployPath}
if [ -d ${dicP} ]
then
echo " ${dicP}项目存在,需要进行备份"
#历史备份
tar -czf ${dicBH}/${dicP}.`date +%Y%m%d%H%M%S`.tar.gz ${dicP}
#备份完进行删除
rm -rf ${dicP}
cd ${deployPath}/${dicBH}
packageFilenumb=$(ls -ltr| grep -v 'total' | grep "^-" | grep .tar.gz | wc -l)
echo ${packageFilenumb}
#packageFilenumb=$(ls -tr|grep .tar.gz|wc -l)
if [ ${packageFilenumb} -gt ${num} ]
then
echo "备份文件只保留${num}个。多余的进行删除。"
let numbDel=${packageFilenumb}-${num}
ls -ltr| grep -v 'total' | grep "^-" | grep .tar.gz | awk '{print $9}' | head -n ${numbDel} | xargs rm -rf
fi
else
echo "使用中的项目${dicP}不存在,不进行备份操作。"
fi
cd ${deployPath}
tar -xzf ${backPackageName}
echo "指定版本${backPackageName}回滚成功"
else
echo "指定的回滚版本不存在"
fi
fi
cd ${deployPath}
echo "------clean Remote *.tar.gz and ${packageFile%.tar.gz}--------"
if [ -d "${packageFile%.tar.gz}" ]
then
rm -rf ${packageFile%.tar.gz}
fi
if [ -f "${packageFile}" ]
then
rm -rf ${packageFile}
fi
if [ -f "${backPackageName}" ]
then
rm -rf ${backPackageName}
fi
echo "------clean Remote Finished--------"