Corredor

ウェブ、プログラミングの勉強メモ。

Jenkins 上で Karma・Jasmine や Protractor・Selenium を使ったブラウザテストが正常に動作しない問題、こうやって対応した

[改訂第3版]Jenkins実践入門 ――ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

[改訂第3版]Jenkins実践入門 ――ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

  • 作者: 佐藤聖規,和田貴久,新井雄介,米沢弘樹,山岸啓,岩成祐樹,川口耕介
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/05/24
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

環境・事象

Windows Server 上に、サービスとしてインストールした Jenkins で発生した。

Karma・Jasmine の組み合わせや、Protractor とか Selenium とかを使って、IE・Firefox などブラウザごとにテストを実行させるスクリプトを用意していたのだが、IE11 を開いて行うテストが失敗した。

ローカル開発環境だと問題ないのに、Jenkins 上でそのスクリプトを実行させると動かないのは何故…?

原因

調べてみると、Jenkins をサービスとして起動していることが問題のようだ。

コマンドプロンプトから実行すると成功するのにJenkinsから実行すると失敗してワケワカメ

java -jar jenkins.war を実行するときにコマンドプロンプトから実行する
私はタスクスケジューラでOS起動時に実行するようにしていましたが、それだとJenkinsのお仕事もバックグラウンドに持ってかれてしまう

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 ブラウザが開いてテストが動作している。コレでイイカンジ。