しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

KuduScript を使って PowerShell 版のデプロイスクリプトを作成する

少し前にカスタムデプロイスクリプトを PowerShell で書き直しました。その時の記事は以下になります。

KuduScript をフォークして PowerShell 対応を入れましたが、それだけでは勿体無いと思ったので KuduScript へ Pull Request を投げておきましたが、それが先日ついにマージ完了しました。

Node.js 向けにバグがあったり、PowerShell.exe と LocalGit を組み合わせた時に意味不明なエラーになるという問題に悩まされましたが、何とか Workaround を発見できたので使えるようになりました。

npm に PowerShell に対応した 1.0.2 がリリースされているので、インストールするだけで使えます。

既に npm がインストールされていれば、install コマンドを叩くだけです。

npm -g install kuduscript

インストールが終わったら kuduscript コマンドが使えるようになっているので、これまでと同じオプションに -t posh オプションを付けるだけで、PowerShell 版のデプロイスクリプトが生成されます。

kuduscript -y -t posh --basic

ちなみに対応しているプロジェクトは Node.js / Basic / ASP.NET / ConsoleApp です。

実際に実行してみると、batch / bash 版と同じように deploy.ps1 と .deployment が生成されます。

デプロイスクリプトの流れは batch / bash に合わせてあるので、PowerShell っぽさは無いかも知れませんが、これでファイル操作など .NET Framework の機能を使った処理を簡単に書けるようになります。

Azure CLI はまだ未対応ですが、次のアップデートに含まれると思います。*1

おまけ : Workaround について

原因は未だによく分かっていませんが、GitHub などの外部リポジトリの連携では問題ないのに、何故か Web Apps の LocalGit を使った場合だけ PowerShell が以下のようなエラーを吐く問題に直面しました。

Window title cannot be longer than 1023 characters.

エラー自体は $Host.UI.RawUI.WindowTitle に 1024 文字以上をセットしようとして発生したようです。

しかし、WindowTitle を弄る部分は何処にも存在しないのと、自分で PowerShell をホストするプログラムを作れば動いたらしいので、PowerShell.exe 自体の問題なのではないかと疑ってます。

[config]
command = powershell -NoProfile -NoLogo -ExecutionPolicy Unrestricted -Command "& "$pwd\deploy.ps1" 2>&1 | echo"

どうも & や iex で外部プログラムを実行すると発生するようでした。

色々と調べた結果、標準出力を一旦パイプを通して出力すると発生しなくなることに気が付いたので、上のような起動コマンドを使うようにして問題を回避することにしました。

別にデプロイスクリプトに限った問題ではなく、WebJobs でも発生してたらしいので共有の意味を込めて。