持續發布系統架構
架構大致分為三個部分:開發環境、產品服務器環境、持續集成部署環境
開發環境配置項目部署文件。集成發布環境獲取最新代碼執行代碼編輯及代碼發布。產品服務器支持遠程程序發布及備份。
其中產品服務器需要安裝: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
安裝程序下載地址:https://jenkins.io/download/
- IIS8
- IIS8 Web Deploy插件 (具體安裝見實現步驟)
4.5實現步驟
1.5.1 產品服務器環境 - 配置IIS發布程序
確保Web服務器->管理工具->管理服務已安裝
安裝Web Deploy 3.6,確保安裝遠程代理服務
注意:Web Deploy版本必須大於2.0
下載Web Deploy 3.6:https://www.iis.net/downloads/microsoft/web-deploy
安裝全部選項。注意:遠程代理服務必須安裝。
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管理后台,瀏覽器輸入:http://localhost:8080,進入開始頁面,解鎖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文件,添加如下的代碼:
<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 ID=sa;Password=sa;" providerName="System.Data.SqlClient" />
</connectionStrings>
但發布到Release模式時,我需要替換數據庫名為ReleaseDBName,那么只需要打開Web.release.config,添加如下的代碼:
<connectionStrings>
<add name="myDB" connectionString="Data Source=.;Initial Catalog=ReleaseDBName;User ID=sa;Password=sa;" providerName="System.Data.SqlClient"
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