2014年3月31日月曜日

C++ が利用可能な CI ツールまとめ


最近まで CloudBees の Jenkins を使っていたのですが、Free プランの制限を超えてしまい、代わりの CI 環境をちょうど探していたので試してみました。

要件:
・C++ 対応
・無料プラン内でできることに限る
・ビルドマトリックスが組める

C++ 非対応
冒頭の記事を参考にいろいろ見てみましたが、言語サポートに C++ ないものがほとんどでした。。。


C++ 対応してないので今回は却下。
(※ といってもコンパイラさえあれば言語対応を謳ってなくても使える気がするが…)

Drone.io
Drone.io はリポジトリに設定ファイルが不要です。
設定はウェブページで行います。リポジトリにファイルを置かなくて良いのは1つのメリットですが、ビルドマトリックスが組めないため、今回は却下。

TravisCI
TravisCIは、オープンソースであれば無料で利用できます。
私も以前から利用していました。

私が思う TravisCI の利点は以下のとおりです。
gcc/clang が選べる
最新のコンパイラも使える(参考:Travis CI で最新の gcc を使って自動テスト - sorry, inumplemented:
マトリックスが組める
他サービスとの連携Coveralls, Coverity Scan, etc...)

CI ツールを探している目的の一つに「様々なコンフィグでの網羅的テストを走らせたい」というのがあり、TravisCI はそれを満たしています。ただ、今のところ TravisCI でのテストは「コンパイラごとのテスト」「他サービスとの連携」での利用が主な目的になってます。なるべく1回のビルドを短くしたいので、今回はマトリックスを組まないことにしました。

OpenShift
そこで最後に紹介するのが、OpenShift です。
OpenShift は Red Hat が提供する PaaS(Platform as a Service) で、無料プランでも Jenkins サーバーを作れます。
というわけで、ここでマトリックスを組むことにしました。
OpenShift については説明を省きます。ググってみてください。

さて、結局 Jenkins に戻ってきたわけですが、CloudBees と比べて見た感じ。
ビルドが遅い
時間制限はなし
並列ビルドが可能?

時間制限がない点は良いのですが、ビルドが非常に遅いです。
下の画像は、8x5 のマトリックスジョブの所要時間です。左が OpenShift 、右が CloudBees です。

小さくて見難いと思いますが(クリックで拡大されます)、OpenShift は 11時間、CloudBees は 12分です。
ものすごく差がありますが、実は CloudBees のはです。どういう計算でこの時間になっているのかわかりませんが、実際は数時間かかっています。(3分弱 x 8 x 5)(制限時間の消費が減るので嬉しいですが…)
しかし、それでも CloudBees のほうが速いのは変わりません。

あと、OpenShift では同時ビルド数を任意の数に設定できますが、私が試した感じだとうまくテストが回りませんでした。(リソース不足?)

OpenShift の Jenkins は「Jenkins 自体に特に制限はないが、動作環境が低スペックであるためできないこともある」という感じでした。CloudBees と比べると性能が劣りますが、私が使う分には問題ないのでこちらを使うことにしました。(テストがトータルで16時間かかるが、1日2回以上コミットすることはないので問題なし)

ちなみに、OpenShift の Jenkins ですがデフォルトだとプラグインの追加・更新ができないように見えますが、
「プラグインの管理」→「高度な設定」の「アップデートサイト」の URL を http:// から https:// に変更すると更新できるようになります。ハマりどころなので、これから使おうという方は覚えておくといいです。
参考:unable to install plugins on Jenkins instance in openshift - Stack Overflow

最後に
最終的には、TravisCI + OPENSHIFT に落ち着きましたが、これは私の利用目的から選んだ結果なので、これが一番イイというわけではありません。
利用目的にあったツールを選ぶのが一番だと思います。

2014年3月24日月曜日

iutest v1.8.1 をリリースしました。

iutest v1.8.1 をリリースしました。
今回は v1.8.0 に対するバグ修正バージョンです。変更点は以下のとおりです。

  • 修正
    • SetUp/SetUpTestCase での SKIP/ASSUME に対応
    • MAC OS 判定、ビルドエラー修正(thanks to mogemimi for the pull request)
    • --iutest_filter で : 区切りの複数条件指定が正しく動作しない不具合を修正
    • --iutest_list_tests_with_where で値のパラメータも出力するように修正
    • バグ修正

修正
SetUp/SetUpTestCase での SKIP/ASSUME に対応
これまで SetUp/SetUpTestCase で SKIP や ASSUME でテストがスキップされても、以降のテスト本体が実行されてしまっていたのを適切にスキップするように修正しました。

MAC OS 判定、ビルドエラー修正
初 pull request !!
嬉しいです^^
ありがとうございます!!

--iutest_filter で : 区切りの複数条件指定が正しく動作しない不具合を修正
--iutest_filter コマンドラインオプションには複数の条件を指定できます。
--iutest_filter=*Test*:*Hoge* の場合、条件は「*Test* または *Hoge* にマッチするテスト」になります。
これが正しく動作しておらず、複数条件を指定した場合、条件に関係なくすべてのテストにマッチしてしまっていた不具合を修正しました。

--iutest_list_tests_with_where で値のパラメータも出力するように修正
--iutest_list_tests_with_where は --iutest_list で出力されるテスト名の一覧に加えて、パラメータの情報も出力するオプションです。これが型付けテストの型を出力はしていたのですが、値のパラメータを出力するのを忘れていました。

最後に
上記変更点以外にも細かな修正が入っています。
また、コードカバレッジを始めてテストを補強しました。

iutest ではご意見・バグ報告などお待ちしております。
Google GroupSourceForgegithub または、このブログや twitter などでも構いません。よろしくお願います。

2014年3月18日火曜日

RCSharp をリリースしました

RCSharp v0.1 をリリースしました。

RCSharp とは?
C# の実行ファイルからリソースを抽出し、Visual C++ で利用可能な .rc ファイルを出力するツール。
主に、Visual Sutdio の Express 利用者向けのツールです。

Visual Studio Express Edition では、.rc ファイルをリソースエディタで編集できないため、テキスト編集する必要があります。これはちょっとメンドクサイですよね。

C# なら、Express Edition でもグラフィカルに UI を編集できます。なので、これを利用してやろうじゃないかと思って RCSharp を作りました。(あとは C# の勉強がてら)

使い方
1. C#プロジェクトでデザイン
まずは、もととなるリソースを C# のプロジェクトで作成します。
適当にプロジェクトを作成し、フォームを編集してください。

編集できたらコンパイルして .exe ファイルを出力します。ここでは TestForm.exe とします。

2. RCSharp を使って変換
次に、rcsharp を使って変換します。
先ほど作成した TestForm.exe を rcsharp.exe に D&D すると、TestForm.exe のあるディレクトリに
TestForm.rc と TestForm_resource.h が出力されます。また、リソースに含まれる画像も出力されます。
変換は以上です。

出力先はコマンドライン引数で変更可能です。また、リソースIDの指定もできるようになっています。
options
-o<output_directory>    : Specifies the output directory.
-rh<filename>           : Specifies the output resource.h filename.
-idd<number>            : First IDD(IDR, IDI, IDB) Number.
-idc<number>            : First IDC Number.
-ids<number>            : First IDS Number.
-idm<number>            : First IDM Number.

3. 出力されたファイルを使ってビルド
最後に、rcsharp から出力したリソースを使って Visual C++ プロジェクトをビルドします。
TestForm はこのようになりました。


※ タブコントロールの中身は未対応
※ テキストコントロールのデフォルト文字列も未対応
※ その他いろいろ未対応

既知の不具合
不具合というか気をつけなければいけないことで、リッチテキストがある場合に LoadLibrary("riched20.dll") を呼ぶ必要があります。
今後のバージョンアップで初期化コードの自動生成などにも対応したいとは思っていますが、
現状はリソース以外のコード生成はできませんのでご注意ください。

最後に
世の中には、.rc ファイルをグラフィカルに直接編集できるフリーソフトもあります。
RCSharp はまだ開発途中で、対応していないコントロールも多数あります。
あまり実用的なツールとは言い難いですが、技術的に面白いことができたので今回リリースしました。

今後は、対応コントロールを増やしたり、できたらイベントやデフォルト設定なども自動生成できるようにしてみたいです。