初めてのjenkins、commitしたらテスト結果に音を出すまでの道のり

2013/03/08

初めての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
  • 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が実行できない?)と、いくらちゃんとしてしても以下のエラー

で、結局これを解決させるために、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を用意すれば、確認可能
<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"

実行権限

chmod +x post-commit

テスト結果自動通知

これで何か適当なcommitを叩く

git commit -m ‘test push notification and sound’

で、OK!
はい、もちろん成功時には某RPGのレベルアップの音を設定済みですよね!テンションあがります!!

エンジョイ、CIライフ!!

まだやりたい事

jenkinsにやらせたいのは、

  • デプロイ
  • 結合テスト

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です