CruiseControl.rb で、rcov の結果を表示する

AP4R の開発では、ccrb を利用して WindowsLinux など、複数プラットフォーム上にて自動テストを行うようにしています。
rubyforge.org の SVN にコミットするとテストが流れ、(まだまだ十分ではないですが) 動作の確認が逐次とれるので、ある程度安心して開発を進めることができています。


より安心できるようにするためには、もっとテストを書くのがいいのですが、その多少のはげみになるようカバレッジ率を表示させてみました。

rake タスクでカバレッジのレポートを生成し、その HTML を公開すればいいわけですが、ccrb で手軽に設定できたので備忘もかねて up しておきます


環境は以下のとおりです。(rspec がちょい古いかも?)

CruiseControl.rb のサイトをみると、ドキュメントのなかに次のように書かれていました。

  • What should I do with custom build artifacts?

http://cruisecontrolrb.thoughtworks.com/documentation/manual

your_project may have a special build task, producing some output that you want to keep, and see on the build page.

Before running the build, CC.rb sets OS variable CC_BUILD_ARTIFACTS to the directory where the build artifacts are collected. Make sure that your special task writes its output to that directory, or a subdirectory under that directory.
The build page includes links to every file or subdirectory found in the build artifacts directory."


ビルド実行時に、環境変数 CC_BUILD_ARTIFACTS に適当な値がセットされているようなので、この変数を参照して rcov の結果を出力できるようにしてみます。


以下は、AP4R の spec タスクの拡張ですが、t.rcov_dir への指定でレポートの出力先を変えています。
(t.rcov_opts のところで、オプションから出力先のディレクトリを指定しても効きませんでした。)

require 'spec/rake/spectask'

namespace :spec do
  %w(local).each do |flavor|
    desc "Run #{flavor} examples"
    Spec::Rake::SpecTask.new(flavor) do |t|
      t.spec_files = FileList["spec/#{flavor}/**/*.rb"]
    end

    namespace :coverage do
      desc "Run #{flavor} examples with RCov"
      Spec::Rake::SpecTask.new(flavor) do |t|
        t.spec_files = FileList["spec/#{flavor}/**/*.rb"]
        t.rcov = true
        build_artifacts = ENV['CC_BUILD_ARTIFACTS']
        t.rcov_dir = build_artifacts.nil? ? "coverage" : "#{build_artifacts}"
        excludes = %w(^spec\/)        if ENV['GEM_HOME']
          excludes << Regexp.escape(ENV['GEM_HOME'])
        end
        if ENV['RUBY_HOME']
          excludes << Regexp.escape(ENV['RUBY_HOME'])
        end
        t.rcov_opts = ["--exclude", excludes.join(","),
                       "--text-summary"]
      end
    end
  end
end


で、この rake タスクを ccrb が実行してくれるよう設定ファイル、cuise_config.rbを修正します。
デフォルトの設定では test タスクが呼ばれているはずです。

# Build the project by invoking rake task 'custom'
-  # project.rake_task = 'custom'
+  project.rake_task = 'spec:coverage:local'


このようにした上でビルドを実行すると、通常、ビルドごとに build.log, changeset.log, cruise_config.rb が格納されるディレクトリに rcov の結果もはいってきます。
以下のような感じです。

% pwd
/var/ccrb/projects/ap4r-core/build-386.1-success.in17s
% ls -l
合計 516
-rw-rw-rw- 1 cruise cruise 27278 2008-02-07 14:41 index.html
-rw-rw-rw- 1 cruise cruise 23583 2008-02-07 14:41 lib-ap4r-carrier_rb.html
-rw-rw-rw- 1 cruise cruise 45244 2008-02-07 14:41 lib-ap4r-dispatcher_rb.html
-rw-rw-rw- 1 cruise cruise 28786 2008-02-07 14:41 lib-ap4r-message_builder_rb.html
-rw-rw-rw- 1 cruise cruise 61721 2008-02-07 14:41 lib-ap4r-message_store_ext_rb.html
-rw-rw-rw- 1 cruise cruise 39521 2008-02-07 14:41 lib-ap4r-mongrel_rb.html
-rw-rw-rw- 1 cruise cruise 17398 2008-02-07 14:41 lib-ap4r-multi_queue_rb.html
-rw-rw-rw- 1 cruise cruise 19335 2008-02-07 14:41 lib-ap4r-queue_manager_ext_debug_rb.html
-rw-rw-rw- 1 cruise cruise 25951 2008-02-07 14:41 lib-ap4r-queue_manager_ext_rb.html
-rw-rw-rw- 1 cruise cruise 13868 2008-02-07 14:41 lib-ap4r-reliable_msg_queue_rb.html
-rw-rw-rw- 1 cruise cruise 13868 2008-02-07 14:41 lib-ap4r-reliable_msg_topic_rb.html
-rw-rw-rw- 1 cruise cruise 18871 2008-02-07 14:41 lib-ap4r-retention_history_rb.html
-rw-rw-rw- 1 cruise cruise 25282 2008-02-07 14:41 lib-ap4r-store_and_forward_rb.html
-rw-rw-rw- 1 cruise cruise 32078 2008-02-07 14:41 lib-ap4r-stored_message_rb.html
-rw-rw-rw- 1 cruise cruise 14676 2008-02-07 14:41 lib-ap4r-version_rb.html
-rw-rw-rw- 1 cruise cruise 14943 2008-02-07 14:41 lib-ap4r_rb.html
...


すると、ccrb の Web画面でビルドの結果を開いたときに、"Custom Build Artifacts" なる項目があらわれて、ここに表示される index.html を選択すると rcov の結果一覧が見れます。


#画面のキャプチャ、あとで載せる。


テストのカバレッジ状況が見えると、やはりテストを書かねばって気になりますね。