特定のビルドを配置する
作成者: Jason Lee
このトピックでは、Web パッケージとデータベース スクリプトを特定の以前のビルドからステージング環境や運用環境などの新しい変換先にデプロイする方法について説明します。
このトピックは、Fabrikam, Inc. という架空の会社のエンタープライズ配置要件を題材にしたチュートリアル シリーズの一部です。このシリーズでは、サンプル ソリューション (Contact Manager ソリューション) を使用して、現実的なレベルの複雑さを持った、ASP.NET MVC 3 アプリケーション、Windows Communication Foundation (WCF) サービス、データベース プロジェクトなどを含んだ Web アプリケーションを取り上げます。
これらのチュートリアルの核心である配置方法は、「プロジェクト ファイルについて」で説明した分割プロジェクト ファイルのアプローチを基にして、ビルドと配置のプロセスを 2 つのプロジェクト ファイル (すべての配置先環境に適用されるビルド命令を含むファイルと、環境に特化したビルド設定や配置設定を含むファイル) で制御するものになっています。 ビルド時には、環境に特化したプロジェクト ファイルが環境に依存しないプロジェクト ファイルにマージされ、ビルド命令の完全なセットが形成されます。
タスクの概要
これまで、このチュートリアル セットのトピックでは、単一ステップまたは自動化されたプロセスの一部として Web アプリケーションとデータベースをビルド、パッケージ化、デプロイする方法に重点を置いてきました。 ただし、一部のよくあるシナリオにおいては、格納フォルダー内のビルドの一覧からデプロイするリソースを選択する必要があります。 つまり、最新のビルドが、デプロイするはずだったビルドではない可能性があります。
前のトピック「デプロイをサポートするビルド定義の作成」で説明した、継続的インテグレーション (CI) シナリオについて考えてみましょう。 Team Foundation Server (TFS) 2010 でビルド定義を作成しました。 開発者が TFS にコードをチェックインするたびに、Team Build がコードのビルド、ビルド プロセスの一環である Web パッケージとデータベース スクリプトの作成、単体テストの実行を行い、リソースをテスト環境にデプロイします。 ビルド定義の作成時に構成した保持ポリシーに応じて、TFS は以前のビルドを一定数保持します。
=======
次に、テスト環境でこれらのビルドのいずれかに対して確認と検証テストを実行し、ステージング環境にアプリケーションをデプロイする準備ができたとします。 それまでの間に、開発者が新しいコードをチェックインしている可能性があります。 ソリューションをリビルドしてステージング環境にデプロイしたり、最新のビルドをステージング環境にデプロイしたりするのは避けたいでしょう。 代わりに、テスト サーバーで確認と検証を済ませた特定のビルドをデプロイする方が望ましいでしょう。
これを実現するには、Microsoft Build Engine (MSBuild) で、そのビルドが生成した Web パッケージとデータベース スクリプトの場所を指定する必要があります。
OutputRoot プロパティのオーバーライド
サンプル ソリューションでは、Publish.proj ファイルで OutputRoot という名前のプロパティが宣言されています。 名前が示すように、これは、ビルド プロセスによって生成されるすべてのものを含むルート フォルダーです。 Publish.proj ファイルを確認すると、OutputRoot プロパティがすべてのデプロイ リソースのルートの場所を参照していることがわかります。
Note
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>
プロジェクト ファイルで別の場所から (以前の TFS ビルドの出力など) Web パッケージとデータベース スクリプトを配置する場合は、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 のインストールからデプロイをトリガーできます。
特定のビルドをデプロイするためのビルド定義の作成
次のプロシージャでは、ユーザーが 1 つのコマンドを使用してステージング環境へのデプロイをトリガーできるようにするビルド定義を作成する方法について説明します。
この場合、ビルド定義では実際にビルドを行わず、デプロイ ロジックをカスタム プロジェクト ファイルで実行します。 Publish.proj ファイルには、ファイルがチーム ビルドで実行されている場合にビルド ターゲットをスキップする条件付きロジックが含まれています。 その仕組みは、Team Build でプロジェクト ファイルを実行する場合、自動的に true に設定される組み込み BuildingInTeamBuild プロパティを評価することです。 その結果、ビルド プロセスをスキップし、プロジェクト ファイルを実行するだけで既存のビルドを配置できます。
デプロイを手動でトリガーするビルド定義を作成するには
Visual Studio 2010 の [チーム エクスプローラー] ウィンドウで、チーム プロジェクト ノードを展開し、[ビルド] を右クリックし、[新しいビルド定義] を選択します。
[全般] タブで、ビルド定義に名前 (DeployToStaging など) および、必要に応じて説明を指定します。
[トリガー] タブで、[手動 - チェックインで新規ビルドをトリガーしない] を選択します。
[ビルドの既定値] タブの [ビルド出力を次の格納フォルダーにコピーする] ボックスに、格納フォルダーの汎用名前付け規則 (UNC) パス (\TFSBUILD\Drops など) を入力します。
[プロセス] タブの [ビルド プロセス ファイル] ドロップダウン リストで、DefaultTemplate.xaml を選択したままにします。 これは、すべての新しいチーム プロジェクトに追加される既定のビルド プロセス テンプレートの 1 つです。
[ビルド プロセス パラメーター] テーブルで、[ビルドする項目] 行を選択し、省略記号ボタンを選択します。
[ビルドする項目] ダイアログ ボックスで、[追加] を選択します。
[種類の項目] ドロップダウン リストで、[MSBuild プロジェクト ファイル] を選択します。
配置プロセスを制御するカスタム プロジェクト ファイルの場所を参照し、ファイルを選択して、[OK] を選択します。
[ビルドする項目] ダイアログ ボックスで、[OK] をクリックします。
[ビルド プロセス パラメーター] テーブルで、[詳細] セクションを展開します。
[MSBuild 引数] 行で、環境固有のプロジェクト ファイルの場所を指定し、ビルド フォルダーの場所のプレースホルダーを追加します。
/p:TargetEnvPropsFile=EnvConfig\Env-Stage.proj; OutputRoot=PLACEHOLDER
Note
ビルドをキューに登録するたびに、OutputRoot 値をオーバーライドする必要があります。 これについては、次のプロシージャで説明します。
[保存] をクリックします。
ビルドをトリガーするときは、OutputRoot プロパティを更新し、デプロイするビルドを参照する必要があります。
ビルド定義から特定のビルドをデプロイするには
[チーム エクスプローラー] ウィンドウで、ビルド定義を右クリックし、[新しいビルドをキューに配置] を選択します。
[ビルドのキュー] ダイアログ ボックスの [パラメーター] タブで、[詳細設定] セクションを展開します。
[MSBuild 引数] 行で、OutputRoot プロパティの値を置き換え、ビルド フォルダーの場所にします。 次に例を示します。
/p:TargetEnvPropsFile=EnvConfig\Env-Stage.proj; OutputRoot=\\TFSBUILD\Drops\DeployToTest\DeployToTest_20120228.3\
Note
ビルド フォルダーへのパスの末尾には、必ず末尾にスラッシュを記述してください。
[キュー] をクリックします。
ビルドをキューに入れると、プロジェクト ファイルは OutputRoot プロパティで指定したビルド格納フォルダーからデータベース スクリプトと Web パッケージをデプロイします。
まとめ
このトピックでは、分割プロジェクト ファイルのデプロイ モデルを使用して、Web パッケージやデータベース スクリプトなどの配置リソースを特定の以前のビルドから発行する方法について説明しました。 OutputRoot プロパティをオーバーライドする方法と、TFS ビルド定義にデプロイ ロジックを組み込む方法について説明しました。
もっと読む
ビルド定義の作成の詳細については、基本的なビルド定義の作成、およびビルド プロセスの定義に関するページをご覧ください。 ビルドのキューへの登録に関する詳細なガイダンスについては、「ビルドのキューへの登録」をご覧ください。