[DevOps自動化-5] 透過指令碼將網站封裝部署

透過MSBuild將Web專案封裝成package(zip格式),並透過deploy.cmd將package發布到指定站點。

前言

要整合CI流程,最基本的就是要能夠自動編譯專案並產生結果,才能即時反應變更,本篇將分享MSBuild的方式用Commend line來下指令達到自動編譯並封裝成package,之後再透過Command line將package發布到Server上的方式。

 

將站點封裝成Package

MSBuild的資訊來源是靠專案檔(csproj),專案檔透過Visual Studio可以視覺化的呈現如下圖。

將專案先卸載,然後右鍵編輯,可以發現專案檔其實就是一份XML,在描述說這個專案有包含那些檔案,有參考那些元件、使用哪個版本的.Net framework,以及檔案夾的結構等等。而在Visual Studio要編譯也真的非常容易,相信每位開發人員一定都有編譯過自己專案的經驗,Ctrl+Shift+B熱鍵應該很不陌生。而主要的原理就是Vistual Stduio在背後幫助你產生MSBuild的指令來達到這動作。

但考慮到要自動化,再強大的IDE也顯得無用武之地,因此,還是要稍微了解MSBuild的語法,才能透過Commend line做到自動化的目的。

MSBuild "HelloWeb.csproj"  /T:Package /p:VisualStudioVersion=14.0 /P:Configuration=Release;PackageLocation="C:\\WebDeployFileCN\\HelloWeb.zip"

語法指令是MSBuild起手,接著接專案檔名稱;

/T:Packge是設定Target表示要封裝成Package;

/p:Configuratoin=Release表示發布的Config採用Release的版本;

PackageLocation="C:\\WebDeployFileCN\\HelloWeb.zip"表示產生的相關package檔案要放在哪個路徑;

/p:VisualStudioVersoin=14.0表示所使用的MSBuild Tool的版本為14.0版(可參考下圖)。

輸入MSBuild假如沒指定csproj的名稱,預設會自動搜尋目前所在資料夾下附檔名為csproj的檔案

檔案產生後,會發現不只有一個zip檔,還包含了SetParameters.xml、SourceManifest.xml、deploy.cmd等檔案,如畫面所示。

上述這些檔案,在等會發布的時候會用到,這裡就先略過不表。

 

將Package發布到站點

要透過指令的方式發布Package到Server端,前提是Server必須有安裝Web Management Service

接著授予權限給指定的使用者,請點選要賦予權限的網站後,點選IIS管理器權限,如下圖所示。

用戶類型選擇IIS 管理器,將使用者加入。

啟用Web Deploy發行,要賦予剛剛那個帳號擁有發布的權限

這裡只需要選取指定的使用者即可,然後按確定。

不要隨便用Administrator   不要隨便用Administrator   不要隨便用Administrator!  迷之聲: 那為何文章裡要用 ?  因為我懶得建新使用者....

接下來就可透過Command line的方式執行發布站點的指令,如果要自己透過MSDeploy指令來發布站點,真的蠻麻煩的,下面有段語法可以參考。

msdeploy.exe 
-source:package='C:\Packages\HelloWeb.zip' 
-dest:auto,
computerName="https://172.16.22.18:8172/MSDeploy.axd",
userName="CN-AP-01/Administrator",password="passw@rd",
authtype="basic",includeAcls="False" 
-verb:sync -disableLink:AppPoolExtension 
-disableLink:ContentExtension 
-disableLink:CertificateExtension 
-setParamFile:"C:\WorkFolder\Repos\Packages\HelloWeb.SetParameters.xml" 
-whatif  -allowUntrusted:true

太複雜,根本不容易寫,但透過剛剛封裝產生的deploy.cmd,就會讓指令簡化很多,可以比較一下。

HelloWeb.deploy.cmd 
/t  
/m:https://172.16.22.18:8172/MSDeploy.axd 
/u:CN-AP-01/Administrator /p:passw@rd; 
/a:basic 
-allowUntrusted:true

/t代表是發佈測試,不會真的上傳到Server,/Y才是要真的傳到Server上;

/m後面的參數,只有IP的部分需要更改為目標主機的IP位址,其餘不變;

/u和/p就不多說了,就是user和password;/a表示走基本授權模式;

如果Server上尚未安裝validated certificate(憑證),就需要將-allowUntrusted設定為true。

執行語法後,deploy.cmd會自動幫你呼叫msdeploy.exe使用上面那段很複雜的語法,然後把package發布到主機的站點上。

 

小結

本篇的內容主要分享如何將專案檔透過MSBuild打包成package,以及Server端該如何設定以支援Web Management Service處理將package部署在站點上的工作,最後透過deploy.cmd指令的方式將package發布到Server上。

到這裡為止,都是靠指令碼的方式完成所有動作,這也意味著已經有自動化的基本雛形,只須再配合任何一套CI工具就能開啟自動化之路。