2016年4月25日月曜日

SideCI 始めました

SideCI は他の CI サービスと異なり、コードレビューを自動化するコードレビュー支援サービスです。
ついこの間、資金調達のニュースが出てましたね。
そして、βから正式版になりました。
SideCIは2016年4月より「正式版」になります - SideCI Blog


実は前々から知ってはいたのですが、対応している言語に C++ がないので敬遠してました。
ただ、1回使い勝手とかを知っておきたいと思ったので、今回試しに使ってみました。

iutest で試す
iutest は C++ Testing Framework です。
SideCI は C++ 対応してないので、C++ のコードレビューはできませんが、iutest には Python ツールもあるので、そちらをレビューするようにしました。
ちなみに、オープンソースであれば SideCI は無料で利用できます。 料金プラン

まずは、サインアップしたらリポジトリ登録をします。
登録までは4ステップ。

1. アカウントの選択

2. リポジトリの選択

3. 解析ツールの選択

4. 完了


これで登録が完了しました。
ただ、これだけではまだ解析はされません。
SideCI は Pull Request があったときに解析される仕組みです。それ以外はマニュアル実行する必要がありますので、とりあえずそれで試してみましょう。

iutest での flake8 の結果。


感想
  • Manual 実行する必要がある(Pull Request は自動っぽいけど)
    push したときも自動で解析かけてほしい。(コメントはいらない)
  • 項目が見やすくなっているのは良い

    iutest は Codeship で Cpplint をかけてますが、ログ出力を見るよりも見やすくて良いと思いました。
  • C++ 対応して欲しい
    Cpplint にも対応して欲しいです。
    ブログズミ: cpplint でコーディングチェック
  • Badge はないのかな?
あとは、気になる挙動がちらほら…

記事書くために、リポジトリの Disable してもう一度登録しようと思ったら、リポジトリの選択で選択しても反応しなくなってしまいました。Beta のときは iutest の登録ができていたのですが…正式リリースしてからか?それとも Disable したからか?
エラー内容は「Uncaught TypeError: Cannot read property 'toLowerCase' of null」
(Python で書いてるリポジトリは登録できた。アイコンが出てないリポジトリが登録できないっぽい)


他にもなんか挙動がおかしいなと思うことがあったので、本格的に使うのはまだまだ先かな…
(消えた iutest プロジェクトがなぜか見えたり、他のリポジトリを有効にすると見えなくなったり…よくわからん…)

なにんせよ、 Cpplint が欲しいです。

あと、SideCI は国産なのが特徴の1つです。
とりあえず、お問い合わせしてみようと思います。
ではでは。

2016/04/26 追記:
対応していただきました。現在は登録できます。
ただし、一度 Disable にしたリポジトリは別のエラーが出てダメでした。
2016/04/27 追記:
C++ のリポジトリでエラーになっていたようでした。
こちらもご対応頂いたので、現在は問題なく登録できると思います。
SideCI チームの方々ご対応ありがとうございましたm(__)m

2016年4月18日月曜日

[Jenkins] 複数ある上流ジョブの成果物を使う

Jenkins での成果物コピーには Copy Airtifact Plugin を使うことが多いと思います。
Copy Airtifact Plugin は、指定のジョブ、指定のビルドの成果物をワークスペースにコピーするプラグインです。

今回は、以下のようなパイプラインがあったとき、下流ジョブ(TEST)が上流ジョブ(BUILD_DEBUG or BUILD_RELEASE)から成果物をコピーして利用したいケースを考えます。

TEST は BUILD_DEBUG,BUILD_RELEASE のどちらからも流れてきます。
そして TEST ジョブではそれぞれ上流の成果物を利用するとします。

通常、成果物のコピーをする場合、Copy Airtifact Plugin を使うと思いますが、
不特定のジョブからコピーを行う場合も、このプラグインを使います。


まず、コピー元のジョブ名には環境変数を使えます。
2017/2/9 追記
執筆時は、ビルドパラメーターへの設定は必須ではありませんでしたが、現在はここで設定する変数をビルドパラメーターとしておく必要があるようです。

ここでは、ARTIFACT_JOB としました。
この ARTIFACT_JOB を上流ジョブ名にするために、Parameterized Trigger Plugin を使ってジョブ名をパラメータとして引き渡します。
(同様に、ビルド番号も環境変数 ARTIFACT_NUMBER に設定し、上流ジョブから受け取るようにしています。)


設定としては、「Predefined parameters」に
AIRTIFACT_JOB=$JOB_NAME
AIRTIFACT_NUMBER=$BUILD_NUMBER
として引き渡します。

もう1つ重要な設定があります。
コピー元のジョブ名に環境変数を使用した場合、コピー元のジョブからコピーの許可を得る必要があります。
コピー元のジョブの設定に「成果物のコピーの許可」がありますので、コピー先のジョブ名を入力してください。


設定は以上で完了です。
実際に動かしてみましょう。

動作結果
BUILD_DEBUG から実行した場合



BUILD_RELEASE から実行した場合



このように BUILD_DEBUG から debug.txt、BUILD_RELEASE から log.txt が利用されるようになりました。
処理する内容は同じで、対象だけが異なる場合に役立つと思います。
(※ マトリックスを組む手もあります)

今回は以上です。

2016年4月11日月曜日

[C++] Include-What-You-Use で依存関係を確認する

ブログズミ: [C/C++][Clang] include 解析ツールを作った
ちょっと前に clang で include 依存関係解析を書きましたが、最終的にやりたいことができるツールが既にあったので使ってみました。

Include-What-You-Use
ツールは Include-What-You-Use といいます。
こちらの存在は以下の記事を見て知りました。
Include-What-You-Use も clang の AST を利用して解析しているそうです。

ホームページのダウンロードリンクに Windows バイナリがあったので、今回はこれを使いました。
Downloads

また、使用方法は Github のドキュメントを参照。
How to Run
CXX を include-what-you-use にしてビルドすれば良いようです。

iutest で試した結果がこちら。
$ make CXX=include-what-you-use sample
include-what-you-use -I../../include -g -Wall -Wextra -Wundef    -c ../../samples/main.cpp
In file included from ../../samples/main.cpp:24:
In file included from ../../samples/../include/iutest.hpp:23:
In file included from ../../include/iutest_core.hpp:20:
In file included from ../../include/internal/iutest_result_reporter.hpp:20:
In file included from ../../include/internal/iutest_core_impl.hpp:20:
In file included from ../../include/internal/iutest_internal.hpp:20:
In file included from ../../include/internal/../iutest_pred.hpp:20:
In file included from ../../include/iutest_assertion.hpp:20:
In file included from ../../include/iutest_result.hpp:20:
In file included from ../../include/internal/iutest_message.hpp:20:
In file included from ../../include/internal/../iutest_env.hpp:20:
In file included from ../../include/internal/iutest_charcode.hpp:20:
In file included from ../../include/internal/iutest_port.hpp:24:
In file included from ../../include/internal/iutest_internal_defs.hpp:20:
In file included from ../../include/internal/../iutest_defs.hpp:20:
../../include/internal/iutest_compiler.hpp:38:12: fatal error: 'windows.h' file not found
#  include <windows.h>
           ^

../../samples/main.cpp should add these lines:
#include <vcruntime_new.h>                     // for operator new
#include "internal/../impl/../iutest_env.hpp"  // for Environment
#include "iutest_config.hpp"                   // for IUTEST_HAS_LIB
#include "util/iutest_util_output.hpp"         // for Console

../../samples/main.cpp should remove these lines:
- #include <iostream>  // lines 50-50

The full include-list for ../../samples/main.cpp:
#include <vcruntime_new.h>                     // for operator new
#include "../include/iutest.hpp"               // for AddGlobalTestEnvironment
#include "internal/../impl/../iutest_env.hpp"  // for Environment
#include "iutest_config.hpp"                   // for IUTEST_HAS_LIB
#include "util/iutest_util_output.hpp"         // for Console
---
Makefile:104: ターゲット 'main.o' のレシピで失敗しました
make: *** [main.o] エラー 7

Windows バイナリを使っているため、Windows sdk のパスを通さないといけません。
が、とりあえず sample.cpp に不要な iostream の include があるのがわかったので修正しました。

Visual Studio でできないか?
Visual Studio の拡張機能でないかなーと見ましたが、今現在はないもよう。
Clang for Windows があるし、このへんも対応してくれるとうれしいなーと思いました。
(※ なんとかできないか調査中)

2016/4/14 追記
include-what-you-use-cl を公開しました。
こちらは Visual Studio のプラットフォームツールセットとして、Include-What-You-Use を使えるようにするツールです。

git clone して install.bat を実行するとインストールされます。
別途、Include-What-You-Use.exe へのパスを通しておく必要があります。

インストールすると、プラットフォームツールセットに Include-What-You-Use の選択肢が出ます。

ビルドすると以下のように結果が出ます。


(※エラー出るかもしれませんが、依存関係の解析はできてるはず。)
(※なんでツールセットなのかは、ツールセットの定義の仕方の勉強がてらです。)

追記ここまで
==============

最後に
今回は、軽く触れる程度に Include-What-You-Use を紹介させていただきました。
では、また今度。