持续发布系统架构
架构大致分为三个部分:开发环境、产品服务器环境、持续集成部署环境
开发环境配置项目部署文件。集成发布环境获取最新代码执行代码编辑及代码发布。产品服务器支持远程程序发布及备份。
其中产品服务器需要安装:IIS .NET Framework Web Deploy等工具;集成发布服务器需要安装IIS .NET Framework Web Deploy IIS Source Code Client Java Jenkins等工具。开发环境需要安装Visual Studio
2)方案设计
用开源软件Jenkins作为持续发布工具。Jenkins使用MIT License可用于使用、复制、修改。Jenkins支持多个项目的持续构建与发布,并不限定开发语言。Jenkins支持插件式扩展。
1 解决方案
4.1发布流程图
4.2适用范围
1)此文档当前版本使用于发布Web站点,不支持发布失败后回滚。
2)此解决方案只适用持续发布。持续集成需自行设置。
4.3安装需求
- Java运行环境,如Java8
- .NET Framework 4.5
- Jenkins for windows2.0以上版本,如:jenkins-2.73.3
安装程序下载地址:
- IIS8
- IIS8 Web Deploy插件 (具体安装见实现步骤)
4.5实现步骤
1.5.1 产品服务器环境 - 配置IIS发布程序
确保Web服务器->管理工具->管理服务已安装
安装Web Deploy 3.6,确保安装远程代理服务
注意:Web Deploy版本必须大于2.0
下载Web Deploy 3.6:
安装全部选项。注意:远程代理服务必须安装。
IIS管理服务->启用远程连接
注意:
1)这里可以根据实际情况配置标识凭据、端口、IP地址限制等选项。此处选择Windows凭据或IIS管理器凭据。
2)启用远程连接后可使用如下命令行重启msdepsvc、wmsvc服务,以确保服务器已正常安装、相应配置生效。
net stop msdepsvc
net start msdepsvc
net stop wmsvc
net start wmsvc
另外可以在IIS管理器中查看“管理服务”、“管理服务委派”是否安装成功。
网站->启用Web Deploy发布
选择启用Web Deploy发布的网站,右键鼠标,选择部署->启用Web Deploy发布。如:选择AutoDepTest网站,并启用Web Deploy发布
保持默认设置,点击【设置】按钮
1.5.2 产品服务器环境 - 配置IIS备份程序
开启Web Deploy网站自动备份功能
1)已管理员打开windows的PowerShell 执行下面的命令转到“%programfiles%\IIS\Microsoft Web Deploy V3\scripts”目录
cd "C:\Program Files\IIS\Microsoft Web Deploy V3\scripts"
2)检查当前PowerShell的执行策略,如果是Restricted 那么需要将它改为 RemoteSigned
Get-Executionpolicy
//如果输出为:Restricted 那么执行下面的命令进行修改执行策略
Set-Executionpolicy RemoteSigned
注意:上面命令会询问你是否要更改执行策略,你根据提示输入Y按回车
关于PowerShell的其他设置可以参照官方的文档:https://technet.microsoft.com/zh-CN/library/hh847748.aspx
3)执行下面的命令加载脚本:
. .\BackupScripts.ps1
注意:如果加载成功,将没有任何反应,如果加载失败将会有红色的提示语句;
4)通过TurnOn-Backups命令允许管理员开启或关闭站点的自动备份功能,这相当于一个总闸开关。
允许配置所有的备份功能
TurnOn-Backups -On $true
禁用配置所有的备份功能
TurnOn-Backups -On $false
5)打开所有站点或者指定站点的自动备份功能
# 打开所有站点的备份功能
Configure-Backups -Enabled $true
# 打开foo站点的备份功能
Configure-Backups -SiteName "foo" -Enabled $true
自动备份设置已经完成,关于跟多的自动备份设置请参照官方文档:https://www.iis.net/learn/publish/using-web-deploy/web-deploy-automatic-backups
配置实例:
配置网站自动备份参数
上一步相当与开启了Web Deploy自动备份及设置全局的备份参数。还可以单独为某个网站指定具体的参数。
选择网站,选择配置编辑器
节点选择system.webServer.wdeploy.backup
可以设置具体的参数。如:是否开启备份、备份的数量、备份路径等
备份路径{sitePathParent}代表网站文件路径的父目录
{siteName}_snapshots为备份文件命名规则
备份文件实例:
D:\AutoDeployment\Web为网站目录,则备份文件目录为:D:\AutoDeployment\AutoDepTest_snapshots
msdeploy_2017_12_04_07_35_25.zip为生成的备份文件
1.5.3 开发环境 - 配置VS开发环境
项目配置及配置转换配置
如果项目发布时需要根据不能环境生成不同的配置文件,则首先完成各个环境的配置转换定义。如:Debug环境、Staging环境、Release环境
如果不需求配置转换可跳过此步骤。
Debug模式下的appSettings配置:
发布到Release环境时,需要将value值修改为456789,那么只需要打开Web.Release.config文件,添加如下的代码:
具体替换规则参考附件一
生成发布文件
选择发布项目->选择Publish
选择自定义发布,并创建发布文件名称
Publish Method选择Web Deploy,配置其他属性。服务器、站点名称、用户/密码可使用服务器管理员帐号。
Destination URL为Web服务器启用Web Deploy时创建的“发布服务器连接URL”
下一步选择配置文件
完成发布VS生成发布文件
1.5.4 持续集成部署环境 – 安装基础程序
1).NET Framework 4.5
2)Web Deploy 3.6
参考4.5.1产品服务器环境 – 配置IIS发布程序章节。
1.5.5 持续集成部署环境 - 安装Jenkins
确定Jenkins服务已启动
启动Jenkins管理后台,浏览器输入:,进入开始页面,解锁Jenkins,输入初始管理员密码
输入密码后,点击【继续】,进入“自定义Jenkins”,选择Select suggested plugins
安装Plugins
下一步创建用户,如:robin
点击【Start using Jenkins】进入控制面板
1.5.6 持续集成部署环境 - 配置Jenkins
配置插件
进入Jenkins后台控制面板,点击【系统管理】
选择管理插件
选择可用插件, MSBuild Plugin,和batch task plugin,点击【直接安装】
配置项目
创建一个新任务
输入项目名称 如:AutoDepDemo,并选择“构建一个自由风格的软件项目”,点击【OK】
进入项目配置页面
完成构建触发器配置。具体构建触发器规则参考附件2
配置构建->增加构建步骤->选择执行Windows batch command
我们增加两个构建脚本,并点击【保存】。一个用于发布网站的备份,一个用于网站的发布。具体脚本参考4.5.7构建脚本章节。
注意:如果数据库或其他程序发布可增加数据库备份或发布的脚本。
1.5.7 持续集成部署环境 -构建脚本
4.5.7.1 Website备份脚本
@ECHO off
CLS
CD\
::CD C:\Program Files\IIS\Microsoft Web Deploy V3
@REM ------------------------根据实际情况修改--------------------------------
::WEB服务器名称
SET webName="×××××××××"
::管理员密码
SET psd="****************"
::发布站点名称
SET pubSite=AutoDepTest
msdeploy.exe -verb:sync -source:backupManager,computername=%webName%,userName="administrator",password=%psd% -dest:backupManager=%pubSite%,computername=%webName%,userName="administrator",password=%psd%
::PAUSE
脚本说明:
脚本中黑体字部分需要根据实际发布情况修改。其他部分不变。
4.5.7.2 Website发布脚本
@ECHO off
CLS
CD\
CD %VS140COMNTOOLS%
@call :GetVSCommonToolsDir
@if "%VS140COMNTOOLS%"=="" goto error_no_VS140COMNTOOLSDIR
@call "%VS140COMNTOOLS%VCVarsQueryRegistry.bat" 32bit No64bit
@REM These variables are set by VCVarsQueryRegistry.bat and need to be cleared
@set WindowsSdkDir=
@set WindowsSDK_ExecutablePath_x64=
@set WindowsSDK_ExecutablePath_x86=
@set Framework40Version=
@set FrameworkDIR32=
@set FrameworkVersion32=
@set FSHARPINSTALLDIR=
@set VSINSTALLDIR=
@set VCINSTALLDIR=
@rem Add path to MSBuild Binaries
@if exist "%ProgramFiles%\MSBuild\14.0\bin" set PATH=%ProgramFiles%\MSBuild\14.0\bin;%PATH%
@if exist "%ProgramFiles(x86)%\MSBuild\14.0\bin" set PATH=%ProgramFiles(x86)%\MSBuild\14.0\bin;%PATH%
@goto end
@REM -----------------------------------------------------------------------
:GetVSCommonToolsDir
@set VS140COMNTOOLS=
@call :GetVSCommonToolsDirHelper32 HKLM > nul 2>&1
@if errorlevel 1 call :GetVSCommonToolsDirHelper32 HKCU > nul 2>&1
@if errorlevel 1 call :GetVSCommonToolsDirHelper64 HKLM > nul 2>&1
@if errorlevel 1 call :GetVSCommonToolsDirHelper64 HKCU > nul 2>&1
@exit /B 0
:GetVSCommonToolsDirHelper32
@for /F "tokens=1,2*" %%i in ('reg query "%1\SOFTWARE\Microsoft\VisualStudio\SxS\VS7" /v "14.0"') DO (
@if "%%i"=="14.0" (
@SET VS140COMNTOOLS=%%k
)
)
@if "%VS140COMNTOOLS%"=="" exit /B 1
@SET VS140COMNTOOLS=%VS140COMNTOOLS%Common7\Tools\
@exit /B 0
:GetVSCommonToolsDirHelper64
@for /F "tokens=1,2*" %%i in ('reg query "%1\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\SxS\VS7" /v "14.0"') DO (
@if "%%i"=="14.0" (
@SET VS140COMNTOOLS=%%k
)
)
@if "%VS140COMNTOOLS%"=="" exit /B 1
@SET VS140COMNTOOLS=%VS140COMNTOOLS%Common7\Tools\
@exit /B 0
@REM -----------------------------------------------------------------------
:error_no_VS140COMNTOOLSDIR
@echo ERROR: Cannot determine the location of the VS Common Tools folder.
@goto end
:end
@REM ------------------------根据实际情况修改--------------------------------
::解决方案路径
SET slnPath="C:\Users\dben\Documents\Visual Studio 2015\Projects\WebDep\WebDep.sln"
::发布文件名称
SET pubFileName=WebDepDebug.pubxml
::配置文件类型Release Or Debug
SET config=Release
::远程WebDeploy密码
SET password=********************
::Build并发布
MSBUILD %slnPath% /p:DeployOnBuild=true /p:PublishProfile=%pubFileName% /p:Configuration=%config% /p:Password=%password% /p:AllowUntrustedCertificate=true
::PAUSE
脚本说明:
脚本中黑体字部分需要根据实际发布情况修改。其他部分不变。
1.5.8 持续集成部署环境 -构建项目
构建项目
完成构建脚本配置可手动点击【立即构建】或根据触发规则自动构建,完成手动或自动发布。
构建完成可查看Output
确定网站已备份,程序已更新到最新版本。
如:AutoDepTest网站的备份文件
多项目构建
Jenkins可以创建多个项目并进行构建。可以查看多个项目的构建状态。
1.5.9 持续集成部署环境 – 其他配置
源代码管理工具
项目配置中可以配置源代码管理获取最新代码
通知邮件
系统管理->系统设置中可以配置SMTP服务器
附件1 – VS配置替换
https://www.cnblogs.com/zwwhnly/p/7094024.html
开发项目中,有些可能会改变的值,如是否记录日志,记录日志路径等,我们都会配置在Web.config的<appSettings></appSettings>节点,也比如数据库的连接,我们会配置在Web.config的<connectionStrings></connectionStrings>节点。
但是每个开发都会遇到部署的情况,部署的环境可能还不止一套,每个环境连接的数据库都不同,appSettings节点中配置的值可能也不同,如果每次都靠手动去修改这些值,效率非常低下,那么问题来了,如何改变这种效率低下的情况呢?
其实强大的微软早就为我们准备好了方案,就是利用xdt:Transform和xdt:Locator这两个属性。
不知道大家有没有发现,新建一个MVC项目后,配置文件Web.config有两个嵌套的文件,一个是Web.Debug.config,一个是Web.Release.config,前者是Debug模式使用,后者是Release(发布)模式使用
那么下面就分场景讲解一下如何利用xdt:Transform,xdt:Locator来提升效率
场景1:替换appSettings节点中的某个值
Debug模式下的appSettings配置:
但发布到Release环境时,我需要将value值修改为456789,那么只需要打开Web.Release.config文件,添加如下的代码:
此时发布项目后,会看到生成的Web.config中,value的值自动变成了456789
场景2:替换整个appSettings节点中的值
Debug模式下的appSettings配置:
但发布到Release模式时,我需要替换所有节点的值,那么只需要打开Web.release.config,添加如下的代码:
此时发布项目后,会看到生成的Web.config中,所有节点的值都被替换了
场景3:替换connectionStrings节点某个数据库连接
Debug模式下的appSettings配置:
但发布到Release模式时,我需要替换数据库名为ReleaseDBName,那么只需要打开Web.release.config,添加如下的代码:
此时发布项目后,会看到生成的Web.config中,数据库名字已经被替换了
场景4:移除某个属性
默认生成的Web.config中,有如下配置:
但我们发版时,往往会移除属性debug="true",此时,打开Web.release.config,添加如下的代码:
此时发布项目后,会看到生成的Web.config中,属性debug="true"已经被自动移除
场景5:修改某个属性的值
开发环境时,appSettings节点引用了外部的一个配置文件,如下所示:
但在发布到生产环境时,我们需要引用另外一个配置文件,那么此时只需要替换下configSource属性即可,打开Web.release.config,添加如下的代码:
此时发布项目后,会看到生成的Web.config中,configSource的值已经被自动修改
本篇博客先总结这5种场景,后续如有其它场景,再持续更新该博客,希望对新人有些帮助,大牛可直接忽略……
如你想了解更多的场景,可以看下微软官方文档:
附件2 – Jenkins构建出发器规则
Build after other projects are built:在其他项目构建完成后再进行构建。
这里又分三种情况:
①Trigger only if build is stable:其他项目构建成功
②Trigger even if the build is unstable:其他项目不稳定
③Trigger even if the build fails:其他项目构建失败
Build periodically:周期进行构建
例如:0 4 * * * (每天凌晨4点必须构建一次源码)
Poll SCM:根据SCM软件的版本号,定时检查源码变更。如果有更新,则checkout最新code,然后执行构建动作。
例如:*/10 * * * * (每10分钟检查一次源码变化,如果有更新才build)
1.Build periodic ally与Poll SCM
Build periodic ally:周期性的执行,源码有没有变化都会执行
比如配置:H/60 * * * * 这样配置就会每60分钟构建一次,不管SVN有没有新源码
Poll SCM:定时行的执行,源码有变化才会执行
比如配置:*/10 * * * * 这样配置就会10分钟去检查svn是否有新源码,有就checkout,构建,没有就继续去潇洒,10分钟后再回来检查。
2.构建触发器可以配置构建的时间,如果需要定时构建,可以选择 Build periodically,日程表参数解释如下:
第一个参数代表的是分钟 minute,取值 0~59;
第二个参数代表的是小时 hour,取值 0~23;
第三个参数代表的是天 day,取值 1~31;
第四个参数代表的是月 month,取值 1~12;
最后一个参数代表的是星期 week,取值 0~7,0 和 7 都是表示星期天。
3.下面为举例:
每10分钟构建一次:H/10 * * * * 或*/10 * * * *
每天8点构建一次:0 8 * * *
每天8点~17点,两小时构建一次:0 8-17/2 * * *
周一到周五,8点~17点,两小时构建一次:0 8-17/2 * * 1-5
1-6月中每月1号、30号各构建一次:H H 1,30 1-6 *
附件3 – 参考文献
谈谈持续集成,持续交付,持续部署之间的区别
网站自动备份
自动发布网站