部署特定的建置
演講者:Jason Lee
本主題介紹如何將 Web 套件和資料庫指令碼從特定的先前版本部署到新的目標,例如預備環境或生產環境。
本主題圍繞著一家名為 Fabrikam, Inc. 的虛構公司展開,針對其企業部署需求而設計了一系列教學課程。本教學課程系列使用範例解決方案 (連絡人管理員解決方案) 來代表具有現實複雜性的 Web 應用程式,其中包括 ASP.NET MVC 3 應用程式、Windows Communication Foundation (WCF) 服務,和資料庫專案。
這些教學課程的核心部署方法是基於「了解專案檔案」中所述的分割專案檔案方法,其中建置和部署流程由兩個專案檔案控制 - 一個包含適用於每個目標環境的建置指令,以及包含環境專屬的建置和部署設定的一個。 在建置時,環境專屬的專案檔案被合併到與環境無關的專案檔案中,以形成完整的建置指令集。
任務概述
到目前為止,本教學課程系列的主題主要集中在如何將網路應用程式和資料庫作為單步或自動化過程的一部分進行建置、封裝和部署。 但是,在某些常見情況下,您需要從放置資料夾中的建置清單中選擇要部署的資源。 換句話說,最新的版本可能不是您想要部署的版本。
考慮前一個主題「建立支援部署的建置定義」中所述的持續整合 (CI) 場景。 您已在 Team Foundation Server (TFS) 2010 中建立了生成定義。 每次開發人員將程式碼簽入 TFS 時,Team Build 都會建置您的程式碼,在建置過程中建立 Web 套件和資料庫指令碼,執行任何單元測試,並將您的資源部署到測試環境。 根據您在建立建置定義時設定的保留策略,TFS 將保留一定數量的先前建置。
=======
現在,假設您已在測試環境中對這些建構進行了驗證和確認測試,並且準備將應用程式部署到預備環境中。 同時,開發人員可能已經簽入了新程式碼。 您不想重建解決方案並部署到預備環境,也不想將最新版本部署到預備環境。 相反,您希望部署已在測試伺服器上驗證和驗證的特定建置。
為此,您需要告訴 Microsoft Build 引擎 (MSBuild) 在哪裡可以找到特定建置產生的 Web 套件和資料庫指令碼。
重寫 OutputRoot 屬性
在範例解決方案中,Publish.proj 檔案宣告一個名為 OutputRoot 的屬性。 顧名思義,這是包含建置程序生成的所有內容的根資料夾。 在 Publish.proj 檔案中,您可以看到 OutputRoot 屬性參考所有部署資源的根位置。
注意
OutputRoot 是常用的屬性名稱。 Visual C# 和 Visual Basic 專案檔案也宣告此屬性來儲存所有產生輸出的根位置。
<PropertyGroup>
<!--This is where the .deploymanifest file will be written to during a build-->
<_DbDeployManifestPath>
$(OutputRoot)ContactManager.Database.deploymanifest
</_DbDeployManifestPath>
<!-- The folder where the .zip and .cmd file will be located for
ContactManager.Mvc Web project -->
<_ContactManagerDest>
$(OutputRoot)_PublishedWebsites\ContactManager.Mvc_Package\
</_ContactManagerDest>
<!-- The folder where the .zip and .cmd file will be located for
ContactManager.Service Web project -->
<_ContactManagerSvcDest>
$(OutputRoot)_PublishedWebsites\ContactManager.Service_Package\
</_ContactManagerSvcDest>
<!-- ... -->
</PropertyGroup>
如果您希望專案檔案從不同位置部署 Web 套件和資料庫指令碼 (例如先前 TFS 建置的輸出),您只需覆寫 OutputRoot 屬性即可。 您應該將屬性值設定為 Team Build 伺服器上的相關建置資料夾。 如果您從命令列執行 MSBuild,則可以將 OutputRoot 的值指定為命令列參數:
msbuild.exe Publish.proj /p:TargetEnvPropsFile=EnvConfig\Env-Dev.proj
/p:OutputRoot=\\TFSBUILD\Drops\DeployToTest\DeployToTest_20120228.3\
然而,在實踐中,您還希望跳過建置目標 - 如果您不打算使用建置輸出,那麼建置解決方案就沒有意義。 您可以透過從命令列指定要執行的目標來完成此操作:
msbuild.exe Publish.proj /p:TargetEnvPropsFile=EnvConfig\Env-Dev.proj
/p:OutputRoot=\\TFSBUILD\Drops\DeployToTest\DeployToTest_20120228.3\
/target:GatherPackagesForPublishing;PublishDBPackages;PublishWebPackages
但是,在大多數情況下,您需要將部署邏輯建置到 TFS 建置定義中。 這使得具有佇列建置權限的使用者能夠從任何連接到 TFS 伺服器的 Visual Studio 安裝觸發部署。
建立建置定義以部署特定建置
下一個程序介紹如何建立建置定義,使使用者能夠使用單一命令觸發到預備環境的部署。
在這種情況下,您不希望建置定義實際建置任何內容 - 您只希望它執行自訂專案文件中的部署邏輯。 Publish.proj 檔案包含條件邏輯,如果檔案在 Team Build 中執行,則會跳過建置目標。 它透過評估內建的 BuildingInTeamBuild 屬性來實現此目的,如果您在 Team Build 中執行專案檔案,該屬性會自動設為 True。 因此,您可以跳過建置程序,只需執行專案文件即可部署現有建置。
要建立建置定義以手動觸發部署
在 Visual Studio 2010 的「Team Explorer」視窗中,展開團隊專案節點,以滑鼠以滑鼠右鍵按一下「建置」,然後按一下「新建置定義」。
在「一般」標籤上,為建置定義指定名稱 (例如 DeployToStaging) 和選擇性描述。
在「觸發程序」標籤上,選擇「手動 - 簽入不會觸發新建置」。
在「建置預設值」標籤上的「將建置輸出複製到以下放置資料夾」方塊中,鍵入放置資料夾的通用命名慣例 (UNC) 路徑 (例如,\TFSBUILD\Drops)。
在「程序」標籤上的「建置程序檔案」下拉式清單中,將「DefaultTemplate.xaml」保留為選取狀態。 這是新增到所有新團隊專案的預設建置程序範本之一。
在「建置程序參數」表中,按一下「要建置的項目」行,然後按一下省略符號按鈕。
在「要建置的項目」對話方塊中,按一下「新增」。
在「項目類型」下拉式清單中,選擇「MSBuild 專案檔案」。
瀏覽至用於控制部署程序的自訂專案文件的位置,選擇該文件,然後按一下「確定」。
在「要建置的項目」對話方塊中,按一下「確定」。
在「建置程序參數」表中,展開「進階」區段。
在「MSBuild 參數」行中,指定環境專屬的專案檔案的位置,並為建置資料夾的位置新增預留位置:
/p:TargetEnvPropsFile=EnvConfig\Env-Stage.proj; OutputRoot=PLACEHOLDER
注意
每次將建置排入佇列時,您都需要覆寫 OutputRoot 值。 這將在下一個程序中介紹。
按一下「儲存」。
當您觸發建置時,您需要更新 OutputRoot 屬性,以指向要部署的建置。
要從建置定義部署特定建置
在「Team Explorer」視窗中,以滑鼠以滑鼠右鍵按一下建置定義,然後按一下「將新建置排入佇列」。
在「將建置排入佇列」對話方塊的「參數」標籤上,展開「進階」區段。
在「MSBuild Arguments」行中,將 OutputRoot 屬性的值替換為產生資料夾的位置。 例如:
/p:TargetEnvPropsFile=EnvConfig\Env-Stage.proj; OutputRoot=\\TFSBUILD\Drops\DeployToTest\DeployToTest_20120228.3\
注意
請務必在建置資料夾的路徑結尾新增尾部斜線。
按一下「佇列」。
當您將建置排入佇列時,專案檔案將從您在 OutputRoot 屬性中指定的建置放置資料夾部署資料庫指令碼和 Web 套件。
結論
本主題描述如何使用分割專案文件部署模型從特定的先前版本發佈部署資源,例如 Web 套件和資料庫指令碼。 它解釋瞭如何覆寫 OutputRoot 屬性,以及如何將部署邏輯合併到 TFS 建置定義中。
深入閱讀
有關建立建置定義的更多資訊,請參閱「建立基本建置定義」和「定義建置程序」。 有關對建置進行排隊的更多指導,請參閱「將建置排入佇列」。