Windows .NET8 实现 远程一键部署,几秒完成发布,提高效率 - CICD

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 *.pdbecho 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%*1set /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%/3600set /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%*60if %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 65001REM @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...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/418437.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32学习笔记4 --- USART

目录 通信接口1 USART 串口的通信协议 硬件部分&#xff1a; 软件部分&#xff1a; 字节数据的传递&#xff1a; stm32内部的USART外设 串口发送 串口发送接收 Hex数据包 文本数据包 数据包的收发流程 串口收发Hex数据包 串口收发文本数据包 通信接口1 USART US…

Java+Selenium+ChromeDriver谷歌版环境搭建

1、创建测试项目 创建一个Maven项目即可 2、添加Selenium依赖 最好使用Selenium3版本 3、下载对应版本的ChromeDriver 找到自己浏览器对应的版本 下载ChromeDriver&#xff08;114版本以后的&#xff0c;114版之前的直接到官网下载&#xff09;下载地址 将下载好的驱动…

Nacos注册中心与OpenFeign远程调用

文章目录 一、注册中心原理二、Nacos注册中心三、服务注册四、服务发现五、OpenFeign 一、注册中心原理 在微服务当中必须有两个角色 服务提供者&#xff1a;提供接口供其它微服务访问 服务消费者&#xff1a;调用其它微服务提供的接口 在大型微服务项目中&#xff0c;服务提供…

探索EasyCVR与AI技术深度融合:视频汇聚平台的新增长点

随着5G、AI、边缘计算、物联网&#xff08;IoT&#xff09;、云计算等技术的快速发展&#xff0c;万物互联已经从概念逐渐转变为现实&#xff0c;AIoT&#xff08;物联网人工智能&#xff09;的新时代正在加速到来。在这一背景下&#xff0c;视频技术作为信息传输和交互的重要手…

【免费分享】GIS开发面试题(流程+自我介绍+基础篇+Openlayermapbox)

本篇文章针对GIS应届生就业方向及面试困惑问题进行了收集整理&#xff0c;并列出了关于GIS开发面试中常见的问题&#xff08;含答案&#xff09;。 “ 包括以下内容 前言 简介 面试之前 面试流程 自我介绍-AI 基础篇 1、GIS八股文基础篇 2、Openlayers图形绘制 3、倾…

注解实现json序列化的时候自动进行数据脱敏

最近在进行开发的时候遇到一个问题&#xff0c;需要对用户信息进行脱敏处理&#xff0c;原有的方式是写一个util类&#xff0c;在需要脱敏的字段查出数据后&#xff0c;显示掉用方法处理后再set回去&#xff0c;觉得这种方式能实现功能&#xff0c;但是不是特别优雅&#xff0c…

PostgreSQL + PostGIS:空间数据存储及管理解决方案

在数据库领域&#xff0c;PostgreSQL 已成为最强大、最通用的选项之一。它管理大量数据的能力、对 SQL 标准的遵守以及可扩展的架构使其受到学术界和工业界的喜爱。然而&#xff0c;真正让 PostgreSQL 脱颖而出的原因之一是它与PostGIS的集成&#xff0c;这是一个允许您有效处理…

HTML 基础,尚优选网站设计开发(二)

最近在恶补HTML相关知识点&#xff0c;本人是后端程序员&#xff0c;看到周围很多人都被裁员了&#xff0c;突然想尽早转变成全栈程序员变成独立开发者&#xff0c;有空余接接私单、商单的 尚优选网站设计开发&#xff0c;HTMLCSSJavaScript实际使用 尚优选网站设计开发页面分析…

单元测试 Mock不Mock?

文章目录 前言单元测试没必要?Mock不Mock?什么是Mock?Mock的意义何在? 如何Mock&#xff1f;应该Mock什么&#xff1f;Mock 编写示例 总结 前言 前段时间&#xff0c;我们团队就单元测试是否采用 Mock 进行了一番交流&#xff0c;各有各的说法。本文就单元测试 Mock不Mock…

流媒体技术革新,EasyCVR视频汇聚平台赋能视频监控全面升级

随着科技的飞速发展&#xff0c;流媒体技术和视频监控正经历着前所未有的变革与融合。本文将从流媒体技术的新兴趋势出发&#xff0c;探讨其与视频监控领域的深度结合&#xff0c;以及这一融合所带来的创新与发展。 一、流媒体技术的新兴趋势 1、5G网络的广泛应用 5G网络以其…

Leetcode3258. 统计满足 K 约束的子字符串数量 I

Every day a Leetcode 题目来源&#xff1a;3258. 统计满足 K 约束的子字符串数量 I 解法1&#xff1a;暴力 暴力枚举每一个子字符串&#xff0c;看是否满足 k 约束。 代码&#xff1a; /** lc appleetcode.cn id3258 langcpp** [3258] 统计满足 K 约束的子字符串数量 I*/…

[米联客-XILINX-H3_CZ08_7100] FPGA程序设计基础实验连载-36高效的VIVADO BlockDesign设计方法

软件版本&#xff1a;VIVADO2021.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA 实验平台&#xff1a;米联客-MLK-H3-CZ08-7100开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 http…

828华为云征文|华为云Flexus X实例docker部署MinIO对象存储系统obs

828华为云征文&#xff5c;华为云Flexus X实例docker部署MinIO对象存储系统obs 华为云最近正在举办828 B2B企业节&#xff0c;Flexus X实例的促销力度非常大&#xff0c;特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求&#xff0c;一定…

单例模式的总结

常规模式:有属性/构造方法/普通方法&#xff0c;也可以在类中执行主方法&#xff0c;也可以在test类中执行主方法 单例模式是什么&#xff1f; 单例模式&#xff1a;类只有1个对象&#xff1b;保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。单例模式是在内…

【Python机器学习】词向量推理——词向量

目录 面向向量的推理 使用词向量的更多原因 如何计算Word2vec表示 skip-gram方法 什么是softmax 神经网络如何学习向量表示 用线性代数检索词向量 连续词袋方法 skip-gram和CBOW&#xff1a;什么时候用哪种方法 word2vec计算技巧 高频2-gram 高频词条降采样 负采样…

团队比赛活动如何记分?

团队比赛时如何记分&#xff1f; 在当今快节奏的社会中&#xff0c;团队合作和竞争已成为推动个人和集体发展的重要方式。无论是在学校的体育赛事、公司的团建活动&#xff0c;还是社区的娱乐竞赛中&#xff0c;团队比赛都扮演着不可或缺的角色。然而&#xff0c;组织一场成功的…

网络学习-eNSP配置路由器

#PC1网关&#xff1a;192.168.1.254 #PC3网关&#xff1a;192.168.3.254 #PC4网关&#xff1a;192.168.4.254# 注&#xff1a;路由器接口必须配置不同网段IP地址 <Huawei>system-view Enter system view, return user view with CtrlZ. #给路由器两个接口配置IP地址 [Hua…

黑马-Cloud21版-面试篇13:Sentinel源码分析

Sentinel源码分析 1.Sentinel的基本概念 Sentinel实现限流、隔离、降级、熔断等功能&#xff0c;本质要做的就是两件事情&#xff1a; 统计数据&#xff1a;统计某个资源的访问数据&#xff08;QPS、RT等信息&#xff09;规则判断&#xff1a;判断限流规则、隔离规则、降级规…

将用户证书导入到系统证书

现在大部分app已经不信任用户证书,通过传统charles安装证书抓包的方式已经不行,今天就来说一个将系统证书移动到系统目录的方法,系统证书的目录只有可读权限,有时候挂在目录会不成功 我们先下载如下模块 GitHub - ys1231/MoveCertificate: 支持Android7-14移动证书&#xff0…

WebAPI(四) BOM;延时函数;JS执行机制(同步异步);location对象;history对象;navigation对象

文章目录 BOM1. 定时器-延时函数2. JS执行机制(1)、同步与异步(2)、事件循环 3. location对象(1)、href属性获取完整的url地址(2)search属性获取地址中携带的参数(3) hash&#xff1a;获取地址中的#后边的部分(3) reload&#xff1a; 刷新当前页面&#xff0c;传入参数true表示…