1. 前言
场景 (工作环境 一键部署 到 远端服务器 [阿里云])
CICD 基本步骤回顾
https://blog.csdn.net/CsethCRM/article/details/141604638
2. 环境准备
服务器端IP:106.15.74.25(阿里云服务器)
客户端:工作电脑/开发电脑
2.1 安装 7z
服务器 和 客户端(工作电脑) 均需安装
安装目录:C:\Program Files\7-Zip\7z.exe
2.2 安装 Open SSH
参照文章:https://blog.csdn.net/CsethCRM/article/details/141605350
2.3 SSH 服务器设置免密登录
参照文章:https://blog.csdn.net/CsethCRM/article/details/141854199
2.4 远端服务器准备 [ 阿里云 ]
2.5 本地开发环境 新建一个Web项目即可
CI.bat 放在项目目录
3.运行CI.bat,进行一键部署 【几秒钟就结束了】
点击CI.bat 进行一键部署
项目源代码 -> publish -> 服务器部署 -> 站点正常运行 几秒钟就完成了
CI一键部署WebSite
一键部署完毕,服务器如下:
4. 改动代码,再次运行 CI.bat,服务器端已经是改变后的代码 【从改完代码到部署上线只要几秒钟】
改代码后,使用CI再次发布
5.总结
- 掌握了 利用 bat 进行 cicd
- 从编码结束 到 部署上线
- 整个过程 只需要 几秒钟
- 大大提高日常的效率
附录
CI.bat 参照(中文乱码时,文件要用GB2312 格式):
@echo off
setlocal EnableDelayedExpansion
:: ---------- 时间统计输出 start
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
set "DEL=%%a"
)
:start
set StartTimeTxt=CI开始时间是%time:~0,2%点%time:~3,2%分%time:~6,2%秒
call :ColorText 0a "%StartTimeTxt%"
echo.
set StartTime=%time%
:: ---------- 时间统计输出 end
:: 打开当前目录
cd /d %~dp0
:: 返回上一级
cd..
:: ---------- 1. 自定义设置 start ...
:: [ -- 自定义-- ] 设置7z的命令行程序路径 ↓↓↓ 7z环境设置
set zip7=C:\Program Files\7-Zip\7z.exe
:: [ -- 自定义-- ] 发布环境 ↓↓↓ 多环境设置
set Env=Staging
:: [ -- 自定义-- ] 项目名称,发布使用 ↓↓↓ 发布Web站点的设置
set PrjName=MyMvcWeb
:: [ -- 自定义-- ] 解决方案目录
set SlnDir=D:\vscode-workspace\MyWeb
:: [ -- 自定义-- ] 启动项目
set csproj=MyMvcWeb\MyMvcWeb.csproj
:: [ -- 自定义-- ] 本地暂存盘,建议发布相关的操作目录都在此盘符下,避免不断用命令切盘符
set DriveLetterLocal=D:
:: [ -- 自定义-- ] Web发布包输出文件夹根目录
set OutRoot=%DriveLetterLocal%\ci-web-pkgs\
:: [ -- 自定义-- ] Web 发布包目录,这个包最终会传输至发布服务器进行发布
set OutDir=%OutRoot%%PrjName%\
:: [ -- 自定义-- ] SSH地址 ↓↓↓ 远程服务器SSH信息设置
set SshAddress=远程服务器IP
:: [ -- 自定义-- ] SSH账号
set SshUser=SSH账号
:: [ -- 自定义-- ] SSH端口
set SshPort=SSH端口,通常是 22
:: [ -- 自定义-- ] SSH证书 - 私钥路径
set SshKeyPath=C:\Users\自己电脑的用户名\.ssh\id_rsa
:: [ -- 自定义-- ] REM 服务端的CD脚本路径 ↓↓↓ 远程服务器其它设置
set ServerCD=C:\web-release\MyMvcWeb\CD.bat
:: [ -- 自定义-- ] REM 服务端的临时发布包目录
set ServerTempPubPkgs=C:\web-release\temp-publish-pkgs
:: ---------- 1. 自定义设置 finished ...
:: ---------- 2.clear history start ...
%DriveLetterLocal%
cd %OutRoot%
echo clear history Start ......
echo %OutDir%
REM 清理掉Web发布包输出文件夹目录
rmdir /s /q %OutDir%
echo clear history Finished ......
:: ---------- 2.clear history finished ...
:: ---------- 3. publish start ...
REM 进入本地发布盘符
%DriveLetterLocal%
if not exist %OutRoot% (
mkdir %OutRoot%
echo %OutRoot% created successfully.
) else (
echo %OutRoot% already exists.
)
if not exist %OutDir% (
mkdir %OutDir%
echo %OutDir% created successfully.
) else (
echo %OutDir% already exists.
)
echo publish Start ......
cd %SlnDir%
dotnet publish "%csproj%" --no-self-contained -c Release /p:EnvironmentName=%Env% -o %OutDir%
echo publish Finished ......
:: ---------- 3. publish project finished ...
:: ---------- 4. delete *.pdb temp files & compress & Upload Publish Pkgs start ...
REM 进入本地发布目录 ↓↓↓ delete *.pdb temp files
cd %OutDir%
:: 检查是否存在以 .pdb 为后缀的文仿
dir /B *.pdb > nul 2>&1
REM 当检测出需要处理的文件后进行处琿
if %errorlevel% equ 0 (
:: 存在仿.pdb 为后缀的文件,删除它们
del /Q *.pdb
echo delete all rar file success
) else (
echo rar file not found
)
:: ↓↓↓ compress - 把发布的文件压缩
cd %OutDir%
echo compress Start ......
:: 设置要打包的研所包文件夹 OutDir 上边已经有变釿
"%zip7%" a -tzip "%PrjName%.7z" "%OutDir%" -mx9
echo compress Finished .....
:: ↓↓↓ Upload Publish Pkgs - 把压缩包上传到远程目录
:: 发送到服务端的临时发布包目录
scp "%OutDir%%PrjName%.7z" %SshUser%@%SshAddress%:%ServerTempPubPkgs%
:: ---------- 4. delete *.pdb temp files & compress & Upload Publish Pkgs finished ...
:: ---------- 时间统计输出 start
set CIEndTime=%time%
set CIEndTimeTxt=CI结束时间是%time:~0,2%点%time:~3,2%分%time:~6,2%秒
call :ColorText 0a "%CIEndTimeTxt%"
echo.
call :ColorText 0a "CD执行开始"
echo.
:: ---------- 时间统计输出 end
:: ---------- 5. execute server cd.bat start ...
:: SSH 执行远程服务器的CD命令
echo execute cd.bat Start ......
ssh %SshUser%@%SshAddress% -p %SshPort% -i "%SshKeyPath%" %ServerCD%
echo execute cd.bat End ......
:: ---------- 5. execute server cd.bat finished ...
:: 打开发布的网站
start http://106.15.74.25:80
:: 时间统计输出-----------------------------------------------------start-----------------------------------------------------
:: 这里更换编码格式为了改变字体颜色
chcp 936
set CDEndTime=%time%
set CDEndTimeTxt=CD结束时间是%time:~0,2%点%time:~3,2%分%time:~6,2%秒
call :ColorText 0a "%CDEndTimeTxt%"
echo.
echo.
call :ColorText 0a "%StartTimeTxt%"
echo.
call :ColorText 0a "%CIEndTimeTxt%"
echo.
call :ColorText 0a "%CDEndTimeTxt%"
echo.
echo.
set StartTimeH=%StartTime:~0,2%
set CIEndTimeH=%CIEndTime:~0,2%
set CDEndTimeH=%CDEndTime:~0,2%
set StartTimeM=%StartTime:~3,2%
set CIEndTimeM=%CIEndTime:~3,2%
set CDEndTimeM=%CDEndTime:~3,2%
set StartTimeS=%StartTime:~6,2%
set CIEndTimeS=%CIEndTime:~6,2%
set CDEndTimeS=%CDEndTime:~6,2%
if %StartTimeH:~0,1%==0 set /a StartTimeH=%StartTimeH:~1,1%*1
if %CIEndTimeH:~0,1%==0 set /a CIEndTimeH=%CIEndTimeH:~1,1%*1
if %CDEndTimeH:~0,1%==0 set /a CDEndTimeH=%CDEndTimeH:~1,1%*1
if %StartTimeM:~0,1%==0 set /a StartTimeM=%StartTimeM:~1,1%*1
if %CIEndTimeM:~0,1%==0 set /a CIEndTimeM=%CIEndTimeM:~1,1%*1
if %CDEndTimeM:~0,1%==0 set /a CDEndTimeM=%CDEndTimeM:~1,1%*1
if %StartTimeS:~0,1%==0 set /a StartTimeS=%StartTimeS:~1,1%*1
if %CIEndTimeS:~0,1%==0 set /a CIEndTimeS=%CIEndTimeS:~1,1%*1
if %CDEndTimeS:~0,1%==0 set /a CDEndTimeS=%CDEndTimeS:~1,1%*1
set /a StartTimeSecond=%StartTimeH%*3600+%StartTimeM%*60+%StartTimeS%
set /a CIEndTimeSecond=%CIEndTimeH%*3600+%CIEndTimeM%*60+%CIEndTimeS%
set /a CDEndTimeSecond=%CDEndTimeH%*3600+%CDEndTimeM%*60+%CDEndTimeS%
set /a StartTimeDiff=%CIEndTimeSecond%-%StartTimeSecond%
set /a CIEndTimeDiff=%CDEndTimeSecond%-%CIEndTimeSecond%
set /a CDEndTimeDiff=%CDEndTimeSecond%-%StartTimeSecond%
set /a StartTimeDiffH=%StartTimeDiff%/3600
set /a CIEndTimeDiffH=%CIEndTimeDiff%/3600
set /a CDEndTimeDiffH=%CDEndTimeDiff%/3600
set /a StartTimeDiffM=(%StartTimeDiff%-%StartTimeDiffH%*3600)/60
set /a CIEndTimeDiffM=(%CIEndTimeDiff%-%CIEndTimeDiffH%*3600)/60
set /a CDEndTimeDiffM=(%CDEndTimeDiff%-%CDEndTimeDiffH%*3600)/60
set /a StartTimeDiffS=%StartTimeDiff%-%StartTimeDiffH%*3600-%StartTimeDiffM%*60
set /a CIEndTimeDiffS=%CIEndTimeDiff%-%CIEndTimeDiffH%*3600-%CIEndTimeDiffM%*60
set /a CDEndTimeDiffS=%CDEndTimeDiff%-%CDEndTimeDiffH%*3600-%CDEndTimeDiffM%*60
if %StartTimeDiffH% LSS 10 set StartTimeDiffH=0%StartTimeDiffH%
if %CIEndTimeDiffH% LSS 10 set CIEndTimeDiffH=0%CIEndTimeDiffH%
if %CDEndTimeDiffH% LSS 10 set CDEndTimeDiffH=0%CDEndTimeDiffH%
if %StartTimeDiffM% LSS 10 set StartTimeDiffM=0%StartTimeDiffM%
if %CIEndTimeDiffM% LSS 10 set CIEndTimeDiffM=0%CIEndTimeDiffM%
if %CDEndTimeDiffM% LSS 10 set CDEndTimeDiffM=0%CDEndTimeDiffM%
if %StartTimeDiffS% LSS 10 set StartTimeDiffS=0%StartTimeDiffS%
if %CIEndTimeDiffS% LSS 10 set CIEndTimeDiffS=0%CIEndTimeDiffS%
if %CDEndTimeDiffS% LSS 10 set CDEndTimeDiffS=0%CDEndTimeDiffS%
call :ColorText 0a "CI耗时%StartTimeDiffH%时%StartTimeDiffM%分%StartTimeDiffS%秒"
echo.
call :ColorText 0a "CD耗时%CIEndTimeDiffH%时%CIEndTimeDiffM%分%CIEndTimeDiffS%秒"
echo.
call :ColorText 0a "总耗时%CDEndTimeDiffH%时%CDEndTimeDiffM%分%CDEndTimeDiffS%秒"
echo.
echo.
:: 时间统计输出-----------------------------------------------------end-----------------------------------------------------
if not %errorlevel%==0 goto fail
if %errorlevel%==0 goto success
:fail
call :ColorText 0c "执行失败,请检查"
pause
exit
:success
call :ColorText 0a "执行成功,当前窗口会在3秒钟自动关闭"
TIMEOUT /T 3
:: 时间统计输出-----------------------------------------------------start-----------------------------------------------------
goto :eof
:ColorText
echo off
<nul set /p ".=%DEL%" > "%~2"
findstr /v /a:%1 /R "^$" "%~2" nul
del "%~2" > nul 2>&1
goto :eof
:: 时间统计输出-----------------------------------------------------end-----------------------------------------------------
pause
CD.bat 参照(中文乱码时,文件要用GB2312 格式):
chcp 65001
REM @echo off
REM SETLOCAL EnableDelayedExpansion
::切换到当前目录
cd /d %~dp0
:: ------------------------------------------- 工具相关配置
:: 7z安装目录
set zip7=C:\Program Files\7-Zip\7z.exe
:: ------------------------------------------- 项目发布相关配置
:: 项目名称 和 CI中的项目名称一致
set ProjectName=MyMvcWeb
:: IIS 部署目录
set IISWebSiteDir=%~dp0
:: Web 发布包目录
set PublishcPkgsDir=C:\web-release\temp-publish-pkgs
:: ------------------------------------------- IIS相关配置
:: Web站点名称
set WebSiteName="CICD-MyWebSite"
:: 站点端口
set WebSitePort="80"
:: Web应用程序池名称
set WebSitePoolName="CICD-MyWebSitePool"
:: 程序池版本
set WebSitePoolVersion=""
:: 是否开启32位
set Enable32BitAppOnWin64="false"
:: 获取应用程序池列表
C:\Windows\System32\inetsrv\appcmd.exe list apppool /apppool.name:%WebSitePoolName%
:: 如果不存在程序池就新建
IF ERRORLEVEL 0 (
C:\Windows\System32\inetsrv\appcmd.exe add apppool /name:%WebSitePoolName% /managedRuntimeVersion:%WebSitePoolVersion% /Enable32BitAppOnWin64:%Enable32BitAppOnWin64%
)
:: 获取Web站点列表
C:\Windows\System32\inetsrv\appcmd.exe list site /site.name:%WebSiteName%
:: 如果不存在站点就新建
IF ERRORLEVEL 0 (
C:\Windows\System32\inetsrv\appcmd.exe add site /name:%WebSiteName% /bindings:http/*:%WebSitePort%: /applicationDefaults.applicationPool:%WebSitePoolName% /physicalPath:%~dp0
)
:: 发布前 停止一下IIS站点
@echo stop WebSite start...
@C:\Windows\System32\inetsrv\appcmd.exe stop site %WebSiteName%
@echo stop WebSite finished...
:: 停止应用程序池
@echo stop WebSite start...
C:\Windows\System32\inetsrv\appcmd.exe stop apppool /apppool.name:%WebSitePoolName%
@echo stop WebSite finished...
:: 等待几秒 确保所有文件都不被占用
echo 等待1秒,确保所有文件都不被占用 ...
timeout /t 1 /nobreak
echo 1秒已过,继续执行。
:: 解压前,删除临时发布目录
rmdir /s /q "%PublishcPkgsDir%\%ProjectName%
:: 用7z 解压文件到发布包临时目录,x 解压文件 -o指定解压目的地
"%zip7%" x -o"%PublishcPkgsDir%" "%PublishcPkgsDir%\%ProjectName%.7z"
:: 从发布包临时目录 Copy 发布文件到 IIS Web站点目录
xcopy "%PublishcPkgsDir%\%ProjectName%\*.*" "%IISWebSiteDir%" /s /e /y
:: 启动应用程序池
@echo stop WebSite start...
C:\Windows\System32\inetsrv\appcmd.exe start apppool /apppool.name:%WebSitePoolName%
@echo stop WebSite finished...
:: 启动IIS站点
@echo Restart WebSite start...
@C:\Windows\System32\inetsrv\appcmd.exe start site %WebSiteName%
@echo Restart WebSite finished...