"What If" 配置を実行する

作成者: Jason Lee

このトピックでは、インターネット インフォメーション サービス (IIS) Web 配置ツール (Web 配置) と VSDBCMD を使用して、"What If" (またはシミュレートされた) 配置を実行する方法について説明します。 これにより、アプリケーションを実際に配置する前に、特定のターゲット環境に対する配置ロジックの影響を判断できます。

このトピックは、Fabrikam, Inc. という架空の会社のエンタープライズ配置要件を題材にしたチュートリアル シリーズの一部です。このシリーズでは、サンプル ソリューション (Contact Manager ソリューション) を使用して、現実的なレベルの複雑さを持った、ASP.NET MVC 3 アプリケーション、Windows Communication Foundation (WCF) サービス、データベース プロジェクトなどを含んだ Web アプリケーションを取り上げます。

これらのチュートリアルの核心である配置方法は、「プロジェクト ファイルについて」で説明した分割プロジェクト ファイルのアプローチを基にして、ビルドと配置のプロセスを 2 つのプロジェクト ファイル (すべての配置先環境に適用されるビルド命令を含むファイルと、環境に特化したビルド設定や配置設定を含むファイル) で制御するものになっています。 ビルド時には、環境に特化したプロジェクト ファイルが環境に依存しないプロジェクト ファイルにマージされ、ビルド命令の完全なセットが形成されます。

Web パッケージに対する "What If" 配置の実行

Web 配置には、"What if" (または試用版) モードで配置を実行できる機能が含まれています。 成果物を "What if" モードで配置すると、Web 配置は配置を実行したかのようにログ ファイルを生成しますが、実際には移行先サーバーでは何も変更されていません。 ログ ファイルを確認すると、配置が移行先サーバーに与える影響を理解するのに役立ちます。特に次を確認できます。

  • 追加される内容。
  • 更新される内容。
  • 削除される内容。

"What If" 配置では、実際には移行先サーバーで何も変更されないため、配置が成功するかどうかを予測することは常に実行できません。

Web パッケージの配置」で説明されているように、Web 配置を使用した Web パッケージの配置は、MSDeploy.exe コマンド ライン ユーティリティを直接使用するか、ビルド プロセスによって生成される .deploy.cmd ファイルを実行するかの 2 つの方法で行うことができます。

MSDeploy.exe を直接使用している場合は、コマンドに –whatif フラグを追加することで、"What If" 配置を実行できます。 たとえば、ContactManager.Mvc.zip パッケージをステージング環境に配置した場合に何が起こるかを評価するには、MSDeploy コマンドは次のようになります。 次の例では、パスワード キーと値のペアのプレースホルダーとして $CREDENTIAL_PLACEHOLDER$ を使用しています。

MSDeploy.exe
  -whatif
  -source:package="[path]\ContactManager.Mvc.zip"
  -dest:auto,
        computerName="https://stageweb1:8172/MSDeploy.axd?site=DemoSite",
        username="FABRIKAM\stagingdeployer",
        password=$CREDENTIAL_PLACEHOLDER$,
        authtype="Basic",
        includeAcls="False"
  -verb:sync
  -disableLink:AppPoolExtension
  -disableLink:ContentExtension
  -disableLink:CertificateExtension
  -setParamFile:"[path]\ContactManager.Mvc.SetParameters.xml"
  -allowUntrusted

"What If" 配置の結果に満足したら、-whatif フラグを削除してライブ配置を実行できます。

Note

MSDeploy.exe のコマンド ライン オプションの詳細については、Web 配置操作の設定に関するページを参照してください。

.deploy.cmd ファイルを使用している場合は、コマンドに /y フラグ ("はい"、または更新モード) の代わりに /t フラグ (試用版モード) を含めることで、"What If" 配置を実行できます。 たとえば、.deploy.cmd ファイルを実行して ContactManager.Mvc.zip パッケージを配置した場合の動作を評価するには、コマンドは次のようになります。

ContactManager.Mvc.deploy.cmd /t /m:TESTWEB1 /a:NTLM

"試用版モード" の配置結果に満足したら、/t フラグを /y フラグに置き換えて、ライブ配置を実行できます。

ContactManager.Mvc.deploy.cmd /y /m:TESTWEB1 /a:NTLM

Note

.deploy.cmd ファイルのコマンド ライン オプションの詳細については、「方法: deploy.cmd ファイルを使用して配置パッケージをインストールする」を参照してください。 フラグを指定せずに .deploy.cmd ファイルを実行すると、コマンド プロンプトに使用可能なフラグの一覧が表示されます。

データベースの "What If" 配置の実行

このセクションでは、VSDBCMD ユーティリティを使用して、スキーマ ベースのデータベースの増分配置を実行することを前提としています。 この方法の詳細については、「データベース プロジェクトの配置」を参照してください。 ここで説明する概念を適用する前に、このトピックをよく理解することをお勧めします。

配置モードで VSDBCMD を使用する場合は、/dd (または /DeployToDatabase) フラグを使用して、VSDBCMD が実際にデータベースを配置するか、単に配置スクリプトを生成するかを制御できます。 .dbschema ファイルを配置する場合の動作は次のとおりです。

  • /dd+ または /dd を指定すると、VSDBCMD によって配置スクリプトが生成され、データベースが配置されます。
  • /dd- を指定するか、スイッチを省略した場合、VSDBCMD は配置スクリプトのみを生成します。

Note

.dbschema ファイルではなく .deploymanifest ファイルを配置する場合、/dd スイッチの動作ははるかに複雑になります。 基本的に、.deploymanifest ファイルに値が TrueDeployToDatabase 要素が含まれている場合、VSDBCMD は /dd スイッチの値を無視します。 「データベース プロジェクトの配置」では、この動作について詳しく説明します。

たとえば、実際にデータベースを配置せずに、ContactManager データベースの配置スクリプトを生成するには、VSDBCMD コマンドは次のようになります。

vsdbcmd.exe /a:Deploy
            /manifest:"…\ContactManager.Database.deploymanifest"
            /cs:"Data Source=TESTDB1;Integrated Security=true"
            /p:TargetDatabase=ContactManager
            /dd-
            /script:"…\Publish-ContactManager-Db.sql"

VSDBCMD はデータベースの差分配置ツールであり、現在のデータベース (存在する場合) を指定したスキーマに更新するために必要なすべての SQL コマンドを含めるように配置スクリプトが動的に生成されます。 配置スクリプトの確認は、配置が現在のデータベースとそのデータベースに含まれるデータに与える影響を判断するのに便利な方法です。 たとえば、次を判断できます。

  • 既存のテーブルが削除されるかどうかと、その結果データが失われるかどうか。
  • テーブルを分割またはマージする場合など、操作の順序がデータ損失のリスクを伴うかどうか。

配置スクリプトに問題がない場合は、/dd+ フラグを指定して VSDBCMD を繰り返して変更を加えることができます。 または、要件を満たすように配置スクリプトを編集し、データベース サーバーで手動で実行することもできます。

"What If" 機能をカスタム プロジェクト ファイルに統合する

より複雑な配置シナリオでは、「プロジェクト ファイルについて」の説明に従って、カスタムの Microsoft Build Engine (MSBuild) プロジェクト ファイルを使用してビルドと配置のロジックをカプセル化する必要があります。 たとえば、Contact Manager サンプル ソリューションでは、Publish.proj ファイルは次の処理を行います。

  • ソリューションをビルドします。
  • Web 配置を使用して ContactManager.Mvc アプリケーションをパッケージ化および展開します。
  • Web 配置を使用して ContactManager.Service アプリケーションをパッケージ化して展開します。
  • ContactManager データベースを配置します。

この方法で複数の Web パッケージやデータベースの配置を単一ステップ プロセスに統合するときは、配置全体を "What If" モードで実行したい場合もあります。

Publish.proj ファイルは、これを行う方法を示しています。 まず、"What If" 値を格納するプロパティを作成する必要があります。

<PropertyGroup>
  <WhatIf Condition=" '$(WhatIf)'=='' ">false</WhatIf>
</PropertyGroup>

この場合、既定値が falseWhatIf という名前のプロパティを作成しました。 この値は、コマンド ライン パラメーターでプロパティを true に設定することでオーバーライドできます。これについては、後ほど説明します。

次のステージでは、フラグに WhatIf プロパティ値が反映されるように、Web 配置コマンドと VSDBCMD コマンドをパラメーター化します。 たとえば、次のターゲット (Publish.proj ファイルから取得され、簡略化されたもの) は、.deploy.cmd ファイルを実行して Web パッケージを配置します。 既定では、コマンドには /Y スイッチ ("はい"、または更新モード) が含まれています。 WhatIftrue に設定されている場合、これは /T スイッチ (試用版、または "What If" モード) に置き換えられます。

<Target Name="PublishWebPackages" Outputs="%(PublishPackages.Identity)">
  <PropertyGroup>
    <_WhatIfSwitch>/Y</_WhatIfSwitch>
    <_WhatIfSwitch Condition=" '$(WhatIf)'=='true' ">/T</_WhatIfSwitch>
    <_Cmd>%(PublishPackages.FullPath) $(_WhatifSwitch)  
         /M:$(MSDeployComputerName) 
         /U:$(MSDeployUsername) 
         /P:$(MSDeployPassword) 
         /A:$(MSDeployAuth) 
         %(PublishPackages.AdditionalMSDeployParameters)
    </_Cmd>
  </PropertyGroup>
  <Exec Command="$(_Cmd)"/>
</Target>

同様に、次のターゲットは VSDBCMD ユーティリティを使用してデータベースを配置します。 既定では、/dd スイッチは含まれません。 つまり、VSDBCMD は配置スクリプトを生成しますが、データベースは配置しません。つまり、"What If" シナリオです。 WhatIf プロパティが true に設定されていない場合、/dd スイッチが追加され、VSDBCMD によってデータベースが配置されます。

<Target Name="PublishDbPackages" Outputs="%(DbPublishPackages.Identity)">
  <PropertyGroup>
    <_DbDeployOrScript></_DbDeployOrScript>
    <_DbDeployOrScript Condition=" '$(Whatif)'!='true' ">/dd</_DbDeployOrScript>
    <_Cmd>"$(VsdbCmdExe)" /a:Deploy 
           /cs:"%(DbPublishPackages.DatabaseConnectionString)" 
           /p:TargetDatabase=%(DbPublishPackages.TargetDatabase) 
           /manifest:"%(DbPublishPackages.FullPath)" 
           /script:"$(_CmDbScriptPath)" 
           $(_DbDeployOrScript)
    </_Cmd>
  </PropertyGroup>
  <Exec Command="$(_Cmd)"/>
</Target>

同じ方法を使用して、プロジェクト ファイル内のすべての関連コマンドをパラメーター化できます。 "What If" 配置を実行する場合は、コマンド ラインから WhatIf プロパティ値を指定するだけです。

MSBuild.exe Publish.proj /p:WhatIf=true;TargetEnvPropsFile=EnvConfig\Env-Dev.proj

この方法では、すべてのプロジェクト コンポーネントに対して "What If" 配置を 1 つの手順で実行できます。

まとめ

このトピックでは、Web 配置、VSDBCMD、MSBuild を使用して "What If" 配置を実行する方法について説明しました。 "What If" 配置を使用すると、実際に配置先環境に変更を加える前に、提案された配置の影響を評価できます。

もっと読む

Web 配置コマンド ライン構文の詳細については、Web 配置操作の設定のページを参照してください。 .deploy.cmd ファイルを使用する場合のコマンド ライン オプションのガイダンスについては、「方法: deploy.cmd ファイルを使用して配置パッケージをインストールする」を参照してください。 VSDBCMD コマンド ライン構文のガイダンスについては、VSDBCMD.EXE のコマンド ライン リファレンス (配置とスキーマのインポート)に関するページを参照してください。