Vagrant + PowerShellをJenkinsで使った時にハマったときのメモ

NSEG #39で「おひとりさま環境での Chef-solo 使用例」を発表した時に

を使いましたが、いくつかハマった点があったため、メモを残しておきます。


Jenkinsの実行ユーザーの指定

自分のユーザーでJenkinsを実行させたかったため、Jenkinsサービスのログオンの指定を「Local System」から「自分のユーザーアカウント」へと切り替えます。
(サービスのログオンタブにて、「●アカウント」とし、自分のアカウントを指定)



PowerShellをJenkinsで実行させるには

プラグインの導入

素の状態ではPowerShellを実行できないため、以下のプラグインを導入します。手元のバージョンは、1.2でした。

セキュリティポリシーの変更

何もしていない状態だと、PowerShellファイル(*.ps1)は実行することができません。そのため、セキュリティポリシーを変更し、実行できるようにします。
なお、64bitOSの場合、PowerShellx64版とx86版がありますが、Jenkinsはx86版を使用していました。


参考:

環境変数の追加

JenkinsでVagrantを便利に実行するため、以下の環境変数を設定します。

VBOX_USER_HOME

Jenkinsで作成した仮想マシンは、デフォルトでは以下のディレクトリに作成されるようです*1

C:\Windows\System32\config\systemprofile\VirtualBox VMs


上記は、Local Systemアカウントのプロファイルの場所のようです。
参考:windows server 2008 - Where does the LOCAL SYSTEM account store its "personal" files? - Server Fault


ただ、Cドライブの下にできるといろいろと不都合であったため、場所を移動します。
場所を移動するには、環境変数「VBOX_USER_HOME」を設定すれば良いようなので、適当なところ(「D:\vms」など)を指定しておきます。


参考:

VAGRANT_HOME

Jenkinsで実行する際に利用する「.vagrant.d」ディレクトリを指定します。
自分のアカウントで実行する場合には、「%USERPROFILE%\.vagrant.d」を指定します。



PowerShellの記述

PowerShellからコマンドプロンプトを起動する

PowerShell上では「git clone」などは大丈夫だったのですが、「knife solo prepare」などが動作しませんでした。
そのため、一度コマンドプロンプトを起動してから、「knife solo prepare」を引数渡しで実行することにしました。

cmd /C "knife solo prepare vagrant@192.168.33.11 -P vagrant"


参考:PowerShell – DOS コマンドを実行する | ITLAB51.COM



エラー対応とか

ERROR: Errno::ECONNRESET: An existing connection was forcibly closed by the remote host.

vagrant halt」で仮想マシンを停止しない状態で、再度同じJenkinsのジョブを実行したところ、発生しました。
一度仮想マシンを停止させるか、仮想マシンを削除すると、問題なく動作しました。
同じVagrantfileで仮想マシンを作ろうとしたのが原因かと思います。

「knife solo init」でコケる

今回の範囲外ですが、knife-soloを0.3.0.pre3にして「knife solo init」したところ、エラーで落ちました。
必要なものがrequireされていなかったようなので、knife-solo.rbの先頭に、「require 'pathname'」を加えます。
ショートカット: knife solo init で起こるエラー uninitialized constant KnifeSolo::Pathname (NameError)

*1:ドキュメントが見当たらなかったので、Everything search engine を使って実際の出力先を調査