diff options
Diffstat (limited to 'ci/travis.rb')
-rwxr-xr-x | ci/travis.rb | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/ci/travis.rb b/ci/travis.rb new file mode 100755 index 0000000000..8087c72f90 --- /dev/null +++ b/ci/travis.rb @@ -0,0 +1,142 @@ +#!/usr/bin/env ruby +require 'fileutils' +include FileUtils + +commands = [ + 'mysql -e "create database activerecord_unittest;"', + 'mysql -e "create database activerecord_unittest2;"', + 'psql -c "create database activerecord_unittest;" -U postgres', + 'psql -c "create database activerecord_unittest2;" -U postgres' +] + +commands.each do |command| + system("#{command} > /dev/null 2>&1") +end + +class Build + MAP = { + 'railties' => 'railties', + 'ap' => 'actionpack', + 'am' => 'actionmailer', + 'amo' => 'activemodel', + 'ares' => 'activeresource', + 'as' => 'activesupport', + 'ar' => 'activerecord' + } + + attr_reader :component, :options + + def initialize(component, options = {}) + @component = component + @options = options + end + + def run!(options = {}) + self.options.update(options) + Dir.chdir(dir) do + announce(heading) + ENV['IM'] = identity_map?.inspect + rake(*tasks) + end + end + + def announce(heading) + puts "\n\e[1;33m[Travis CI] #{heading}\e[m\n" + end + + def heading + heading = [gem] + heading << "with #{adapter} IM #{identity_map? ? 'enabled' : 'disabled'}" if activerecord? + heading << "in isolation" if isolated? + heading.join(' ') + end + + def tasks + if activerecord? + ['mysql:rebuild_databases', "#{adapter}:#{'isolated_' if isolated?}test"] + else + ["test#{':isolated' if isolated?}"] + end + end + + def key + key = [gem] + key << adapter if activerecord? + key << 'IM' if identity_map? + key << 'isolated' if isolated? + key.join(':') + end + + def activerecord? + gem == 'activerecord' + end + + def identity_map? + options[:identity_map] + end + + def isolated? + options[:isolated] + end + + def gem + MAP[component.split(':').first] + end + alias :dir :gem + + def adapter + component.split(':').last + end + + def rake(*tasks) + tasks.each do |task| + cmd = "bundle exec rake #{task}" + puts "Running command: #{cmd}" + return false unless system(cmd) + end + true + end +end + +results = {} + +ENV['GEM'].split(',').each do |gem| + [false, true].each do |isolated| + next if gem == 'railties' && isolated + + build = Build.new(gem, :isolated => isolated) + results[build.key] = build.run! + + if build.activerecord? + build.options[:identity_map] = true + results[build.key] = build.run! + end + end +end + +# puts +# puts "Build environment:" +# puts " #{`cat /etc/issue`}" +# puts " #{`uname -a`}" +# puts " #{`ruby -v`}" +# puts " #{`mysql --version`}" +# # puts " #{`pg_config --version`}" +# puts " SQLite3: #{`sqlite3 -version`}" +# `gem env`.each_line {|line| print " #{line}"} +# puts " Bundled gems:" +# `bundle show`.each_line {|line| print " #{line}"} +# puts " Local gems:" +# `gem list`.each_line {|line| print " #{line}"} + +failures = results.select { |key, value| value == false } + +if failures.empty? + puts + puts "Rails build finished sucessfully" + exit(true) +else + puts + puts "Rails build FAILED" + puts "Failed components: #{failures.map { |component| component.first }.join(', ')}" + exit(false) +end |