表題のやつ作った => 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 されないわけか。ふむ。