2012年10月29日月曜日

CCCC + Jenkins + HTML Publisher Plugin

CCCC + Jenkins」 で紹介した Publish CCCC report Plugin はちょっと残念な感じでした。
そこで、今回は HTML Publisher Plugin を使いたいと思います。

設定
まずは、HTML Publisher Plugin をインストールします。
次に、プロジェクトの設定ページを開いて「ビルド後の処理の追加」から「Publish HTML reports」を選択します。


追加ボタンを押して
「HTML directory to archive」に、CCCC の結果の出力パスを設定、
「Index page[s]」 は cccc.html (CCCC のデフォルト)に変更します。
「Report title」は好きな名前をつけてください。今回は「CCCC Report」としました。



以上で設定は完了です。

実行
実行すると、「CCCC Report」が追加されます。

ここから、CCCC の HTML を閲覧できます。


もちろん、モジュールごとの結果も閲覧できます。


これで CCCC の結果がより確認しやすくなったのではないでしょうか。

2012年10月28日日曜日

Visual Studio でよく使うショートカット

こういう記事はよくありますが、自分がよく使うショートカットをまとめてみました。

検索
Ctrl + F3選択語句を検索
F3次を検索
Shift + F3前を検索
Ctrl + Fクイック検索
Ctrl + Shift + Fフォルダを指定して検索

「フォルダを指定して検索」では、検索対象に
  • 現在のドキュメント
  • すべての開かれているドキュメント
  • ソリューション全体
  • 現在のプロジェクト
  • Visual C++ インクルード ディレクトリ
を指定できます。
検索結果は、「検索結果 1 ウィンドウ」または「検索結果 2 ウィンドウ」に出力されます。
どちらに出力するかは、ダイアログの検索結果オプションで変更できます。

移動
F12定義へ移動
Ctrl + G指定行へジャンプ
Ctrl + -戻る
Ctrl + Shift + -次に進む

戻るで以前にジャンプした場所に戻れます。かなり便利です。

コーディング
Ctrl + Spaceインテリセンスの表示
Ctrl + Jメンバの一覧
Ctrl + K, Ctrl + C選択範囲のコメント
Ctrl + K, Ctrl + U選択範囲のコメント解除
Ctrl + K, Ctrl + F選択範囲のフォーマット
Ctrl + M, Ctrl + Mアウトラインの展開/折りたたみ


※この記事は、Visual Studio 2008 を対象に書かれています。
他のバージョンでは異なる恐れがあります。

2012年10月24日水曜日

エディタ=Visual Studio な人のためのメイクファイルプロジェクト

Visual Studio にはメイクファイルプロジェクトというものがあります。

メイクファイルプロジェクトでは、ビルド/クリーン/リビルドのコマンドを設定します。
このコマンドにはユーザーが自由に処理を書けるので。
Visual Studio にはないコンパイラを使うこともでき、インテリセンスの恩恵を受けることができます。
makefile を使った例
makefile でビルドするプロジェクトを Visual Studio を使って開発する例です。

  1. まずは、プロジェクトを作成します。
    メイクファイルプロジェクトを選択し、コマンドを設定します。


    (今回は、make でビルド、make clean でクリーンできるものとします。)
  2. この状態でもすでにビルドできます。
    F7 でビルドしてみましょう。

  3. 次に、インテリセンスの恩恵を受けるためにコードをプロジェクトに追加します。
    インクルードパスが通っていないと、インテリセンスが動作しないのでパスも通します。
    (プリプロセッサの定義などもあれば設定します。)
    これでインテリセンスが機能します。

  4. ログをカスタマイズする。
    ビルドログは出力ウィンドウに表示されますが、メッセージは makefile の出したそのままのメッセージです。
    このままでは、エラーウィンドウにエラー情報が表示されませんし、ログから該当コードにジャンプもできません。
    これに対応するために、Visual Studio が認識できるフォーマットでログを出力するようにします。
    build.bat ファイルを新規作成し、以下のようにログを加工します。(一例です。)
    @echo off
    
    SET LANG=ja_JP.SJIS
    bash -c "make --no-print-directory %*" 2> build_log.txt
    if errorlevel 1 (
        sed -e "s/:\([0-9]*\):[0-9]*:/(\1):/g" build_log.txt | sed -e "s/\/cygdrive\/\([a-z]\)/\1:/g"
        del /F build_log.txt
        exit /b 1
    ) else (
        sed -e "s/:\([0-9]*\):[0-9]*:/(\1):/g" build_log.txt | sed -e "s/\/cygdrive\/\([a-z]\)/\1:/g"
        del /F build_log.txt
        exit /b 0
    )
    
    ビルドコマンドを build.bat に変更し、ビルドを実行します。
    これでエラー一覧にエラーが表示されるようになりました。


HTML でも Visual Studio
Visual Studio で HTML ファイルを開くと色付きで表示してくれます。
また、閉じてないタグや存在しないパスなど警告を表示してくれます。


これだけではつまらないので、メイクファイルプロジェクトを利用して htmllint をかけたいと思います。
(htmllint はこちらからダウンロードしました)

iutest での使用を例に説明します。
まずは、Makefile と build.bat を用意します。

Makefile:
#!/usr/bin/make 

LANG=ja_JP.SJIS
HTMLLINT_PATH=$(subst \,/, $(HTMLLINT_ROOT))

default: target

all: target lint

target: Doxyfile
    doxygen Doxyfile

lint:
    (find ../ -maxdepth 1 -type f -name "*.html" -print0 | xargs -0 perl $(HTMLLINT_PATH)/htmllint)


build.bat:
@echo off

SET PATH=c:\cygwin\bin;%PATH%
SET LANG=ja_JP.SJIS
bash -c "make --no-print-directory %*" > build_log.txt
if errorlevel 1 (
    sed -e "s/: [0-9]*:/: error:/g" build_log.txt | sed -e "s/\/cygdrive\/\([a-z]\)/\1:/g"
    del /F build_log.txt
    exit /b 1
) else (
    sed -e "s/: [0-9]*:/: error:/g" build_log.txt | sed -e "s/\/cygdrive\/\([a-z]\)/\1:/g"
    del /F build_log.txt
    exit /b 0
)

make lint
で、htmllint が実行されます。
build.bat はその出力を Visual Studio が対応している書式に変更します。

Visual Studio の設定は、ビルドコマンドに "build.bat lint" とするだけです。



実行すると以下のように結果が表示されます。
一覧から該当ファイルの行にジャンプできるので、修正がはかどります。


まとめ
このように、メイクファイルプロジェクトを使えば通常 Visual Studio では扱えないプロジェクトも管理でき、
Visual Studio IDE の機能の恩恵を受けることができます。

ここまで高価な専門ツールである Visual Studio のことを紹介してきましたが、
メイクファイルプロジェクトは Express Edition でも使用出来るのでご安心ください。


2012年10月23日火曜日

意外と知らない?Visual Studio の「必ずインクルード」プロパティ

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
 return 0;
}
Visual Studio でプリコンパイル済みヘッダーを有効にすると、
stdafx.h を最初にインクルードしないといけないのですが、
ソースファイルに書きたくない(書けない)場合の対処方法を紹介します。

設定は簡単で、
[プロジェクトのプロパティ] - [構成プロパティ] - [C/C++] - [詳細設定] - [必ず使用されるインクルードファイル]に、 stdafx.h を追加するだけです。(Visual Studio 2012)



これで、ソースには書かなくて済みます。


2012年10月18日木曜日

[Jenkins] スレーブマシンの再起動をするジョブ

Groovy postbuild plugin はとりあえずインストールしとけ
で、Groovy postbuild plugin を紹介しました。

今回は、Groovy postbuild plugin を使ってスレーブマシンの再起動する例を見つけたので紹介します。

ネタ元はこちら > https://bugreports.qt-project.org/browse/QTQAINFRA-558

以下に紹介されているコードを示します。
import hudson.slaves.OfflineCause.SimpleOfflineCause
import hudson.util.RemotingDiagnostics

/* FIXME: why cannot we import jenkins.util.NonLocalizable ? */
class OfflineMessage extends org.jvnet.localizer.Localizable {
  def message
  OfflineMessage() {
    super(null, null, [])
    def timestr = new Date().format("HH:mm dd/MM/yy z", TimeZone.getTimeZone("UTC"))
    this.message = "automated reboot at end of test at " + timestr
  }
  String toString() {
    this.message
  }
  String toString(java.util.Locale l) {
    toString()
  }
}

def computer = manager.build.getBuiltOn().toComputer()
def channel = computer.getChannel()
computer.setTemporarilyOffline(true, SimpleOfflineCause.create(new OfflineMessage()))
RemotingDiagnostics.executeGroovy( """

    if (Functions.isWindows()) {
      'shutdown /r /t 10 /c "Restarting after Jenkins test completed"'.execute()
    } else {
      "sudo reboot".execute()
    }

""", channel )

何が嬉しいか
クリーンな環境でテストをしたいと思った場合、
仮想マシンや Windows SteadyState(古い?) を使う方法があります。

そういった場合、クリーンな状態に戻すときに再起動する必要があるので、
このスクリプトを使って自動化できると助かるのではないでしょうか。
(Windows の場合 shutdown コマンドに /f オプションも付けたほうがいいかも)

本当に、Groovy postbuild plugin って便利ですね!

2012年10月12日金曜日

[Jenkins] Groovy postbuild plugin はとりあえずインストールしとけ

なぜ今まで使わなかったのか。もっと早く知っていれば、
チームメンバーからの要望に応えられてたというのに・・・
Groovy Postbuild Plugin

何が便利か
Jenkins が持っている情報の取得・変更がし放題なのです!
Jenkins をもうちょこーっとだけ便利に使いたいという場合に使えます。

例えば、このようなことに使えます。
使い方
「ビルド後の処理の追加」から Groovy postbuild を選択、
「Groovy script」に処理を書きます。

例:テストの説明にビルド時刻を設定
def tr = manager.build.getTestResultAction().getResult()
def st = tr.getSuites()
st.each { suite ->
  def cr = suite.getCases()
  cr.each { res ->
    res.description = "${manager.build.getTime()}"
  }
}

Jenkins のオブジェクトについては、
Jenkins Javadoc を参照するとわかると思います。

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





wiki に説明と使用例が載ってるのでそちらも参考にしてください。

最後に
とても万能な plugin なので、今は不要でもとりあえずインストールしておくといいと思います。
Groovy postbuild plugin 便利!

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} で行うのはうまくできませんでしたが、
イイ感じになったのではないでしょうか。

2012年10月3日水曜日

10000 ページビュー越え

10000 ページビュー突破しました。
自己満足のために始めたブログですが、見てくれる方がいるのはありがたいことです。

ちなみに、こちらがここ一ヶ月のページビューの統計

やはり平日のアクセスが多いです。
そして、こちらが記事のページビューの数(全期間)

Cppcheck のアクセスがダントツです。
Jenkins のこととかもっと書いていきたいですね。


今後も(役に立つかはわからないけれども)情報を発信していきたいと思います。