初めてのjenkinsで、commitしたらユニットテストが走って、その結果次第でレベルアップ音がなるようになるまでの試行錯誤
Jenkinsでビルド後に音(BGM、SE)を鳴らしてみたに触発されてjenkinsついに初導入や!と気合いを入れてやってみた。
何カ所かハマりポイントあったので、それも全部残します。
前提
- 環境は mac osx 10.7.5
- cakephp2で書いたwebサービス
- gitで管理
- ユニットテストをすでに書いてる
参考にした本
jenkinsインストール
いきなりですが、勢いでmacportsかな?でインストールしたら、その後ハマったので、こちらを参考にjenkins 再インストール。リンク先そのままですが、作業メモ
- jenkinsアンインストール
sh /Library/Application\ Support/Jenkins/Uninstall.command
- ここから最新のjenkikins.war をDL
- 各ディレクトリ作成
- mkdir -p ~/Library/LaunchAgents/
- mkdir -p ~/.jenkins/
- mkdir -p ~/bin/
- mkdir -p ~/lib/
- mkdir -p ~/lib/java/
- 各ファイル設置
- mv jenkins.war ~/lib/java/
- ~/Library/LaunchAgents/jenkins.plist というファイルを作成。内容は以下。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>EnvironmentVariables</key> <dict> <key>JENKINS_HOME</key> <string>${HOME}/.jenkins</string> </dict> <key>GroupName</key> <string>staff</string> <key>KeepAlive</key> <true/> <key>Label</key> <string>jenkins</string> <key>ProgramArguments</key> <array> <string>/bin/bash</string> <string>${HOME}/bin/jenkins-runner.sh</string> </array> <key>RunAtLoad</key> <true/> <key>UserName</key> <string>${USER}</string> </dict> </plist>
- ~/bin/jenkins-runner.sh というファイルを作成。内容は以下。
#!/bin/bash # # Startup script used by Jenkins launchd job. # Mac OS X launchd process calls this script to customize # the java process command line used to run Jenkins. #- # Customizable parameters are found in # ~/Library/Preferences/jenkins.plist # # You can manipulate it using the "defaults" utility. # See "man defaults" for details. defaults="defaults read ~/Library/Preferences/jenkins" war=`$defaults war` || war="${HOME}/lib/java/jenkins.war" javaArgs="" heapSize=`$defaults heapSize` && javaArgs="$javaArgs -Xmx${heapSize}" home=`$defaults JENKINS_HOME` && export JENKINS_HOME="$home" add_to_args() { val=`$defaults $1` && args="$args --${1}=${val}" } args="" add_to_args prefix add_to_args httpPort add_to_args httpListenAddress add_to_args httpsPort add_to_args httpsListenAddress add_to_args ajp13Port add_to_args ajp13ListenAddress echo "JENKINS_HOME=$JENKINS_HOME" echo "Jenkins command line for execution:" echo /usr/bin/java $javaArgs -jar "$war" $args exec /usr/bin/java $javaArgs -jar "$war" $args
- jenkins.plist の ${USER} と ${HOME} を書き換える
- ${USER}:macにログインしているユーザ名
- 例)pepettotv
- ${HOME}:そのユーザのホームディレクトリ
- 例)/Users/pepettotv
- ${USER}:macにログインしているユーザ名
- launchd に登録する
launchctl load -wF -D user ~/Library/LaunchAgents/jenkins.plist
launchctl start jenkins
これで、自動起動でログインユーザでjenkinsが動くようになりました。
ビルド設定
プラグイン
Jenkins の管理 -> プラグインの管理から以下をインストール。他のも入れたけど、今回必要最低なのは以下かな。
- Jenkins GIT plugin : git使う上で必須
- Jenkins Sounds plugin : ビルド結果を音で通知。今回は必須
- Jenkins Websocket Notifier : websocket使ってリアルタイム通知
音だけの通知だと、音出せないor出してない場合もあるし、メール通知もメールがたまる、、、という場合、Websocket Notifierがおすすめ!
jenkins設定
jenkinsの設定 -> システム設定で
- Git インストール済みGit をぽちってGitの設定。gitのパスは以下で調査
-
where git
- 例) /usr/bin/git
-
- Jenkins Location
- System Admin e-mail address に管理者用アドレス登録
- Websocket Notifier
- Portに8081を設定
Jenkins Sounds
Jenkins Sounds plugin を入れた後、jenkinsのメニューに現れる項目Soundsをクリック
- Sound archive location に事前に用意しておいたの音素材.zip を指定
- 1つのディレクトリに音素材を入れてzipにする
- サブディレクトリ禁止
- 例)file:/Users/papettoTV/.jenkins/my_sound/jenkins_my_sound.zip
- 音ファイルはAIFF, AU, WAV対応らしいので、mp3なんかは、この辺を参考にitunesでwavにでも変換
- Jenkinsのメニュー、Soundsで音の再生確認可能。音が出ないときはここで確認
job作成
- jobをアプリのプロジェクト名で登録
- フリースタイル・プロジェクトのビルドを選択
jobの設定
設定 -> ソースコード管理システム
- Git を選択
- 名前は適当でよくて、Repository URL にローカルの.gitへのディレクトリ指定
- ハマったポイント ここで jenkins実行ユーザが.gitリポジトリを読めない(gitが実行できない?)と、いくらちゃんとしてしても以下のエラー
Failed to connect to repository : Command /usr/bin/git ls-remote -h /path/to/repo/.git HEAD returned status code 128:— パペットTVさん (@papettoTV) 2013年3月7日
で、結局これを解決させるために、jenkinsを最初に書いた方法で再インストールしました。。。
- シェルの実行
- cd /path/to/project/
./cakephp/app/Console/cake test app All –log-junit=$WORKSPACE/unittest.xml
- cd /path/to/project/
Allというtestcaseを実行し、結果をjenkinsの環境変数$WORKSPACEディレクトリのunittest.xmlに生成しております。
ハマったポイント
ここで、cakephpのユニットテスト結果をutnittest.xmlに書き出しているのですが、上記参考本の通りだと、$WORKSPACEではない場所を指定しており、以下の設定時またはビルド後、unittest.xmlがない!と言われます。
ビルド後の処理追加
以下をビルド後の処理として追加していく
■JUnitテスト結果の集計
phpunitの結果は、JUnitとフォーマットが同じらしいので、
- *.xml としておけば、xmlファイルをなめてくれるっぽい
- ちゃんと指定してもいいかとunittest.xmlって
で、phpunitの結果をjenkinsが食ってくれます。
■Jenkins Sounds
- On build result : ビルド結果
- For previous build result : 前のビルド結果
- マウスオーバーで省略内容が見れます
- Play sound : 音の選択
■Websocket Notifier
選択するだけで、適用されます。
- chrome使ってる場合拡張があるので入れる
- その他こんなhtmlを用意すれば、確認可能
<html> <body bgcolor="red" id="bg"> <script> var elem = document.getElementById('bg'); var ws = new WebSocket('ws://localhost:8081/jenkins'); ws.onmessage = function(msg) { eval('var obj = ' + msg.data); if(obj.result == 'SUCCESS'){ elem.bgColor = 'green'; }else{ elem.bgColor = 'red'; } }; </script> </body> </html>
.htmlとして保存して開くと、最初は背景赤ですが、ビルドが成功すると、push通知を受け取って、背景緑になります。
手動でビルド
ビルド実行をクリックしてみて、
- ビルド結果が見れた
- notification でた
- 音なった
ならOK!
notificationでない場合
さっき言った/jenkinsが抜けてないとか?見てみる。chromeのjenkinsアイコンを右クリック -> ポップアップを検証 でエラーがあれば何かでます。
音がならない場合
- jenkinsの Sounds から、実際に音を鳴るか確認
- jobsの設定 -> Jenkins Sounds に選んだ音が選択されてるか確認
- 再生できない音だと、選んで保存しても、再度設定開くと未選択になってます
- ハマったポイント レベルアップ.wav というファイル名だと、テスト実行では音がなるが、選択、保存しても、未選択になったので、level_up.wav にリネームしてみたらいけました
git commit でビルド
これでようやくjenkins側はOK。git側は簡単で.git/hooks/post-commit に実行権限つけて、jenkinsの「ビルド実行」リンクを叩くだけです。
post-commitの中身
wget "http://localhost:8080/job/(job名)/build?delay=0sec"
実行権限
テスト結果自動通知
これで何か適当なcommitを叩く
で、OK!
はい、もちろん成功時には某RPGのレベルアップの音を設定済みですよね!テンションあがります!!
エンジョイ、CIライフ!!
まだやりたい事
jenkinsにやらせたいのは、
- デプロイ
- 結合テスト
この辺また機会をみてチャレンジしたい!