tech.guitarrapc.cóm

Technical updates

PowerShell から MSDeploy を実行する

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 の各引数の後ろのコロン (:) を等号記号 (=) に変更します。

例:

gist.github.com

PowerShellでのWeb 配置のコード

PowerShell での展開のメリットは、PowerShell での制御が可能である事です。 では実際に PowerShell で展開する方法を考えてみます。

System.Diagnotic.Process での配置

展開には、 msdeploy.exe つまり 外部コマンドを利用することになります。 そこで、 まずは外部コマンドの制御が自由に扱える System.Diagnotic.Process を使ってみましょう。 このやり方は、StandardOutput などの制御も楽なんですが、パッケージ展開が止まってしまってます。 まだ原因を探っていませんがどうもほげりました。

gist.github.com

Start-Process での配置

ならばしょうがないと、Start-Processを利用してみましょう。

gist.github.com

このやり方が面倒な点は、-RedirectStandardOutput が Append 出来ないので、一旦外部ファイルに逃がす必要がある点です。 また、記述にある通りただの foreach をぶんまわすのでは 対象ホストが 1-3 個程度ならいいのですが、10~ となるとパッケージの大きさによってはとっても時間がかかります。

Start-Process を workflow で並列実行

しょうがないです。 workflow で 5本並列で実行しましょう。 非同期ではありません。並列実行です。 まずは workflow で Start-Process による msdeploy 実行を、 foreach -parallel とします。

gist.github.com

StandatdOutput を、ログに取り込む場合は、workflow の外部で読み取ってください。 これは、 ファイル読み取り Get-Content と 書き込み Out-File のプロセスが競合することを避けるためです。 workflow を使うことで、10 - 50 程度の台数へ一斉配置する際でも大きく効率化されます。 更に高速化することも考えていますが、サクッと並列実行を実装可能な点では workflow は便利です。

まとめ

速度を求める場合は、 PowerShell ではなく C# で実行コードを書いて置くべきでしょう。 しかし、PowerShell で記述することで、自動化の一部に容易に組み込めるメリットもあります。 このような外部コマンドとの連携 + 自動化 は PowerShell を使っていて頻繁に利用したくなるので、ぜひ参考になれば幸いです。