Jenkins 上で Karma・Jasmine や Protractor・Selenium を使ったブラウザテストが正常に動作しない問題、こうやって対応した
目次
環境・事象
Windows Server 上に、サービスとしてインストールした Jenkins で発生した。
Karma・Jasmine の組み合わせや、Protractor とか Selenium とかを使って、IE・Firefox などブラウザごとにテストを実行させるスクリプトを用意していたのだが、IE11 を開いて行うテストが失敗した。
ローカル開発環境だと問題ないのに、Jenkins 上でそのスクリプトを実行させると動かないのは何故…?
原因
調べてみると、Jenkins をサービスとして起動していることが問題のようだ。
コマンドプロンプトから実行すると成功するのにJenkinsから実行すると失敗してワケワカメ
java -jar jenkins.war
を実行するときにコマンドプロンプトから実行する
私はタスクスケジューラでOS起動時に実行するようにしていましたが、それだとJenkinsのお仕事もバックグラウンドに持ってかれてしまう
- 参考 : WindowsでJenkinsとWebDriverを動かそうとしてハマった
- 参考 : Windows上のSeleniumからWebDriverで定期的にブラウザを立ち上げる - 四畳半の窓辺より
Windowsではサービスとしてcronなどのdaemonを起動させると、そのプロセスからはGUIアプリケーションを立ちあげて動作させることが出来ない制約があります。
タスクスケジューラからならGUI立ち上がるよ
…ということだった。
対策
じゃあどうするの、というと、Jenkins プロセスが GUI のデスクトップを持つようにすればいい、ということになる。
Open properties window of the service -> Logon-> enable the checkbox "Allow service to interact with desktop"
「サービス」で起動している時でも、「サービスとデスクトップの対話を許可」にチェックを入れれば回避できるようだ。が、自分の場合はユーザアカウントと権限周りの関係上、コレを使えず。
次に考えたのは、先程出てきた java -jar jenkins.war
というコマンドを、サーバ起動時にバッチファイルから呼ぶようにすれば良い、というやり方。
色々試行錯誤した結果、元々サービスとして起動していた Jenkins 環境をそのまま維持して起動するための Windows バッチファイルは、以下のようになった。
Rem カレントディレクトリを移動する
Cd "C:\Program Files (x86)\Jenkins"
Rem JENKINS_HOME を指定する
Set JENKINS_HOME=C:\Program Files (x86)\Jenkins
Rem UTF-8 表示にする。日本語が化けるので、コマンドプロンプトのフォントを「MS ゴシック」にしておく
Chcp 65001
Rem Jenkins を起動する
Rem Jenkins お抱えの Java.exe で起動してやり、ポートやルート指定をしておく
"C:\Program Files (x86)\Jenkins\jre\bin\java.exe" -jar "C:\Program Files (x86)\Jenkins\jenkins.war" --httpPort=8080 --webroot="C:\Program Files (x86)\Jenkins\war"
あとはこのバッチファイルを「タスクスケジューラ」でサーバ起動時に開くようにする。そうすれば、このコマンドプロンプトが開きっぱなしになるので、IE を開いてのテストも動作する、というワケ。
実際にジョブを動かしながらリモートデスクトップで Jenkins サーバを見てみると、テストにあわせて IE や Firefox ブラウザが開いてテストが動作している。コレでイイカンジ。