初めての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にやらせたいのは、

  • デプロイ

  • 結合テスト

この辺また機会をみてチャレンジしたい!