表題のやつ作った => https://github.com/sonots/fluentd-plugin-ci

こんかんじのスクリプト。

# run-tests.rb
require "rubygems"

specs = Gem::Specification.find_all { |s| s.name =~ /fluent-plugin/ }

passes = specs.map do |spec|
  puts "\e[31m\e[43m\e[5mRunning tests for #{spec.name}\e[0m"

  Bundler.with_clean_env do
    system <<"EOF"
cd #{spec.full_gem_path}
echo "bundle install"
bundle install
echo "RUBYLIB=lib:test:$RUBYLIB bundle exec rake"
RUBYLIB=lib:test:$RUBYLIB bundle exec rake
EOF
  end
end

exit 1 unless passes.all?

何やっているのかというと、Gemfile に書いてある gem の中から fluent-plugin なものだけピックアップして、その gem のディレクトリに入って、bundle install && bundle exec rake を実行している。

テストは全部流すんだけど、どれか1つでも失敗したらコマンドとして最終的には失敗、ということで exit 1 している。

あとは travis でこれを流せるように、.travis.yml をこんなかんじにしただけ。

rvm:
  - 2.1
gemfile:
  - Gemfile
script: "bundle exec ruby run-tests.rb"

対象プラグインを追加したい場合は、Gemfile に追加するだけだし、最新 fluentd でテストしたい場合は git commit --allow-empty -m 'test with fluentd v0.10.47' みたいなかんじでリリースされたタイミングで空コミットしてあげれば travis さんがテストしてくれる。

ところで最初、ローカルではうまくいったんだけど、travis で bundle install が上手くいかなくて四苦八苦してた。bundle のなかで bundle する - 刺身☆ブーメランのブログ の記事を見つけて、Bundler.with_clean_env 付けるようにしたら travis でも上手くいった。BUNDLE_GEMFILE を指定したりとか、RUBYLIB を指定したりとかしても上手く行かなくて bundler のコード読み始めたりとか、そちらの記事と同じことやり始めてたから助かった。@kyanny++

追記:  Bundler.with_clean_env 付けるようにして BUNDLE_GEMFILE の指定は不要になったけどやっぱり RUBYLIB は必要だった。Bundler の環境変数じゃないので、こっちは clean されないわけか。ふむ。