[TFS 2015] 實作 Build vNext + Release + MsDeploy 自動部署內部網站

續上篇,https://dotblogs.com.tw/yc421206/2016/04/20/tfs2015_build_vnext_webdeploy

上篇的作法是用 Build 將網站應用程式打包到一個位置(Folder),然後再用 CopyFile 複製到遠端電腦的站台實體目錄。

這篇會用 Build 把網站打包成一個 zip 檔,再用 MsDeploy 發行到遠端電腦。

 
兩種做法都需要遠端電腦的權限,CopyFile 的方式比較簡單,遠端電腦不需要安裝 Web Deploy,但是 Web.config Transfrom 要自行處理,請參考:https://dotblogs.com.tw/yc421206/2016/04/22/tfs2015_build_vnext_web_config_transform

 

安裝 Web Deploy

確認你的目標網站已經安裝 WebDeploy

詳細內容請參考:
https://dotblogs.com.tw/yc421206/2013/03/15/96849
https://dotblogs.com.tw/yc421206/2014/01/21/141965
http://www.iis.net/learn/publish/using-web-deploy/configure-the-web-deployment-handler

安裝 Application Initialization 

確認你的目標網站已經安裝 Application Initialization,詳細內容請參考:
https://dotblogs.com.tw/yc421206/2016/10/16/010056

在 Build XAML 的時代

以前,為了要自動部署測試網站,我在 MsBuild 引數裡面寫了以下參數,這會得到一個結果,當 TFS 運行 Build 的時候,不管測試有沒有通過,就會自動部署測試網站,雖然我知道這樣的流程不對,但是還是用了兩三年...,因為 Build XAML好難修改流程

/p:DeployOnBuild=True 
/p:DeployTarget=MsDeployPublish 
/p:MSDeployPublishMethod=WMSVC 
/p:CreatePackageOnPublish=True 
/p:DeployIisAppPath="Your Web Site" 
/p:MsDeployServiceUrl=Your Target Computer 
/p:UserName=Your User Id 
/p:Password=Your Password 
/p:AllowUntrustedCertificate=True
引數只能有一行,為了方便閱讀我把它斷行了

 

Build XAML MsBuild Argument,如下圖:

 

Build vNext

開始之前要先確認一下,Build Agent Service 已經使用具有本機管理員身分的帳號啟動,否則部署及回收網站會失敗

建置網站

直到了 Build vNext 出來之後,整個流程的設定才變得容易許多,我才把自動測試跟自動部署整合在一塊(以前真的不好做),我在上篇已經完成了,https://dotblogs.com.tw/yc421206/2016/04/20/tfs2015_build_vnext_webdeploy

這裡我把 MsBuild Argument 換成以下,跟上篇差不多,如下圖:

 

我拿掉了 /p:OutDir 讓 bin\Release 底下的 dll 留在原地,加了 /p:PackageLocation 指定 Web Package 輸出的位置,如下圖:

/p:DeployOnBuild=true 
/p:WebPublishMethod=Package 
/p:PackageAsSingleFile=true 
/p:SkipInvalidConfigurations=true 
/p:PackageLocation="$(Build.ArtifactStagingDirectory)\\WebPackage"
別忘了,參數只能在同一行喔

 

Display name:
建置 **/src/**.sln

方案:
**/src/**.sln

Visual Studio 版本:
Visual Studio 2015

MSBuild 引數:
/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactstagingdirectory)\\WebPackage" /p:PrecompileBeforePublish=true

平台:
$(BuildPlatform)

組態:
$(BuildConfiguration)

Build 完之後,會得到

  • ProjectName.deploy.cmd:發行腳本,裡面調用 MsDeploy.exe
  • ProjectName.SetParameters.xml:MsDeploy.exe 的外部參數,由 MsBuild 打包 WebPackahe 使用有關 Deploy 有關的參數會存放在這個檔案
  • ProjectName-readme.txt:簡易教學文件,很重要
  • Parameter.zip:網站應用程式打包結果

 

發行網站

參考資料:
https://msdn.microsoft.com/zh-tw/library/ff356104(v=vs.100).aspx

接下來我要在 Release 裡面調用 ProjectName.deploy.cmd,ProjectName.readme.txt 有教我們怎麼使用 cmd


===========================
必要條件:
--------------------------
若要部署此 Web 封裝,必須在執行 .cmd 檔案的電腦上安裝 Web Deploy (msdeploy.exe)。如需如何安裝 Web Deploy 的詳細資訊,請參閱下列 URL:
http://go.microsoft.com/?linkid=9278654
此批次檔需要封裝檔案 "THS.ERP.MM.UI.zip" 及選擇性提供的參數檔案 "THS.ERP.MM.UI.SetParameters.xml" 位於相同資料夾或環境變數的目的地資料夾中。

===========================
用法:
--------------------------
THS.ERP.MM.UI.deploy.cmd [/T|/Y] [/M:電腦名稱] [/U:使用者名稱] [/P:密碼] [/G:使用暫時代理程式] [其他 msdeploy.exe 旗標 ...]


===========================
所需的旗標:
--------------------------
/T:
	呼叫含 "-whatif" 旗標的 msdeploy.exe,這將模擬部署。這不會部署該封裝。它會改為建立一份關於您實際部署封裝時將發生什麼情況的報告。
/Y:
	呼叫不含 "-whatif" 旗標的 msdeploy.exe,這會將封裝部署於目前電腦或目的地伺服器。驗證使用 /T 旗標產生的輸出之後使用 /Y。

 注意: 請勿在同一個命令中使用 /T 及 /Y。

===========================
選擇性旗標:
--------------------------
 根據預設,此指令碼相依於以沒有代理程是服務的目前使用者憑證呼叫此指令碼的目前電腦。只有對於進階案例傳輸下列的值。

/M:<目的地伺服器名稱或服務 URL>
	如果未指定此旗標,將在執行命令的電腦上安裝封裝。服務 URL 可以使用下列格式:
		https://<目的地伺服器>:8172/MSDeploy.axd 
	此格式需要 IIS 7 安裝於目的地伺服器,而且需要設定 IIS 7 Web Management Service (WMSvc) 及 Web Deployment Handler。
	服務 URL 也可以使用下列格式:
		http://<目的地伺服器>/MSDeployAgentService 
	此格式需要目的地伺服器上的系統管理權限,而且需要在目的地伺服器安裝 Web Deploy Remote Service (MsDepSvc)。IIS 7 不需要安裝於目的地伺服器。

/U:<使用者名稱>
/P:<密碼>
/G:<True | False>
	指定在目的地伺服器建立暫時接聽程式,以部署封裝。這不需要目的地伺服器的特別安裝,但是您必須是該伺服器的系統管理員。此旗標的預設值是 False。

/A:<Basic | NTLM>
	指定將使用的認證類型。可能的值是 NTLM 及 Basic。如果指定 wmsvc 提供者設定,預設的認證類型是 Basic,否則預設的認證類型是 NTLM。

/L 
	指定封裝部署於本機 IISExpress 使用者執行個體。

[其他 msdeploy.exe 旗標]
	msdeploy.exe 命令支援其他旗標。您可以將其中任何其他的旗標包含於 "$(專案名稱).Deploy.cmd" 檔案,而且在執行期間透過 msdeploy.exe 傳輸旗標。
	或者,您可以設定 "_MsDeployAdditionalFlags" 環境變數以指定其他旗標。這些設定由此批次檔使用。
	注意:包含等號 (=) 的任何旗標值必須以雙引號括住,如下列所示,這將略過部署封裝中包含的資料庫:
		"-skip:objectName=dbFullSql" 

===========================
環境特定字串:
--------------------------

	若要對於各個部署環境自訂特定應用的設定 (例如,IIS 應用程式名稱、實體路徑和任何連接字串),請編輯下列檔案的設定: 
		 "THS.ERP.MM.UI.SetParameters.xml"
===========================
如需此部署指令碼的詳細資訊,請造訪:	http://go.microsoft.com/fwlink/?LinkID=183544

 

ProjectName.deploy.cmd 會去抓 ProjectName.SetParameters.xml 裡面的設定,這個設定內容是依照 MsBuild Argument 決定的;舉個例子,當有使用 /p:DeployIisAppPath 參數,IIS Web Application Name 就會被改掉,預設值是 Default Web Site/ProjectName_deploy,當有用到這個參數 ProjectName.SetParameters.xml 就會長這樣,如下圖:

 

了解完怎麼下命令之後,接下來就要發行網站到目標電腦,使用 setParameter:name 修改站台發行參數,如下:

/y 
/m:https://<目的地伺服器>:8172/MSDeploy.axd 
/i:true 
/u:$(WebDeploy_UserId) 
/p:$(WebDeploy_Password) 
/a:Basic 
"-AllowUntrusted=True" 
"-setParam:name="IIS Web Application Name",value="站台名稱""
別忘了,參數只能在同一行喔

 

這裡我用的 Task 是 "批次指令"

Display name:
發行網站

路徑:
$(System.DefaultWorkingDirectory)\$(Build.DefinitionName)\drop\WebPackage\THS.Agent.Installer.Server.WebService.deploy.cmd

引數:    /y /m:https://$(WebDeploy.Server):8172/MSDeploy.axd /i:true /u:$(WebDeploy.UserId) /p:$(WebDeploy.Password) /a:Basic "-AllowUntrusted=True" "-setParam:name='IIS Web Application Name',value='$(WebDeploy.IISApp)'" "-skip:Directory=\\App_Data"

如下圖:

 

回收網站

站台部署成功之後,站台就進入了休息狀態,要等到第一個請求才會真的活起來,我要利用回收把站台喚醒。

在這之前要先設定 Application Initialization https://dotblogs.com.tw/yc421206/2016/10/16/010056

這裡我用的 Task 是 "命令列"

Display name:
回收網站

工具:
C:\Program Files (x86)\IIS\Microsoft Web Deploy V3\msdeploy.exe

引數:
-verb:sync -source:recycleApp -dest:recycleApp="$(WebDeploy.IISApp)",recycleMode="RecycleAppPool",computerName="$(WebDeploy.Server)",userName="$(WebDeploy.UserId)",password="$(WebDeploy.Password)"

Build Agent Service 已經使用管理員權限啟動,可以不需要帶入帳密

如下圖:

設定變數

$() 開頭的變數,記得要在你的 Variables 設定相關變數唷

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo