MSDeploy は、 Web 配置ツール (Web Deploy) によるアプリケーションパッケージの展開を可能にします。
IIS マネージャー用の Web 配置ツールの概要
このMSDeploy を使えば、ASP.NET MVC アプリをIIS ホストへ ファイル展開、同期することが容易になるため、非常に強力で利用すべき機能です。 MSDeploy には、よくコマンドラインでの利用構文が紹介されますが、PowerShell もサポートしています。 そこで、今回は、 PowerShell による MSDeploy の実行について見てみましょう。 ====
MS-DOSコマンドでのコマンドライン構文
ここに記述があります。
Web 配置のコマンド ラインの構文
基本は、この構文です。
Msdeploy.exe コマンド ラインの主要な要素は、動詞 ("操作" とも呼ばれます)、同期元、同期先 (任意指定)、および操作設定 (任意指定) です。動詞と同期元は必須です。同期先は、動詞によって必要な場合と必要でない場合があります。任意指定の操作設定では、コマンドの実行方法を変更できます。
PowerShellでのWeb 配置の使用
PowreShell での利用も簡単で、変更点はこれだけです。
Web 配置のコマンドの verb、source、および dest の各引数の後ろのコロン (:) を等号記号 (=) に変更します。
例:
PowerShellでのWeb 配置のコード
PowerShell での展開のメリットは、PowerShell での制御が可能である事です。 では実際に PowerShell で展開する方法を考えてみます。
System.Diagnotic.Process での配置
展開には、 msdeploy.exe つまり 外部コマンドを利用することになります。 そこで、 まずは外部コマンドの制御が自由に扱える System.Diagnotic.Process を使ってみましょう。 このやり方は、StandardOutput などの制御も楽なんですが、パッケージ展開が止まってしまってます。 まだ原因を探っていませんがどうもほげりました。
Start-Process での配置
ならばしょうがないと、Start-Processを利用してみましょう。
このやり方が面倒な点は、-RedirectStandardOutput が Append 出来ないので、一旦外部ファイルに逃がす必要がある点です。 また、記述にある通りただの foreach をぶんまわすのでは 対象ホストが 1-3 個程度ならいいのですが、10~ となるとパッケージの大きさによってはとっても時間がかかります。
Start-Process を workflow で並列実行
しょうがないです。 workflow で 5本並列で実行しましょう。 非同期ではありません。並列実行です。 まずは workflow で Start-Process による msdeploy 実行を、 foreach -parallel とします。
StandatdOutput を、ログに取り込む場合は、workflow の外部で読み取ってください。 これは、 ファイル読み取り Get-Content と 書き込み Out-File のプロセスが競合することを避けるためです。 workflow を使うことで、10 - 50 程度の台数へ一斉配置する際でも大きく効率化されます。 更に高速化することも考えていますが、サクッと並列実行を実装可能な点では workflow は便利です。
まとめ
速度を求める場合は、 PowerShell ではなく C# で実行コードを書いて置くべきでしょう。 しかし、PowerShell で記述することで、自動化の一部に容易に組み込めるメリットもあります。 このような外部コマンドとの連携 + 自動化 は PowerShell を使っていて頻繁に利用したくなるので、ぜひ参考になれば幸いです。