cwx 发表于 2018-1-8 14:34:29

Jenkins持续发布解决方案

  持续发布系统架构
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204190649081-292451801.png
  架构大致分为三个部分:开发环境、产品服务器环境、持续集成部署环境
  开发环境配置项目部署文件。集成发布环境获取最新代码执行代码编辑及代码发布。产品服务器支持远程程序发布及备份。
  其中产品服务器需要安装: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发布流程图
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204191142534-1812771329.png

4.2适用范围
  1)此文档当前版本使用于发布Web站点,不支持发布失败后回滚。
  2)此解决方案只适用持续发布。持续集成需自行设置。

4.3安装需求


[*]Java运行环境,如Java8
[*].NET Framework 4.5
[*]Jenkins for windows2.0以上版本,如:jenkins-2.73.3
  安装程序下载地址:https://jenkins.io/download/


[*]IIS8
[*]IIS8 Web Deploy插件 (具体安装见实现步骤)
4.5实现步骤

1.5.1    产品服务器环境 - 配置IIS发布程序

确保Web服务器->管理工具->管理服务已安装
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204191422019-2015173954.png

安装Web Deploy 3.6,确保安装远程代理服务
  注意:Web Deploy版本必须大于2.0
  下载Web Deploy 3.6:https://www.iis.net/downloads/microsoft/web-deploy
  安装全部选项。注意:远程代理服务必须安装。
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204191501769-478278749.png

IIS管理服务->启用远程连接
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204191530675-1832223204.png
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204191550066-1251204962.png
  注意:
  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发布
  保持默认设置,点击【设置】按钮
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204191642488-198880120.png
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204191742097-1745080796.png

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
             配置实例:
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204191925878-290949393.png

配置网站自动备份参数
  上一步相当与开启了Web Deploy自动备份及设置全局的备份参数。还可以单独为某个网站指定具体的参数。
  选择网站,选择配置编辑器
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204191957066-1978576038.png
  节点选择system.webServer.wdeploy.backup
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204192019566-2112686332.png
  可以设置具体的参数。如:是否开启备份、备份的数量、备份路径等
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204192040706-304843253.png
  备份路径{sitePathParent}代表网站文件路径的父目录
  {siteName}_snapshots为备份文件命名规则
  备份文件实例:
  D:\AutoDeployment\Web为网站目录,则备份文件目录为:D:\AutoDeployment\AutoDepTest_snapshots
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204192125269-6320116.png
  msdeploy_2017_12_04_07_35_25.zip为生成的备份文件
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204192143644-1388083878.png

1.5.3    开发环境 - 配置VS开发环境

项目配置及配置转换配置
  如果项目发布时需要根据不能环境生成不同的配置文件,则首先完成各个环境的配置转换定义。如:Debug环境、Staging环境、Release环境
  如果不需求配置转换可跳过此步骤。
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204192202191-717917110.png
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204192232925-1788998230.png
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204192248441-1139216788.png
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204192311628-452467148.png
  Debug模式下的appSettings配置:
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204192338034-1776711206.png
  发布到Release环境时,需要将value值修改为456789,那么只需要打开Web.Release.config文件,添加如下的代码:
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204192422253-1495404297.png
  具体替换规则参考附件一

生成发布文件
  选择发布项目->选择Publish
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204192440956-1666951620.png
  选择自定义发布,并创建发布文件名称
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204192502159-1897385166.png
  Publish Method选择Web Deploy,配置其他属性。服务器、站点名称、用户/密码可使用服务器管理员帐号。
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204192533659-1269385784.png
  Destination URL为Web服务器启用Web Deploy时创建的“发布服务器连接URL”
  下一步选择配置文件
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204192617659-373536861.png
  完成发布VS生成发布文件
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204192632472-1297966743.png

1.5.4    持续集成部署环境 – 安装基础程序
  1).NET Framework 4.5
  2)Web Deploy 3.6
  参考4.5.1产品服务器环境 – 配置IIS发布程序章节。

1.5.5    持续集成部署环境 - 安装Jenkins
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204192721863-396242332.png
  确定Jenkins服务已启动
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204192746144-1890163205.png
  启动Jenkins管理后台,浏览器输入:http://localhost:8080,进入开始页面,解锁Jenkins,输入初始管理员密码
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204192821909-909822532.png
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204192839988-1040255733.png
  输入密码后,点击【继续】,进入“自定义Jenkins”,选择Select suggested plugins
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204192908800-2045446712.png
  安装Plugins
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204192930706-1636059712.png
  下一步创建用户,如:robin
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204193025253-1839255683.png
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204193051238-504292873.png
  点击【Start using Jenkins】进入控制面板
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204193107425-1495456735.png
  1.5.6    持续集成部署环境 - 配置Jenkins

配置插件
  进入Jenkins后台控制面板,点击【系统管理】
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204193132456-1424214068.png
  选择管理插件
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204193147894-1807682928.png
  选择可用插件, MSBuild Plugin,和batch task plugin,点击【直接安装】
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204193205113-95904552.png
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204193230034-312050032.png
  配置项目
  创建一个新任务
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204193241113-139411762.png
  输入项目名称 如:AutoDepDemo,并选择“构建一个自由风格的软件项目”,点击【OK】
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204193254847-1506556180.png
  进入项目配置页面
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204193311206-1785180244.png
  完成构建触发器配置。具体构建触发器规则参考附件2
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204193328550-998477834.png
  配置构建->增加构建步骤->选择执行Windows batch command
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204193344128-1033796813.png
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204193359534-1285749619.png
  我们增加两个构建脚本,并点击【保存】。一个用于发布网站的备份,一个用于网站的发布。具体脚本参考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 :GetVSCommonToolsDirHelper64HKLM > nul 2>&1
  @if errorlevel 1 call :GetVSCommonToolsDirHelper64HKCU > 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    持续集成部署环境 -构建项目

构建项目
  完成构建脚本配置可手动点击【立即构建】或根据触发规则自动构建,完成手动或自动发布。
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204193547894-1616867823.png
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204193619144-277386862.png
  构建完成可查看Output
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204193647738-220430062.png
  确定网站已备份,程序已更新到最新版本。
  如:AutoDepTest网站的备份文件
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204193713019-1103777328.png

多项目构建
  Jenkins可以创建多个项目并进行构建。可以查看多个项目的构建状态。
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204193732269-1956973371.png

1.5.9    持续集成部署环境 – 其他配置

源代码管理工具
  项目配置中可以配置源代码管理获取最新代码
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204193746581-1893168723.png

通知邮件
  系统管理->系统设置中可以配置SMTP服务器
https://images2017.cnblogs.com/blog/1280608/201712/1280608-20171204193807003-1398808595.png
  附件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文件,添加如下的代码:
  

<appSettings>  

    <add key="WeChat:appid" value="456789" xdt:Transform="Replace" xdt:Locator="Match(key)" />  

</appSettings>  

  此时发布项目后,会看到生成的Web.config中,value的值自动变成了456789
  场景2:替换整个appSettings节点中的值
  Debug模式下的appSettings配置:
  但发布到Release模式时,我需要替换所有节点的值,那么只需要打开Web.release.config,添加如下的代码:
  

<appSettings xdt:Transform="Replace">  

    <add key="WeChat:appid" value="456789" />  

    <add key="WeChat:secret" value="secret20170630" />  

</appSettings>  

  此时发布项目后,会看到生成的Web.config中,所有节点的值都被替换了
  场景3:替换connectionStrings节点某个数据库连接
  Debug模式下的appSettings配置:
  

<connectionStrings>  

    <add name="myDB" connectionString="Data Source=.;Initial Catalog=DebugDBName;User>  

</connectionStrings>  

  但发布到Release模式时,我需要替换数据库名为ReleaseDBName,那么只需要打开Web.release.config,添加如下的代码:
  

<connectionStrings>  

    <add name="myDB" connectionString="Data Source=.;Initial Catalog=ReleaseDBName;User>  
xdt:Transform="Replace" xdt:Locator="Match(name)"/>
  

</connectionStrings>  

  此时发布项目后,会看到生成的Web.config中,数据库名字已经被替换了
  场景4:移除某个属性
  默认生成的Web.config中,有如下配置:
  

<system.web>  

    <authentication mode="None" />  

    <compilation debug="true" targetFramework="4.5" />  

    <httpRuntime targetFramework="4.5" />  

</system.web>  

  但我们发版时,往往会移除属性debug="true",此时,打开Web.release.config,添加如下的代码:
  

<system.web>  

    <compilation xdt:Transform="RemoveAttributes(debug)" />  

</system.web>  

  此时发布项目后,会看到生成的Web.config中,属性debug="true"已经被自动移除
  场景5:修改某个属性的值
  开发环境时,appSettings节点引用了外部的一个配置文件,如下所示:
  

<appSettings configSource="Configs\AppSettings.config" />  

  但在发布到生产环境时,我们需要引用另外一个配置文件,那么此时只需要替换下configSource属性即可,打开Web.release.config,添加如下的代码:
  

<appSettings configSource="Configs\AppSettings.Prd.config" xdt:Transform="SetAttributes(configSource)"/>  

  此时发布项目后,会看到生成的Web.config中,configSource的值已经被自动修改
  本篇博客先总结这5种场景,后续如有其它场景,再持续更新该博客,希望对新人有些帮助,大牛可直接忽略……
  如你想了解更多的场景,可以看下微软官方文档:https://msdn.microsoft.com/zh-cn/library/dd465326.aspx

附件2 – Jenkins构建出发器规则
  http://blog.csdn.net/wudj810818/article/details/50962920
  http://blog.sina.com.cn/s/blog_71bc9d680102x0n1.html


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 – 参考文献
  谈谈持续集成,持续交付,持续部署之间的区别
  https://segmentfault.com/a/1190000006166538
  网站自动备份
  https://docs.microsoft.com/en-us/iis/publish/using-web-deploy/web-deploy-automatic-backups
  自动发布网站
  https://weblogs.asp.net/scottgu/automating-deployment-with-microsoft-web-deploy
页: [1]
查看完整版本: Jenkins持续发布解决方案