初めての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にやらせたいのは、
- デプロイ
- 結合テスト
この辺また機会をみてチャレンジしたい!