Serverspec + JUnit Formatter -> Jenkins JUnit Report
各サーバーでserverspecを実行し、レポートを可視化する方法
幾つか方法あるとは思いますが今回は私は以下のようにしました。
前提
- Capistranoで各サーバー上でserverspecを実行している。 (serverspecのリモート機能は使っていない)
レポートの出力方法
RspecのJUnit 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が食べた時に、どのサーバー上で週つ力されたレポートか判別つくようになる。
* 黒塗りの所にホスト名が入ります。
download で各サーバー上に出力されたレポートファイルをCapistranoの実行元サーバーに集めてくる事が出来ます。
あとはJenkinsのJUnitの結果を収集する。 に設定を入れればOKです。