ひよっこ。

I want to…

Jenkins with VS2008 + α for C++

Posted by hikaruworld : 2011 9月 6

ちょっとVS2008でC++の開発をすることになったんですが、
リポジトリの最新をとってもしばしばビルドエラーになるので、
C++弱者の自分の為にJenkinsでビルド環境を構築してみました。

どうせなので、ドキュメント自動生成も設定してみようと思います。
ちなみにOSはVS2008のMSBuild.exeがいるのでWindows上です。

それと自分はgtestを利用しているのでユニットテスト環境もあわせて構築します。

事前準備

まずは必要な環境をインストールします。インストールの詳細は省きます。

  • VisualStudio2008 Professional (多分Expressでもいけるかと)
  • Jenkins
  • Doxygen(インストーラーから)
  • Graphvis(インストーラーから)
  • Python2.X(インストーラーから)

Jenkins以外はインストーラーでインストールを行い、パスが通っているものとします。

Jenkins上への環境構築

Jenkins上にビルド環境を構築していきます。
事前にダウンロードしたJenkinsを起動しておきます。
パスに空白が入るとDoxygenのジェネレーターがうまく動かなかったりしたので、
DHUDSON_HOMEを指定して、データが置かれるディレクトリを調整しておくとよいでしょう。

java -jar -DHUDSON_HOME=c:\Data jenkins.war

プラグインのインストール

いくつか必要なプラグインをJenkinsのプラグインマネージャーからインストールします。
今回必要なプラグインは以下の通り。

MSBuild Pluginのシステム設定

MSBuildプラグインはJenkinsの設定で実行ファイルを指定する必要があります。

name 任意。好きに設定してください
Path to MSBuild C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe

* MSBuild.exeはバージョンは他のものも大丈夫だと思います。

ジョブの作成

1. フリースタイルプロジェクトを選択します。
2. ソースコード管理システムで任意のSCMを選びチェックアウトしたいパスを入力します。自分のワークスペースはこんな感じになります。

├─sample_project                    # VS2008のプロジェクト
├─sample_project.sln                # .slnファイル
├─Doxyfile                          # Doxygenビルド用ファイル
├─Debug                             # gtestによって生成されるDebug領域(バージョン管理対象ではない)
│  └─sample_project_test.exe       # テストの実行ファイル
└─target                            # データ出力用
    ├─docs                          # Doxygenのドキュメント自動生成
    │  └─html                      # ↑のHTML出力
    ├─logs                          # ビルド時のログファイル群
    │  ├─ cpplint.log              # cpplint.pyの警告ログ
    │  └─ doxygen_warm.log         # Doxygenのログファイル
    └─test-report                   # gtestの実行結果
        └─ sample_project_test.xml
    

3. ビルドのビルド手順の追加をクリックして、Build a Visual Studio project or solution using MSBuild.を選択します
4. 以下の設定を行います。

MsBuild Build File 任意の.slnのファイルをチェックアウトしたパスからの相対パスで指定します。
Command Line Arguments /p:Configuration=Debug

* コマンドライン引数ではとりあえずデバッグモードでビルドするようにしています。

ここまで設定したら、ジョブを実行してみます。
問題なければ正常に実行されSUCCESSになるはずです。

ユニットテストの実行

自分はGoogleTestを利用しているので、テスト結果をJUnitのXML形式に吐き出して、Jenkinsに読み込ませます。
GoogleTestはTESTマクロで始まる関数をまとめてXXX.exeにまとめるので、実際はビルド手順の追加でexeを叩くだけです。
–gtest_output=xmlを引数に指定してやると、JUnit形式でXMLレポートを出力してくれるのでそれを利用します。
自分の環境だとこんな感じになります。

"%WORKSPACE%/Debug/sample_project_test.exe" --gtest_output=xml:"%WORKSPACE%/target/test-report/"


あとはJenkinsのビルドの設定でJUnitテスト結果の集計に出力したXMLファイルを指定しておきます。

target/test-report/*.xml

注意事項

特に明記していませんが、これは事前にVS2008上でgtestの環境が整っていることが前提になります。
VS2008上でのgtestの設定に関しては、TODO あとで書きます。

ドキュメント生成

C++でソースコードからのドキュメンテーション生成にはDoxygenというのが使えるようです。
冒頭にインストールしたDoxygenを使ってドキュメントの生成も自動化しておきます。
なお、Doxygenと一緒にGraphvisをインストールしておくと色々幸せになれるのでついでにやっておきましょう。

注意事項

Doxygenプラグインというのがありますが、これは、Doxygenを実行するコマンドではなく、
Doxygenの設定を読み取ってドキュメントルートを探すためのプラグインです。
勝手に生成してくれないので、doxygenはビルド手順を自力で追加する必要があります。

# エラーわかりづらいお。

自分の構成だと、.slnと同レベルにDoxyfileをおいているので設定はこんな感じになります。
Publish Doxygenを有効化してDoxyfileを設定します。
ビルドの追加で以下のWindowsコマンドを追加します。

cd %WORKSPACE%
"C:/Program Files/doxygen/bin/doxygen"


# envプラグインあたりでパスを通した方が楽ですよ。

なお、Doxygenを実行したときにwarningのlogをはいてくれる(ドキュメントないとか)んですが、
これも任意の場所に出力しておきましょう。

#Doxyfileの設定を抜粋

WARN_FORMAT            = "$file:$line: $text"

WARN_LOGFILE           = target/logs/doxygen_warm.log

ちなみに言い忘れましたが、Doxyfileはコマンドライン上で、

doxygen -g

とコマンドを実行することで、Doxyfileがカレントで作成されます。
デフォルトで利用しても構いませんし、設定ファイルを任意にいじってもよいかと思います。
ちなみに自分はこんな感じ(TODO あとでリンクを張る)にしています。

コードフォーマットの設定

GoogleさんがPythonで書かれたコードフォーマットチェックのスクリプトを公開してくれているので、
それをビルド時に実行するように設定します。

なお、Python必須です。自分は2.7の環境で正常に動くことを確認しています。

チェックスクリプトのダウンロード&パッチをあてる

cpplint.pyという名前のファイルがそれなので、チェックアウトします。
既存のcpplint.pyは自分の使い方が悪いせいかもしれませんが、ディレクトリを再帰的に検索してくれないので、ソースを修正します。
また、このまま実行すると警告が1つでも存在するとエラー扱いになってしまうので、とりあえず正常終了扱いに変更します。

--- cpplint.py	2011-09-05 10:39:36.184646400 +0900
+++ cpplintdir.py	2011-09-05 15:36:08.693797100 +0900
@@ -3105,7 +3105,7 @@
 
 
 def main():
-  filenames = ParseArguments(sys.argv[1:])
+  baseDirName = ParseArguments(sys.argv[1:])
 
   # Change stderr to write with replacement characters so we don't die
   # if we try to print something containing non-ASCII characters.
@@ -3115,12 +3115,12 @@
                                          'replace')
 
   _cpplint_state.ResetErrorCounts()
-  for filename in filenames:
-    ProcessFile(filename, _cpplint_state.verbose_level)
+  for root, dirs, files in os.walk(baseDirName[0]): 
+    for fname in files:
+      ProcessFile(os.path.join(root, fname), _cpplint_state.verbose_level)
   _cpplint_state.PrintErrorCounts()
 
-  sys.exit(_cpplint_state.error_count > 0)
-
+  sys.exit(0)
 
 if __name__ == '__main__':
   main()

Windowsバッチコマンドの実行

cpplintdir.py(cpplint.pyにパッチをあてたものです)を実行します。
なお、警告は標準エラー出力に流れるので、ファイルに書き出しておきます。

cd %WORKSPACE%
C:/Python27/python.exe C:/programs/cpplintdir.py ./sample_porject 2> target/cpplint.log

データ集計

コンパイラの警告の集計をチェックして、ログからデータ集計を行います。
これを行うことで、各種ビルドや実行時のログから警告情報を統計して表示できるようになります。

ビルドの警告

コンソールログをスキャンするでParserにMSBuildを選択します。
これでMSBuildによって実行されたC++のビルドログの警告やエラーを集計することが可能になります。

Doxygen生成の警告

Scan workspace filesで、集計するファイルにtarget/doxygen_warm.logを指定し、ParserにDoxygenを指定します。
Doxygenは不適切なコメントや存在しないコメントがある場合にその情報をログに吐くことが可能ですので、そのログを解析する設定です。
# Doxyfileの設定による

Cpplint.pyの警告

Scan workspace filesで、集計するファイルにtarget/cpplint.logを指定し、Parserにcpplintを指定します。
これで不適切なフォーマットのチェックが可能になります。

但し、cpplintなんてParserはありません。

cpplintの警告パーサをJenkinsからはデフォルトでは提供されていないため、独自に定義する必要があります。
Jenkinsの管理=>システムの設定から、Compiler Warningsの設定を行います。
大体こんな感じです。

Name cpplint
Regular Expression ^\s*(.*):(\d+):(.*):\s*(.*)$
MappingScript
import hudson.plugins.warnings.parser.Warning

String fileName = matcher.group(1)
String lineNumber = matcher.group(2)
String category = matcher.group(4)
String message = matcher.group(3)

return new Warning(fileName, Integer.parseInt(lineNumber), "Cpplint", category, message);

基本的にはほとんどヘルプに書いてあるデフォルトのままです。
Example Log Messageに実際に出力されるログを張り付けるとどのようにパースされるか確認できます。

TODO,FIXMEの収集

未解決タスクの集計をチェックします。
集計対象に**/*.h,**/*.cppを指定します。
タスクタグに自分の環境であれば、FIXME,TODO,XXXあたりを設定しておきます。

SubversionからJenkinsへビルド通知

まじめにやってもいいんですが、面倒なので、wgetで(Subversionはlinux上にいるんです)。

wget --http-password="$AUTHOR" --http-user="$AUTHOR" --spider -o '/dev/null' 'http://localhost:8080/view/mo-local/job/sample_project/build?token=XXXX&case=commit-build'

参考にしたサイト

多謝です。

Hudson で MSBuild を動かす/a>
Guide to building .NET projects using Hudson

以上です。
とりあえずはこんなところで。
まだなにかあったら追加します。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

 
%d人のブロガーが「いいね」をつけました。