イフブロ

イフブロ

インフラエンジニアのブログ

Serverspec + JUnit Formatter -> Jenkins JUnit Report

各サーバーでserverspecを実行し、レポートを可視化する方法

幾つか方法あるとは思いますが今回は私は以下のようにしました。

前提
- Capistranoで各サーバー上でserverspecを実行している。 (serverspecのリモート機能は使っていない)

レポートの出力方法

RspecJUnit Formatterを利用します。
使い方は serverspecの実行結果をJUnit.xml形式で出力する が参考になります。

colorオプションが有効だと、Jenkinsが読み込めないのでこんな感じで変えています。
各サーバーから集めてくるので、ファイル名が一意になる様にホスト名を与えています。

hostname = `hostname`

~~

t.rspec_opts = "--no-color --format RspecJunitFormatter --out report/serverspec/results_#{hostname.chomp}.xml"

Jenkinsサーバーに集める

Capistranoで各サーバー上で実行したレポートファイルを集めてJenkinsのJUnitReportで食える様にします。
これで見やすくなる筈。

以下の様なタスクをCapistranoで組んで実行しています。

  desc "execute serverspec "
  task :serverspec_all do
    run_locally do
      execute :mkdir, '-p', "#{fetch(:workspace)}/reports"
    end
    on roles(:all) do | server |
      begin
        execute  "cd #{fetch :sys_app_root} && bundle exec rake CI_FLAG=true TEST_ENV_NUMBER=-#{server.hostname} spec", raise_on_non_zero_exit: false
      ensure
        report = capture "ls -1t #{fetch :sys_app_root}/report/serverspec/results_*.xml"
        download! report, "reports/"
      end
    end
  end

レポートの出力方法で定義した変数にtrueをセット。 TEST_ENV_NUMBERをセットする事でJenkinsが食べた時に、どのサーバー上で週つ力されたレポートか判別つくようになる。

f:id:umisora2:20160413135515p:plain * 黒塗りの所にホスト名が入ります。

download で各サーバー上に出力されたレポートファイルをCapistranoの実行元サーバーに集めてくる事が出来ます。

あとはJenkinsのJUnitの結果を収集する。 に設定を入れればOKです。