CIサーバ(Jenkins)でPitaliumをテストする
Pitalium本体のテストをJenkins 2(Pipeline)から実行する環境の構築手順を記載します。
はじめに
構築手順は大きく次のような流れになります。
- Jenkinsサーバの構築
- Hub・NodeサーバでJenkinsと連携するための設定
- SonarQubeサーバの構築(optional)
- テスト対象アプリケーションの配置
- Jenkinsジョブの設定
- 動作確認
目次
前提条件
構築先環境には、以下のソフトウェアがインストールされている前提とします。
- Java 1.7以上
- .NET Framework 4.0
Jenkinsサーバの構築
Antのインストール
- http://ant.apache.org/bindownload.cgi からAntをダウンロードする。
- 解凍して任意のパスに配置する。(ここではC:\Work\Ant\apache-ant-1.9.6 となるように解凍)
Gitのインストール
- https://git-scm.com/downloads からGitのインストーラをダウンロードする。
- インストーラに従ってインストールする。
途中の選択肢は次のように選択する。その他はデフォルトでよい。
・「Adjusting your PATH environment」では、2番目の「Use Git from the Windows Command Prompt」を選択
・「Configuring the line ending conversions」では、1番目の「Checkout Windows-style, commit Unix-style line endings」を選択
・「Configuring the terminal emulator to use with GIt Bash」では、1番目の「Use MinTTY」を選択 - (optional) Gitのプロキシ設定をする。
git config --global http.proxy proxy.example.com:8080
Tomcatのインストール
- http://tomcat.apache.org/ からTomcat8.0をダウンロードする。
- 解凍して任意のパスに配置する。(ここではC:\Work\Tomcat\apache-tomcat-8.0.32 となるように解凍)
- 環境変数JAVA_HOMEを設定する。(例:C:\Program Files\Java\jdk1.7.0_80)
- 必要に応じてファイアウォールでポート8080の通信を許可するように設定する。
- C:\Work\Tomcat\apache-tomcat-8.0.*\startup.batを起動する。
- ブラウザで http://localhost:8080/ にアクセスし、Tomcatのページが表示されることを確認する。
- 別端末からも http://ホスト名:8080/ にアクセスし、Tomcatのページが表示されることを確認しておく。
Jenkinsのインストール
- https://jenkins-ci.org/ からjenkins.war をダウンロードする。
- Tomcatを一度停止し、WARファイルをTomcatのwebappフォルダにコピーする。
- Tomcatを起動する。
- ブラウザで http://localhost:8080/jenkins/ にアクセスし、ガイダンスに従って初期セットアップを完了する。
- 手順の途中で、推奨されるプラグインをインストールしておく。
Jenkinsプラグインのインストール
- Jenkinsにアクセスし、Jenkinsの管理 > プラグインの管理 > 高度な設定 を開く。
- 以下のプラグインをインストールする。
- Copy Artifact Plugin
- Checkstyle Plugin
- Findbugs Plugin
- Cobertura Plugin
- SonarQube Plugin
- Configuration Slicing Plugin
Jenkinsの環境設定
- Jenkinsにアクセスし、Jenkinsの管理 > システムの設定 を開く。
- 「JDK」を設定する。
- 「JDK追加」をクリックする。
- 「自動インストール」のチェックを外し、任意の名前とインストール済JDKのパスを入力する。
- 同様に「Git installations」、「Ant」も設定する。
- 「SonarQube Runner」の設定をする。(SonarQubeを構築する場合)
- 「SonarQube Runner追加」をクリックする。
- 「自動インストール」のチェックを外し、名前とSonar-scannerフォルダへのパスを入力する。
- 「SonarQube」の設定をする。(SonarQubeを構築する場合)
- 「Add SonarQube」をクリックする。
- 名前とURLを入力する。
- 最後に最下部の「保存」ボタンをクリックする。
ローカルHub・Nodeの起動
単体テストの実行に、Jenkinsサーバのローカルで起動しているSelenium Grid Hubが別途必要です。
Jenkinsサーバ上でHubを起動し、firefoxが動作するNode(ローカルでもリモートでもよい)を登録しておきます。
リモートデスクトップの設定
IEノードでテストをする場合、事前にリモートデスクトップ接続しておかないとスクリーンショットが真っ黒になってしまいます。
そのため、ジョブからバッチ経由でリモートデスクトップが起動するよう予め設定しておきます。
- Jenkinsサーバマシンで「リモートデスクトップ接続」を開く。
- 接続先のコンピューター名(IPアドレス)を入力し、「オプション」を開く。
- ログオンに使用するユーザー名を入力し、「資格情報を保存する」にチェックを入れる。
- 接続ボタンを押して接続する。このとき確認ダイアログが出る場合は、「次から確認しない」にチェックを入れておく。
- ログオンパスワードを入力し、接続できたことを確認して切断する。
- 再びリモートデスクトップ接続を開き、先程接続したコンピューター名を入力する。(接続直後であればはじめから入力されている)
- 「オプション」を開き、接続設定の「名前を付けて保存」ボタンを押して設定をファイルとして保存する。
ここではDefault_IE9.rdp のような名前を付け、C:\Work\Jenkins\pitalium_ci_files\RDP に保存する。 - パスワードが毎回聞かれないようポリシーを設定する。
- グループポリシーエディタ(gpedit.msc)を開く。
- コンピューターの構成 > 管理用テンプレート > システム > 資格情報の委任 を開く。
- 「NTLMのみのサーバー認証で保存された資格情報の委任を許可する」を開く。
- ラジオボタンを「有効」にし、「サーバーを一覧に追加:」の横の「表示」ボタンをクリックする。
- 表示されたテキストボックスに、TERMSRV/接続ホストのIP(例:「TERMSRV/111.222.333.444」)と入力する。接続先のノードが複数ある場合は同様に全てのホストを入力する。
- OKボタンをクリックして閉じる。
- コマンドプロンプトで次のコマンドを実行する。
gpupdate
- Jenkinsから起動するためのバッチファイルを作成する。
以下の内容で作成し、C:\Work\Jenkins\pitalium_ci_files\RDP\startRDP_IE11.bat のような名前で保存する。(ファイル名はIEのバージョンに合わせる)
start mstsc Default_IE11.rdp
ping localhost -n 11 > nil
exit /b 0
Hub・Nodeサーバの設定
CIジョブの実行時のみHub・Nodeの動作ログをファイルに書き出すようにするため、ジョブの冒頭と最後でHub・Nodeサーバの再起動をします。
そのためのバッチファイルを、各Hub・Nodeマシン上に作成しておきます。
- 通常起動(コンソールにログを直接表示)用のバッチファイルを次の内容で作成し、C:\Work\Selenium\launchHub_day.bat および launchNode_day の名前で保存する。
- HubとNode両方が載っているマシンの場合は両方、Nodeのみの場合はNodeの起動のみを記述する。
- -Dwebdriver のパラメータは、起動するブラウザに必要なもののみ記載する。
- selenium-serverのjarのバージョンや、nodeConfig.json のパスは自身の環境に合わせる。
rem Hubの起動
start "" cmd /c "java -jar C:\Work\Selenium\jar\selenium-server-standalone-3.3.1.jar -role hub"
rem Nodeの起動
start "" cmd /c "java -Dwebdriver.ie.driver=IEDriverServer.exeの絶対パス -Dwebdriver.chrome.driver=chromedriver.exeの絶対パス ^
-Dwebdriver.gecho.driver=geckodriver.exeの絶対パス -Dwebdriver.ie.driver.loglevel=DEBUG -jar ^
selenium-server-standalone-3.3.1.jar -role node -nodeConfig C:\Work\Selenium\browser_nodeconfig.json"
2. CIジョブ実行時(ログをファイルに書き出し)用のバッチファイルを次の内容で作成し、C:\Work\Selenium\launchHub.bat および launchNode の名前で保存する。
rem Hubの起動
start "" cmd /c "java -jar C:\Work\Selenium\jar\selenium-server-standalone-3.3.1.jar -role hub >C:\Work\Selenium\logs\hub.txt 2>&1"
rem Nodeの起動
start "" cmd /c "java -Dwebdriver.ie.driver=IEDriverServer.exeの絶対パス -Dwebdriver.chrome.driver=chromedriver.exeの絶対パス ^
-Dwebdriver.gecho.driver=geckodriver.exeの絶対パス -Dwebdriver.ie.driver.loglevel=DEBUG -jar ^
selenium-server-standalone-3.3.1.jar -role node -nodeConfig C:\Work\Selenium\browser_nodeconfig.json >C:\Work\Selenium\logs\node.txt 2>&1"
3. 起動中のHub/Nodeをkillするためのバッチファイルを次の内容で作成し、C:\Work\Selenium\kill-grid.bat の名前で保存する。
REM Javaプロセス一覧の表示
set CMD="jps -l"
set pId=
set pName=
REM selenium-server-standalone-**.jar のプロセスをkill
for /f "usebackq tokens=1,2" %%i in (`%CMD%`) do (
set pId=%%i
set pName=%%j
echo "!pName!" | find "selenium-server-standalone" > nul
if not !ERRORLEVEL! equ 1 (
taskkill /pid !pId! /F
)
)
endlocal
exit /b 0
スレーブの登録
上記で作成したHub・Nodeマシン上のバッチファイルをJenkinsから起動するために、Hub・NodeマシンをJenkinsのスレーブとして登録する。
- スレーブとの接続で使用するポートを固定する。(optional。ファイアウォールでポートを指定して開ける必要がある場合はこの設定をする)
- Jenkinsの管理 > グローバルセキュリティの設定 を開く。
- 「セキュリティを有効化」にチェックを入れ、JNLPスレーブ用TCPポート番号を固定に設定し、任意のポートを入力する。
- Jenkinsマシン、スレーブマシン双方で上記ポートの通信が可能になるようファイアウォールの設定をする。
- 新規スレーブを作成する。
- スレーブとして登録したいHub・NodeマシンのブラウザからマスターのJenkinsにアクセスする。
- Jenkinsの管理 > ノードの管理 を開き、「新規ノード作成」をクリックする。
- ノード名を入力し、「ダムスレーブ」にチェックを入れてOKボタンを押す。
- 以下のように設定して保存する。
- 「リモートFSルート」:スレーブマシン側で使う作業ディレクトリのフルパス。
ex) C:\Jenkins\workspace - 「用途」:このマシーンを特定ジョブ専用にする
- 「起動方法」:JNLP経由でスレーブを起動
- 「リモートFSルート」:スレーブマシン側で使う作業ディレクトリのフルパス。
- スレーブをマスターに接続する。
- 作成したスレーブ名をクリックする。
- 「slave.jar」のリンクをクリックしてダウンロードする。
- 「Run from agent command line:」に書かれているコマンドをコピーする。
次のようなバッチファイルを作成し、任意の場所に保存する。
start /b cmd /c [コピーしたコマンド]
exit
4. 作成したバッチファイルを実行し、マスターに接続できることを確認する。
SonarQubeの構築(optional)
Jenkinsジョブで解析したソースコードのメトリクスを、SonarQubeで可視化するための環境を構築します。
不要であればこの手順はスキップしてください。
MySQLのインストール
- http://dev.mysql.com/downloads/ からMySQL Community Server をmsi形式でダウンロードする。
- インストーラに従ってインストールする。
- sonarユーザ(localhost・DB Admin・パスワード:sonar)を作成する。
- 環境変数PATHにMysql Serverのbinフォルダへのパスを追加する。
- sonar用のDBを作成し、sonarユーザに権限を与える。
mysql -u root -p
CREATE DATABASE sonar;
GRANT all on sonar.* to 'sonar'@'localhost';
SonarQubeのインストール
- http://www.sonarqube.org/downloads/ からSonarQubeをダウンロードする。
- 解凍して任意のパスに配置する。(ここではC:\Work\SonarQube\sonarqube-5.3 となるように解凍)
- MySQLを使うための設定をする。
sonarqube-5.3/conf/sonar.properties を開き、以下のように編集する。- sonar.jdbc.username を有効にし、ユーザ名(sonar)を設定する。
- sonar.jdbc.password を有効にし、sonarユーザのパスワードを設定する。
- MySQL用のsonar.jdbc.url を有効にする。
- サービスから起動できるように設定する。
sonarqube-5.3/bin/windows-x86-64/InstallNTService.bat を管理者権限で実行する。 - サービスを起動する。
# 起動に失敗する場合、サービスの起動ユーザをシステムアカウントではなくローカルのAdministratorに変更すると起動できる。 - ブラウザで http://localhost:9000/ にアクセスし、SonarQubeのページが表示されることを確認する。
- 別端末からも http://ホスト名:9000/ にアクセスし、SonarQubeのページが表示されることを確認しておく。
Sonar-scannerのインストール
- https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner からSonarQube Scannerをダウンロードする。
- 解凍して任意のパスに配置する。(ここではC:\Work\SonarQube\sonar-scanner-2.5 となるように解凍)
プラグインのインストール
- プラグインのjarファイルをダウンロードする。必要プラグインは以下。
- checkstyle
- cobertura
- findbugs
- プラグインファイルをsonarqube-5.3\extensions\plugins 以下に全てコピーする。
- SonarQubeサービスを再起動する。
テスト対象アプリケーションの配置
- Jenkinsからアクセス可能なマシンに、ApacheなどのWebサーバをインストールする。
- Pitaliumのリポジトリをチェックアウトし、pitalium-test-site 以下のファイルをWebサーバ上に公開する。
Jenkinsジョブの設定
- Pitaliumのリポジトリをチェックアウトする。
# 現在、pitalium-jenkins-jobsフォルダはdevブランチにあります。 - pitalium-jenkins-jobs内のPitaliumフォルダを、Jenkinsのホームディレクトリのjobsフォルダ以下にコピーする。
デフォルトでは次のようなパスになる。
C:\Users\Tomcat起動ユーザ\.jenkins\jobs\Pitalium - Tomcatを起動(起動済であれば再起動)する。
- ジョブがインポートされ、一覧に表示されることを確認する。
- パラメータを環境に合わせて指定する。特に、次のパラメータの値は構築した環境に応じて変更する。
- HUB_HOST
- APP_HOST
- SONAR_URL
- パラメータのデフォルト値は、次の設定画面からまとめて変更できる。
Jenkinsの管理 > Configuration Slicing > Parameters
動作確認
- IT_SET_EXPECTED_ALL ジョブを実行し、全ブラウザについて期待結果を取得する。
- pitalium-test-runnerジョブを実行する。