MSDeploy カスタム プロバイダーによるバッチ ファイルの実行

[Kateryna’s Blog MSDeploy Custom Provider to execute batch files  ]の翻訳です。

概要

IIS Web 配置ツール (MSDeploy とも呼ばれる) を使用すると、IIS Web サーバー、Web アプリケーション、Web サイトの移行、管理、展開を簡単に行うことができます。MSDeploy には、カスタム プロバイダーを実行する機能もあります。これらのプロバイダーを実行することによって、MSDeploy の機能を最大限に活用できます。

この記事では、MSDeploy の同期処理の中でバッチ ファイル コマンドを実行するカスタム MSDeploy プロバイダーのサンプル コードを紹介します。バッチ ファイル プロバイダーを使用することによって、展開の前後にカスタム スクリプトを実行し、展開処理をシームレスに行うことができます。たとえば、特定の MSDeploy の同期についてパフォーマンス カウンターをセットアップしたり、MSDeploy ではなく xcopy でコンテンツをコピーするバッチ ファイルを作成したりする (ただし、xcopy よりも MSDeploy の方が高速です) ことができます。この記事のコードは独自の MSDeploy カスタム プロバイダーを作成するためのサンプルとして使用できるようになっており、MSDeploy RTW リリースを待つ必要はありません (MSDeploy チームが RTW リリースでバッチ ファイル プロバイダーを提供する予定だ、という噂があります)。いずれにせよ、このコードは、Yamini Jagadeesan 女史が数か月前に発表した、MySql データベースを別のデータベースに同期するための MSDeploy MySql カスタム プロバイダーに関する、優れたサンプルとブログの記事に基づいて作成されています。まだこの記事をお読みになっていない方は、ぜひご覧になることをお勧めします。MSDeploy カスタム プロバイダーの最初のソリューションとして参考になるでしょう。

このウォークスルーの要件

プロバイダーのインストールの手順を実行するには、gacutil をダウンロードしてアセンブリを GAC に追加する必要があります。gacutil は、.NET Framework SDK の一部として入手することも、個別にダウンロードすることもできます。

ダウンロードとインストール

まず、プロジェクトを含む zip ファイルをダウンロードします。ソリューションには以下のファイルが含まれています。

  • BatchProviderFactory.cs。オーバーライドされた CreateProvider メソッドでプロバイダーのインスタンスを返す、プロバイダーへのエントリ ポイント。
  • BatchProvider.cs。バッチ ファイルの実行を開始するプロバイダー自体。
  • Strongname.pfx。厳密名を検証するためにアセンブリに署名するキーを含むファイル。パスワードは "MSDeployRocks" ですが、この pfx ファイルを削除し、Visual Studio で [プロジェクトのプロパティ]、[署名] の順にクリックして、アセンブリに署名するためのキーとパスワードを指定することもできます。

プロバイダーをインストールするには、以下の作業が必要です。

  1. プロジェクトをコンパイルする (またはこの dll を使用する)

  2. 次のコマンドを実行して新しいアセンブリを GAC に追加する

    gacutil /if BatchProvider.dll

  3. 以下の場所に文字列値を追加して、アセンブリをレジストリに登録する

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\IIS Extensions\MSDeploy\1\Providers\batch

文字列値によって、使用する DeploymentProviderFactory、名前空間、および最終的にはアセンブリ情報を含むプロバイダーに MSDeploy を指定します。バッチ プロバイダーの場合は、文字列レジストリ値 "MSDeployCustomProviders.BatchProviderFactory, BatchProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a0b65de31a9f7a07, processorArchitecture=MSIL" を追加する必要があります。ここで、

  • MSDeployCustomProviders は、ファクトリとプロバイダーの両方を含む名前空間です。

  • BatchProviderFactory はファクトリです。

  • BatchProvider と残りの部分は、アセンブリ情報であり、次のコマンドを実行して取得することができます。

    gacutil /l BatchProvider

利便性のために、この両方の処理を行う register.bat が用意されています (処理は、プロジェクトのプロパティに従ってプロジェクトがコンパイルされるたびに実行されます。Visual Studio で、[プロジェクトのプロパティ]、[ビルド イベント] の順にクリックし、register.bat がビルド後のイベントとして呼び出されることを確認してください)。

BatchProvider の内部処理

  • GetAttributes メソッドが展開元と展開先の両方で呼び出され、アクションを実行せずにオブジェクトが検証されます (ダンプの実行と考えることができる)。オブジェクトが無効である場合や、オブジェクトでアクションが必要な場合 (バッチ ファイル プロバイダーの例では、別のプロセスでシェル プログラムのコマンドを実行する必要がある) は、このメソッドは DeploymentException をスローし、Add メソッドが呼び出されるようにします。最後に、展開先のオブジェクトで呼び出された場合にのみ、コードでアクションを実行するようにします。これは、次の条件によって保証されます。

     if (this.BaseContext.IsDestinationObject)
    
  • Add メソッドは、オブジェクトが有効であることを保証します。このメソッドは、展開先オブジェクトでのみ呼び出されるので、アクションを必要とする "有効化" メソッドと考えることができます。ダンプは展開元オブジェクトでのみ実行できるので、展開先オブジェクトは常にアクションを必要します。コマンド ラインでは、ダンプは -source スイッチを指定した場合にだけ実行できるため、これは当然のことと言えます。

    msdeploy –verb:dump –source:<destination>

  • GetStream メソッドは、展開元がアーカイブ ディレクトリ (archiveDir プロバイダー) またはパッケージ (パッケージ プロバイダー) と同期されるときに呼び出されます。たとえば、このメソッドは、以下のコマンドが実行されるたびに呼び出されます。

    msdeploy –verb:sync –source:batch="myBatchJob.bat" –dest:archiveDir=c:\backup
    msdeploy –verb:sync –source:batch="myBatchJob.bat" –dest:package=c:\backup.zip
    msdeploy –verb:sync –source:manifest="manifestWithBatchInIt.xml" –dest:package=c:\backup.zip

    GetStream メソッドでは、FileStream が返され、MSDeploy はバッチ ファイルを単純なテキスト ファイルとしてアーカイブやパッケージに添付できます。

想定しているタスクに合わせてプロバイダーを調整することができます。たとえば、バッチ ファイルのコマンドを実行するプロセスの ProcessStartInfo を調整して、同期中の動作を制御できます。プロセスの出力およびエラー ストリームをリダイレクトして、実行の結果をログに記録できます。

コメントや質問がある場合は、お気軽に投稿してください。

添付: BatchProvider_solution.zip