因为在公司登录服务器是需要使用堡垒机当跳板的,ftp也无法进入程序所在目录,只能进入home目录,无法实现自动化部署,因此在更新程序时需要做以下几个步骤:
1.将待更新的文件放入用户目录的文件夹中
2.将需要备份的程序文件备份到备份文件夹中
3.将待更新文件移动到程序所在文件夹中
4.关闭正在运行的程序进程
5.重新启动程序进程
因为每次更新都要执行以上几个步骤,实在过于麻烦,因此突发奇想,将上面的2-5几个命令整合到一个脚本中,顺便学习一下从未接触过BASH脚本,于是就有了以下的脚本文件:
#Type 1=全部文件备份(除开不需要备份的指定文件和文件夹) 2=只备份要更新的文件 默认不备份
#备份文件夹路径
BakFilePath=${HOME}'/bak/demoApi/demoApi'
#待更新文件夹路径
UpdateFilePath=${HOME}'/netcore/demoApi'
#执行文件的文件名
FileName="demoApi"
#if 参数个数大于0 参数为0则直接更新
if [ $# -gt 0 ];then
#在备份目录下创建该文件夹+时间命名
# 获取当前日期
current_date=$(date +"%Y%m%d%H%M%S")
BakFileName="$BakFilePath/$current_date"
#在备份目录下创建该文件夹+时间命名
mkdir -p $BakFileName
Type=$1
if [ $Type -eq 1 ];then
#全部文件备份
BakZip="$BakFileName/backup.tar.gz"
#--exclude='./wwwroot'代表复制时要忽略的文件夹或文件
tar -czf $BakZip --exclude='./wwwroot' --exclude='./Logs' --exclude='./logs' --exclude='./log' . && \
tar -xzf $BakZip -C $BakFileName && \
rm -rf $BakZip
elif [ $Type -eq 2 ];then
#部分文件备份
files=$(ls -p "$UpdateFilePath" |grep -v /)
#echo "$files"
for arg in $files; do
cp -r $arg $BakFileName
done
fi
echo 'backup end'
fi
#文件复制
cp -r "${UpdateFilePath}/." ./
#找出进程并删除
ps -ef | grep $FileName | grep -v grep| cut -c 9-15 |xargs kill -9
#启动新进程
nohup dotnet "${FileName}.dll" >out.log &
echo 'program start'
这个脚本主要分为两大部分,备份和更新。
文件在备份前会先在备份文件夹中以年月日时分秒的格式创建一个新的文件夹,被备份的文件将放入到该文件夹中。
其中文件备份分为两种,通过传入不同的参数达到不一样的备份效果:
1:全部文件备份,这种备份方式是通过将整个文件夹加压成一个压缩包,在压缩途中忽略某些不需要文件夹,比如说日志文件夹,再将压缩包移动到指定的备份文件夹中,再将压缩包解压,并删除这个压缩包。
#全部文件备份
BakZip="$BakFileName/backup.tar.gz"
#--exclude='./wwwroot'代表复制时要忽略的文件夹或文件
tar -czf $BakZip --exclude='./wwwroot' --exclude='./Logs' . && \
tar -xzf $BakZip -C $BakFileName && \
rm -rf $BakZip
2:待更新文件的备份,这种备份方式是根据UpdateFilePath待更新文件夹找到待更新文件的文件名称,在当前的操作目录下找到这些文件,并将其移动到备份文件夹中。ps:该方法无法复制待更新文件夹里的子文件夹里的文件,暂时没找到搜索并复制文件夹的解决办法。
#部分文件备份
files=$(ls -p "$UpdateFilePath" |grep -v /)
#echo "$files"
for arg in $files; do
cp -r $arg $BakFileName
done
不传参,则跳过备份,直接进入到更新、重启的步骤。
接下来的流程就比较简单了,就是将待更新文件复制到当前文件夹,根据执行文件名找到该进程并kill掉,重新启动进程。
#文件复制
cp -r "${UpdateFilePath}/." ./
#找出进程并删除
ps -ef | grep $FileName | grep -v grep| cut -c 9-15 |xargs kill -9
#启动新进程
nohup dotnet "${FileName}.dll" >out.log &
echo 'program start'