2012年10月5日金曜日

Cppcheck + Jenkins + メール通知

今回は Cppcheck の結果をメールで通知したいと思います。
※まだ試行錯誤中の記事なので間違っているとこがあるかもしれません。

email-ext plugin
まずは、下記サイトを参考に email-ext plugin を使ってみることにしました。

Jenkinsから送信されるメールをカスタマイズする
Email-ext plugin - Jenkins - Jenkins Wiki

${SCRIPT} を使用します。template は
$JENKINS_HOME\plugins\email-ext\WEB-INF\classes\hudson\plugins\emailext\templates\groovy-text.template
を参考にして書きました。

最終版がこちら
Cppcheck Result
<% 
def cppcheck = new XmlParser().parse(build.getWorkspace().getRemote() + "/cppcheck-result.xml")
cppcheck.error.each() { res -> %>
ERROR:
  <%= "${res.attribute("file")}" %> : <%= "${res.attribute("line")}" %> : <%= "${res.attribute("id")}" %> : <%= "${res.attribute("msg")}" %>
<%
} %>

<% %> で囲んだとこにスクリプトが書けるようです。ここの内容はメールには含まれないようです。
メールに表示するには <%= %> で囲むようです。

template ファイルは $JENKINS_HOME/email-templates フォルダに置く決まりになってます。
Jenkins の設定は以下のようにしました。


設定は以上で終わりです。試しに実行してみた結果がこちら。



ちゃんと警告が通知されました。

スレーブで実行したときに問題発生
ここで問題が発生しました。
上記スクリプトはマスター上で走るようで、スレーブマシンにある xml にアクセス出来ませんでした。
※解決方法募集中

仕方がないので、ビルドログに出すようにします。

ビルドログに出す
せっかく Groovy に触れたので Groovy で出力させます。意地です。

まず、Groovy 環境がないマシンで実行するためには groovy-all.jar が必要なので、
$JENKINS_HOME\war\WEB-INF\lib にあるものをコピーして使うことにします。
(この記事を書いている時点では groovy-all-1.8.5.jar がありました。)

スレーブマシンの任意の場所に、
groovy-all-1.8.5.jar と xml 解析をする cppcheck.groovy ファイルを置きます。
cppcheck.groovy は以下のように書きました。
println "*** Cppcheck Result Begin ***"
args.each {
  def cppcheck = new XmlParser().parse(it)
  cppcheck.error.each{
    println "${it.attribute("id")}: ${it.attribute("msg")}"
    println "    file = ${it.attribute("file")} "
    println "    line = ${it.attribute("line")} "
    println "----------------------------------------------"
    println " "
  }
}
println "*** Cppcheck Result End ***"

コマンドライン引数に解析対象の xml ファイルパスを受け取るようにしています。
そして、ビルドジョブの最後に cppcheck.groovy を呼び出します。
java -jar groovy-all-1.8.5.jar cppcheck.groovy cppcheck-result.xml

これでログに結果が出力されます。




再び email-ext plugin
最後に email-ext plugin で整形します。
デフォルトコンテンツを以下のように変更します。
${PROJECT_NAME}
STATUS: ${BUILD_STATUS}

*** Cppcheck Result ***
${BUILD_LOG_EXCERPT,start=".*Cppcheck Result Begin.*", end=".*Cppcheck Result End.*"}
BUILD_LOG_EXCERPT の部分以外はお好みでどうぞ。

送られてきたメールがこちらです。


email-ext plugin の ${SCRIPT} で行うのはうまくできませんでしたが、
イイ感じになったのではないでしょうか。

0 件のコメント:

コメントを投稿