背景:VS2017、VS2019,ftp一键发布无效(症状:ftp发布提示发布成功,实际文件未更新,勾选删除原文件可以发布,但是每次都需要全量发布,静态文件夹下保存有图片等其他文件,不能删除)
环境:Linux+Docker,Docker使用外部Ftp共享文件夹
随有了使用批处理实现一键发布的想法
思路:
1.dotnet命令行发布(使用现有的发布配置文件)
2.使用批处理按文件修改时间清理文件(只保留有修改的文件)
3.使用pscp上传到服务器
4.使用plink远程执行shell脚本重启容器
脚本实现如下:
@echo off
@rem ======配置开始Begin==============================
@rem 【待发布项目路径】
set "ProjectPath=%~dp0JXNH.Archives.WebHost.csproj"
@rem 【发布配置文件路径】
set "PublishConfigPath=%~dp0Properties\PublishProfiles\本机发布到文件夹.pubxml"
@rem 【发布文件输出路径】
set "PublishPath=D:\publish\marridb发布\JXNH.Archives\"
@rem 【测试机站点路径】
set "SitePath=/home/JXNH.Archives"
@rem 【需执行shell脚本】
set "ShellCommand=sh /home/dockerscript/jxnh.archivesstart.sh"
set "ServerIP=10.0.0.1"
set "ServerUser=root"
set "ServerPassword=123"
@rem ======配置结束End===============================
echo --------发布站点ing...-------------------
dotnet publish -o %PublishPath% %ProjectPath% /p:PublishProfile=%PublishConfigPath%
echo --------发布成功!----------------------
echo --------清理文件ing...-------------------
@rem 删除配置文件
del /f/s/q %PublishPath%\*.config
@rem 删除pdb文件
del /f/s/q %PublishPath%\*.pdb
@rem 删除3天前的文件
echo y |ForFiles /p %PublishPath% /s /d -3 /c "cmd /c del @file"
echo -------文件清理成功!-------------------------------
TIMEOUT /T 1
echo -------发布到linux测试机ing...-----------------------
.\pscp -pw %ServerPassword% -r %PublishPath% %ServerUser%@%ServerIP%:%SitePath%
echo -------发布到linux测试机成功!---------------------
echo -------执行shell脚本ing...----------------------------
.\plink -no-antispoof -pw %ServerPassword% %ServerUser%@%ServerIP% %ShellCommand%
echo -------shell脚本执行完毕!--------------------------
pause
shell脚本:jxnh.archivesstart.sh
#! /bin/bash
CID=`docker ps -f name=jxnh.archives |awk '{print $1}'|cut -d " " -f 2`
echo "get message:"$CID
if [ "$CID"x = "CONTAINER"x ];
then
echo "not found container!"
ACID=`docker ps -a -f name=jxnh.archives |awk '{print $1}'|cut -d " " -f 2`;
DACID=$(echo $ACID |cut -d " " -f 2);
docker rm $DACID;
docker run --privileged -v /home/JXNH.Archives:/app --name jxnh.archives -p 8010:8010 -d archives /usr/bin/dotnet /app/JXNH.Archives.WebHost.dll;
else
DDS=$(echo $CID |cut -d " " -f 2)
echo "get container id is:":$DDS
docker stop $DDS
docker rm $DDS
docker run --privileged -v /home/JXNH.Archives:/app --name jxnh.archives -p 8010:8010 -d archives /usr/bin/dotnet /app/JXNH.Archives.WebHost.dll
fi
CIDD=`docker ps -f name=jxnh.archives |awk '{print $1}'|cut -d " " -f 2`;
if [ "$CIDD"x = "CONTAINER"x ]
then
echo "shell script run docker failed!"
else
echo "run success!"
fi