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 はまだ開発途中で、対応していないコントロールも多数あります。
あまり実用的なツールとは言い難いですが、技術的に面白いことができたので今回リリースしました。

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

2014年3月17日月曜日

勉強会勉強会から1年経過して

さて、勉強会勉強会から1年以上経ちましたが、いかがお過ごしでしょうか?
私は去年はあまり対外的な活動が出来ませんでした。

というのも、去年は入籍・結婚でプライベートが忙しく、また仕事も大変忙しかったからです。イイワケ

このブログを見に来る方の殆どが技術情報が目当てだと思いますし、私もそのつもり書いています。
でも、たまにこのような雑記も書いたりするわけですが、大してページビューもありませんし、今回は私の気が済むまで言い訳にイイワケイイワケを重ねて、スッキリしたいと思います。

あれはどうなった?

あれはまだデキテナイ。
ブログを見れば分かると思いますが、Jenkins の(社外)勉強会を開催したいと言ったものの実現できてないです。
まぁ、それも去年忙しかったからショーガナイ。 イイワケ

忙しい忙しい言ってても芸がナイので、もう1つ理由をあげると、
「Jenkins に対するモチベーションが下がった」ってのがあります。イイワケ
Jenkins に関わる勉強会を!と言っていたのに、です。

なぜモチベーションが下がったのか
自分で(調べて)解決できることが増えたから
Jenkins を使い始めて3年以上経ちました。色々とノウハウが貯まってきて、多少の問題は自分で調べて解決できるようになりました。
なので、「他の人はどう対処しているのだろう?」という疑問が薄れてしまいました。イイワケ
もちろん、自分のやり方がベストだとは思ってません。機会があれば、他の人の運用とか聞きたいです。

安定化・規模拡大
2つ目は、仕事/プライベート含めて Jenkins が安定化したため、昔ほどプラグインを試したり、ジョブの設定を弄ったりする必要がなくなりました。(ジョブは安定してなくて赤かったり、黄色かったりしますが…)
また、規模が大きくなったため Jenkins を再起動させたり、プラグイン更新(でバグを踏まないように)したり、弄くるのがちょっと大変になってきました。
これらのことから、現状維持に意識が傾いてしまいました。イイワケ

(自分にとって)自由な Jenkins でなくなった
3つ目です。
Jenkins の管理者は私一人ではないのですが、
知らん間にプラグインがアンインストールされてることが何回かありまして・・・
まぁ、やる気がなくなりました。イイワケ

今は Jenkins がチームに浸透してますし、プログラマー集団なので Groovy とかも見れば直ぐ理解してメンテナンスできると思いますし、ビルドスクリプトは既に個々が書いてます。
なので、もう自分がいなくても大丈夫だな~って感じで、嬉しさはありますが・・・

それからどうするのか
ふー…スッキリ(^o^
とはいえ、このまま何もしないのも・・・と、思ってはいます。
社外勉強会を自社で・・・という思いもあります。
それが Jenkins なのかは分かりませんし、実際やるのは3年先かもしれません。マエ イイワケ

あと、この一年何もしてなかったわけではナイです!

以前からやっていた社内勉強会のスケールが大きくなりました。
これまでは課で行っていたものを社内全体の勉強会として開催できました。
それも定着してきていて着々と回を重ねています。これは私だけの功績ではなく協力者の方々のおかげだと思ってます。あとは、勉強会を開く・参加するということを会社が評価してくれているので、そこも定着した理由の1つかと。

というわけで、社内向けにはそれなりに活動していました。してたんです!イイワケ
今後は、このブログ以外で外に向けて発信していけたらと思います。
(できることからコツコツと…)

最後に
最後にですが、勉強会勉強会は今年もやるようです。
勉強会勉強会 〜君がッ 参加するまで 勉強会をやめないッ!〜 - DevLOVE関西 | Doorkeeper
興味のある方は行ってみてはどうでしょうか?(既に満席のようですが・・・)

2014年3月11日火曜日

[Jenkins] 拡張メールプラグインのテンプレートを確認する

Email-ext plugin 2.30.2 (May 23, 2013) で Email Template Testing という機能が追加されました。

この機能は Groovy または Jelly で書かれたテンプレートを Jenkins の UI 上で確認できる機能です。

使い方
Email Template testing は拡張メールプラグインを有効にしているジョブの各ページにリンクがありますので、そこをクリックして開きます。

開くとファイル名の指定とターゲットとなるビルド結果の選択コンボボックスがあるので、それぞれ設定し「Go!」ボタンを押すだけです。

試しに、Wiki のサンプル(groovy-html.template)を使うと以下のように表示されます。


メール通知の改善が捗りそうですね^^

2014年3月4日火曜日

[Jenkins] 長いプロジェクト名の改行がされず横長に表示される場合の回避策

Jenkins を更新したら、<wbr> が挿入されるようになりました。その影響か、IE でビルド実行状態のところが横に間延びするようになってしまいました。
style.css を弄って調整したので、その備忘録。

style.css は ${JENKINS_HOME}/war/css にあります。
適当なところに以下を挿入します。

.pane wbr {
  display: none;
}

td.pane {
  word-break: break-all;
}

2014年3月3日月曜日

C++03 からでも始められる C++11

はじめに
ちょっと表題がわかりにくいですが、ようは C++11 の使えない環境でも C++11 使っていこうよ、という話です。が、nullptr とか STL とかそういう話ではないです。

私は個人的なプログラムは Visual Studio 2012/2013 を使って書くことが多いです。
なので、C++11 使えます。(VC++ は C++ Compiler に非ず!とか、C++11 対応微妙とかいうツッコミはなしで…)
gcc も clang も使いますが、C++11 はもちろん使えます。
仕事でも Visual Studio 2012 をメインに使っているので、C++11 使えます。

ただそうでない場合もあります。
組み込み系では C++11 が使えない環境の場合があります。
冒頭で触れた nullptr や STL 相当のものは C++03 環境でも使えるので、積極的に使っていくとよいでしょう。
(boost を使うとより簡単に C++11 相当のことができるようになります。)
しかし、それには限界があって C++03 ではどうしても使えないものがあります。
そこで、少し工夫してもっと C++11 を使っていこうというのが、今回の話です。

C++11 コンパイラーを使う
C++11 コンパイラーを使うようにします!

「いや、使えないから困ってるんだけど…」

ですよねぇ…
すみません。訂正します。
C++11 コンパイラを使って"コンパイル"だけします。
ターゲットバイナリは作れませんが、コンパイルだけでも C++11 の機能が使えるようになります。

ただ単純に、コンパイラを C++11 対応のもに変えてもコンパイルエラーが出ると思います。

環境依存なものは、マクロ定義して誤魔化します。
バイナリを作るのが目的ではないので、コンパイルが通るようにダミー宣言するだけで OK です。
ライブラリは、リンクを行わないので宣言だけで済みます。なので特に何かする必要なし。

その他のエラーもマクロで誤魔化します。

コンパイルだけで得られるもの
さて、C++11 でコンパイルできたからといって動作するものが得られなければ、なんの意味もないように思えますが・・
そうでもありません。

override/final です!

override と final は継承関係に対しての検証機能ですので、コンパイルだけでも意味があります。
基底関数の引数変えたけど、派生先を変更し忘れた!なんてミスともおさらばです。

もちろんコンパイルしかできないので、開発者がローカルで常にチェックするというよりも、
Jenkins などの CI ツールを使って C++11 コンパイルを回すという使い方になると思います。

それでは、よい C++11 ライフを!
※ override/final にも使える機能がないか探しています。情報ある方は教えて下さいm(__)m