初めてのjenkins、commitしたらテスト結果に音を出すまでの道のり
初めての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 というファイルを作成。内容は以下。
EnvironmentVariables
JENKINS_HOME
${HOME}/.jenkins
GroupName
staff
KeepAlive
Label
jenkins
ProgramArguments
/bin/bash
${HOME}/bin/jenkins-runner.sh
RunAtLoad
UserName
${USER}
- ~/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
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
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使ってる場合拡張があるので入れる
ハマったポイント websocketのurlは /jenkinsが必要だった!これがないと動きませんでした。以下が設定例
- その他こんなhtmlを用意すれば、確認可能
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';
}
};
.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"
実行権限
chmod +x post-commit
テスト結果自動通知
これで何か適当なcommitを叩く
git commit -m ‘test push notification and sound’
で、OK!
はい、もちろん成功時には某RPGのレベルアップの音を設定済みですよね!テンションあがります!!
エンジョイ、CIライフ!!
まだやりたい事
jenkinsにやらせたいのは、
デプロイ
結合テスト
この辺また機会をみてチャレンジしたい!
