Jenkins持續發布解決方案


持續發布系統架構

 

 

 

 

架構大致分為三個部分:開發環境、產品服務器環境、持續集成部署環境

開發環境配置項目部署文件。集成發布環境獲取最新代碼執行代碼編輯及代碼發布。產品服務器支持遠程程序發布及備份。

其中產品服務器需要安裝: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安裝需求

  1. Java運行環境,如Java8
  2. .NET Framework 4.5
  3. Jenkins for windows2.0以上版本,如:jenkins-2.73.3

安裝程序下載地址:https://jenkins.io/download/

  1. IIS8
  2. 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM