部署特定的組建

作者 :Jason Lee

本主題描述如何將 Web 套件和資料庫腳本從特定先前的組建部署到新的目的地,例如預備環境或生產環境。

本主題以名為 Fabrikam, Inc 的虛構公司企業部署需求為基礎,形成一系列教學課程的一部分。本教學課程系列使用範例解決方案連絡人 管理員解決方案來代表具有實際複雜程度的 Web 應用程式,包括 ASP.NET MVC 3 應用程式、Windows Communication Foundation (WCF) 服務和資料庫專案。

這些教學課程的核心部署方法是以 瞭解專案檔中所述的分割專案檔方法為基礎,其中建置和部署程式是由兩個專案檔控制,一個包含適用于每個目的地環境的組建指示,另一個包含環境特定的組建和部署設定。 在建置階段,環境特定的專案檔會合並到與環境無關的專案檔中,以形成一組完整的建置指示。

工作概觀

到目前為止,本教學課程集中的主題著重于如何在單一步驟或自動化程式中建置、封裝及部署 Web 應用程式和資料庫。 不過,在某些常見的案例中,您會想要從 drop 資料夾中的組建清單中選取所部署的資源。 換句話說,最新的組建可能不是您想要部署的組建。

請考慮上一個主題中所述的持續整合 (CI) 案例: 建立支援部署的組建定義。 您已在 Team Foundation Server (TFS) 2010 中建立組建定義。 每次開發人員將程式碼簽入 TFS 時,Team Build 都會建置您的程式碼、建立 Web 套件和資料庫腳本,執行任何單元測試,並將資源部署到測試環境。 根據您在建立組建定義時所設定的保留原則,TFS 會保留一些先前的組建。

根據您在建立組建定義時所設定的保留原則,T F S 會保留一些先前的組建。=======

現在,假設您已針對測試環境中的其中一個組建執行驗證和驗證測試,且您已準備好將應用程式部署至預備環境。 同時,開發人員可能已簽入新的程式碼。 您不想要重建解決方案並部署到預備環境,也不想將最新的組建部署至預備環境。 相反地,您想要部署已在測試伺服器上驗證並驗證的特定組建。

若要達成此目的,您必須告訴Microsoft Build Engine (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 。 因此,您可以略過建置程式,並直接執行專案檔來部署現有的組建。

若要建立組建定義以手動觸發部署

  1. 在 Visual Studio 2010 的 [ Team Explorer ] 視窗中,展開您的 Team 專案節點,以滑鼠右鍵按一下 [ 置],然後按一下 [ 新增組建定義]。

    在 Visual Studio 2010 的 [Team Explorer] 視窗中,展開您的 Team 專案節點,以滑鼠右鍵按一下 [組建],然後按一下 [新增組建定義]

  2. 在 [ 一般 ] 索引標籤上,為組建定義命名 (例如 DeployToStaging) 和選擇性描述。

  3. 在 [ 觸發程式] 索引 標籤上,選取 [ 手動 – 簽入不會觸發新的組建]。

  4. 在 [ 建置預設值] 索引 標籤的 [ 將組建輸出複製到下列投寄資料夾 ] 方塊中,輸入 drop (資料夾的通用命名慣例 (UNC) 路徑,例如 \TFSBUILD\Drops) 。

    在 [建置預設值] 索引標籤的 [將組建輸出複製到下列投寄資料夾] 方塊中,輸入 drop (資料夾的通用命名慣例 (U N C) 路徑,例如 \TFSBUILD\Drops) 。

  5. 在 [ 進程] 索引標籤的 [ 建置進程檔案 ] 下拉式清單中,保留已選取 DefaultTemplate.xaml 。 這是新增至所有新小組專案的預設建置程式範本之一。

  6. [建置程式參數 ] 資料表中,按一下 [ 要建置的專案 ] 資料列,然後按一下 省略號 按鈕。

    在 [建置程式參數] 資料表中,按一下 [要建置的專案] 資料列,然後按一下省略號按鈕。

  7. 在 [ 要建置的專案 ] 對話方塊中,按一下 [ 新增]。

  8. [類型為的專案] 下拉式清單中,選取 [MSBuild 專案檔]。

  9. 流覽至您控制部署程式之自訂專案檔的位置,選取檔案,然後按一下 [ 確定]。

    流覽至您控制部署程式之自訂專案檔的位置,選取檔案,然後按一下 [確定]。

  10. 在 [ 要建置的專案 ] 對話方塊中,按一下 [ 確定]。

  11. [建置進程參數 ] 資料表中,展開 [ 進階 ] 區段。

  12. MSBuild 引數資料 列中,指定環境特定專案檔的位置,並為組建資料夾的位置新增預留位置:

    /p:TargetEnvPropsFile=EnvConfig\Env-Stage.proj;
    OutputRoot=PLACEHOLDER
    

    在 MSBuild 引數資料列中,指定環境特定專案檔的位置,並為組建資料夾的位置新增預留位置。

    注意

    每次將組建排入佇列時,都必須覆寫 OutputRoot 值。 下一個程式涵蓋這一點。

  13. 按一下 [檔案]

當您觸發組建時,您必須更新 OutputRoot 屬性,以指向您想要部署的組建。

從組建定義部署特定組建

  1. [Team Explorer] 視窗中,以滑鼠右鍵按一下組建定義,然後按一下 [佇列新組建]。

    在 [Team Explorer] 視窗中,以滑鼠右鍵按一下組建定義,然後按一下 [佇列新組建]。

  2. 在 [ 佇列建置 ] 對話方塊的 [ 參數 ] 索引標籤上,展開 [ 進階 ] 區段。

  3. MSBuild Arguments 資料列中,將 OutputRoot 屬性的值取代為組建資料夾的位置。 例如:

    /p:TargetEnvPropsFile=EnvConfig\Env-Stage.proj;
       OutputRoot=\\TFSBUILD\Drops\DeployToTest\DeployToTest_20120228.3\
    

    在 MSBuild Arguments 資料列中,將 OutputRoot 屬性的值取代為組建資料夾的位置。

    注意

    請務必在建置資料夾的路徑結尾包含尾端斜線。

  4. 按一下 [佇列]。

當您將組建排入佇列時,專案檔會從您在 OutputRoot 屬性中指定的組建卸載資料夾部署資料庫腳本和 Web 套件。

結論

本主題描述如何使用分割專案檔部署模型,從特定先前的組建發佈部署資源,例如 Web 套件和資料庫腳本。 它說明如何覆寫 OutputRoot 屬性,以及如何將部署邏輯併入 TFS 組建定義。

深入閱讀

如需建立組建定義的詳細資訊,請參閱 建立基本組建定義定義建置程式。 如需佇列組建的詳細資訊指引,請參閱 將組建排入佇列