"What If" 配置を実行する

作成者: Jason Lee

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

このトピックでは、Fabrikam, Inc という架空の会社のエンタープライズ展開要件に基づく一連のチュートリアルの一部を構成します。このチュートリアル シリーズでは、サンプル ソリューションである Contact Manager ソリューションを使用して、ASP.NET MVC 3 アプリケーション、Windows Communication Foundation (WCF) サービス、データベース プロジェクトなど、複雑さの現実的なレベルの Web アプリケーションを表します。

これらのチュートリアルの中心にある配置方法は、「プロジェクト ファイルの 理解」で説明されている分割プロジェクト ファイルのアプローチに基づいています。この方法では、ビルドと配置のプロセスが 2 つのプロジェクト ファイルによって制御されます。1 つは、すべての移行先環境に適用されるビルド手順を含み、1 つは環境固有のビルドと配置設定を含むプロジェクト ファイルです。 ビルド時に、環境固有のプロジェクト ファイルが環境に依存しないプロジェクト ファイルにマージされ、ビルド手順の完全なセットが形成されます。

Web パッケージの "What If" デプロイの実行

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

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

"what if" デプロイでは実際には移行先サーバー上の何も変更されないため、常に実行できるとは限らないのは、デプロイが成功するかどうかの予測です。

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

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 コマンドが存在する場合は、指定されたスキーマに格納するためにデプロイ スクリプトが動的に生成されます。 デプロイ スクリプトの確認は、デプロイが現在のデータベースとそのデータベースに含まれるデータに与える影響を判断するのに便利な方法です。 たとえば、次の情報を確認できます。

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

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

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

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

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

このように複数の Web パッケージやデータベースのデプロイを 1 つのステップ プロセスに統合する場合は、デプロイ全体を "what if" モードで実行するオプションも必要になる場合があります。

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

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

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

次のステージでは、フラグに WhatIf プロパティ値が反映されるように、Web Deploy コマンドと 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 コマンド ライン構文のガイダンスについては、「 コマンド ライン リファレンス for VSDBCMD.EXE (Deployment and Schema Import)」を参照してください。