版本发布的时候,是采用的直接上传代码文件进行覆盖,操作之前需要先把之前的文件进行备份。同时还要考虑进行回滚的操作,因为写了两个脚本文件。

备份文件 copy.sh


#!/bin/bash

#先查看备份文件夹/srv/backup是否存在
#若不存在,在创建
# -d 文件夹是否存在
# -f 文件是否存在
# -x 是否有执行权限
# -n 判断一个变量是否有值
if [ ! -d /srv/backup ]
then
    #创建文件夹
    mkdir /srv/backup
fi

#定义将要备份的目录,即程序所在目录路径
aimdir='/srv/www/nodeapp/'
#获取目标/程序目录下的所有文件
aimdirls=`ls /srv/www/nodeapp`
#程序目录下所有的存放到的数组
filelist=()
#将要备份文件的之前的所有备份版本
backuplist=()

#输出
# 参数 -e 是解释反斜杠ESC(ASCII--\033)
# -E 关闭解释反斜杠ESC
# [背景色;字体颜色;动作(粗体、闪烁...)
echo '--------------------------'
echo -e '\033[0;33;1m-------选择备份-----------\033[0m '
echo '--------------------------'

#程序目录下所有的存放到的数组
for file in ${aimdirls}
do
    #获取当前数组长度
    len=${#filelist[@]}
    #设置把文件推进数组
    filelist[len]=$file
    echo -e "-----\033[0;35;1m ${len}) ${file} \033[0m"
done

echo '--------------------------'
echo '--------------------------'

#选择要备份的文件输入
read -p "(选择备份的序号:):" index
echo $index
#根据选择的文件,清理相对应的冗余的备份文件(大于7个)
function clearCopyFiles(){
    #拿到函数参数,赋值到变量,该变量是 将要备份的文件
    filename=$1
    backupfiles=()
    #已经备份的所有文件
    for file in `ls -t /srv/backup`
    do
        #去掉文件名称中的数字与-
        # tr -d 表示删除
        # tr -c 替换
        # tr -s 去重
        # echo 输出可以保存为字符串
        splitfile=`echo "${file}" | tr -d [0-9] | tr -d "-"`
        echo "${splitfile}*********${file}"

        #只保存所有备份的文件中与要备份的文件一样,否则则跳过继续
        if [ "$splitfile" != "$filename" ]
        then
            continue
        fi

        len=${#backupfiles[@]}
        echo "====================${splitfile}, ${filename}"
        backupfiles[len]=$file

    done


    len=${#backupfiles[@]}
    echo "关于${filename}已备份的文件有${len}个=============${backupfiles[${len}-1]}"

    #如果备份文件已经超过7个则删除
    # -gt 大于
    # -lt 小于
    # -eq 等于
    # -ne 不等于
    # -ge 大于等于
    # -le 小于
    if [ $len -ge 5 ]
    then
        find /srv/backup/${backupfiles[0]} -delete
    fi
}

#将要备份的文件
copyfile=${filelist[${index}]}

#清理冗余的备份文件,执行函数,第二个为参数
clearCopyFiles $copyfile

#对将要备份的文件进行命名
nowtime=`date +%y%m%d%H%M%S`
curname=${copyfile}-${nowtime}

#备份
cp -r ${aimdir}${copyfile} /srv/backup/${curname}
echo -e "\033[32m备份$copyfile${curname} 成功\033[0m"

回滚文件 rollback.sh

#!/bin/bash

#程序所在目录
aimdir='/srv/www/nodeapp/'
#程序目录下的所有文件
aimdirls=`ls /srv/www/nodeapp`
#程序目录下的所有文件 将要存放的数组
filelist=()

#已经备份的文件的所有版本
backupfiles=()

echo '-----------------------'
echo -e '\033[0;33;1m-----请选择将要恢复的文件-----\033[0m'
echo '-----------------------'

for file in ${aimdirls}
do
    len=${#filelist[@]}
    filelist[len]=$file
    echo -e "----\033[0;35;1m ${len}) ${file} \033[0m"
done

echo '-----------------------'
echo '-----------------------'

#选择要回滚的文件输入
read -p "(请选择备份的序号:):" index
rollbackfile=${filelist[$index]}
echo "---查找${rollbackfile}对应的所有版本"
#根据选择的文件查找对应的所有已备份的文件

function checkFiles() {
    filename=$1

    #根据名字查找已经对应的所有文件
    echo -e "\033[0;33;1m --------请选择对应的版本-----------\033[m"
    for file in `ls -lt /srv/backup`
    do
        splitfile=`echo "${file}" | tr -d [0-9] | tr -d "-"`
        #如果改文件与选择的文件的主名字相等,则保存
        if [ "$filename" != "$splitfile" ]
        then
            continue
        fi
        echo "--------------------> ${splitfile}"
        len=${#backupfiles[@]}
        backupfiles[$len]=$file
        echo -e "======\033[0;34;1m ${len}),${file} \033[0m"

    done

}

checkFiles $rollbackfile

#关于选择版本的处理
len=${#backupfiles[@]}
echo "关于${filename}的备份共${len}个"
echo "-----------------------------"
read -p "请选择备份的版本: " vindex
echo $vindex

#回滚版本
rollversion=${backupfiles[${vindex}]}
echo "&&&& ${rollversion} ${rollbackfile}"

# 根据回滚的是 文件 还是文件夹,做不同的区分
if [ -d ${aimdir}${rollbackfile} ]
then
    echo '文件夹'
    \cp -r /srv/backup/${rollversion}/* ${aimdir}${rollbackfile}
fi

if [ -f ${aimdir}${rollbackfile} ]
then
    echo '文件'
    \cp -r /srv/backup/${rollversion} ${aimdir}${rollbackfile}
fi
echo -e "\033[32m 回滚成功 \033[0m"

执行

要给予`sh`执行权限
`chmod +x copy.sh `
执行:
./copy.sh

results matching ""

    No results matching ""