銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

MSDeploy をAPIとして、C# のコードから実行する

Build Insiderさんで「コードから触るIIS 8」という連載を書くことになりました。1回目の記事「PowerShellによるIIS 8のインストール - Build Insider」が公開されていますのでぜひ読んでください!

さて、最近お仕事の方でASP.NET (C#)なプロジェクトのビルドとデプロイまわりをやっております。C#でビルド & デプロイということで、MSBuild & MSDeployを使っています。 具体的には、MSBuild でターゲットをpackage にしてビルドしてデプロイ用のパッケージを使い、MSDeployを使ってWebサーバーにデプロイしています。(このときWebサーバー側にはMS Deploy がインストール済みという前提) コマンドプロンプトから実行する分には、パッケージを作成したときに作られる .cmd なコマンドラインスクリプトを呼び出せばいいのですが、デプロイまわりをまとめてC#製のツールから実行することを検討しています。 C# から外部プロセスを実行して云々…となると、プロセスの結果を待機だの、標準出力を取得だのといろいろめんどうなことが増えてきます。じゃあ、直接C# でMSDeployを実行できないのか、というのが今日のお話です。

結論から言うとできました。ただ、ドキュメントがAPI ドキュメント程度しか見当たらないので、推奨される方法かどうかは微妙なところです。 これをやるには、 まず、Web Deploy 3.5 をWeb Platform Installer経由でデプロイする元のクライアントとデプロイ先のサーバーの両方にインストールします。その後、C:\Program Files\IIS\Microsoft Web Deploy V3 に Microsoft.Web.Deployment.dll というファイルが作成されるので、それを参照に加えてコードを書きます。

MSDeploy を実行するコードは次のようになります。

MSDeploy は非常に多くのオプションが指定できますが、今回は package ターゲットで生成されるインストールスクリプトで実行されるMSDeploy コマンドと同じオプションになるように指定してみました。最初にデプロイ先にログインするユーザーとパスワードを指定していますが、このユーザーは管理者権限が必要です。

で、これを実行すると実行結果は次のようになります。

BytesCopied: 6487389

Added: 118

Updated: 4

Deleted: 0

Errors: 0

Warnings: 0

ParametersChanged: 0

TotalChanges: 122

実際にデプロイ先のWebサイトの物理パスを見るとデプロイできていることが確認できます。 接続先に接続できない場合なども例外が投げられますので、外部プロセス呼び出しに比べて異常系の処理も書きやすいかと思います。