mirror of https://github.com/rails/rails
173 lines
3.8 KiB
Ruby
Executable File
173 lines
3.8 KiB
Ruby
Executable File
#!/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',
|
|
'as' => 'activesupport',
|
|
'ar' => 'activerecord',
|
|
'av' => 'actionview',
|
|
'aj' => 'activejob',
|
|
'ac' => 'actioncable',
|
|
'guides' => 'guides'
|
|
}
|
|
|
|
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)
|
|
if guides?
|
|
run_bug_report_templates
|
|
else
|
|
rake(*tasks)
|
|
end
|
|
end
|
|
end
|
|
|
|
def announce(heading)
|
|
puts "\n\e[1;33m[Travis CI] #{heading}\e[m\n"
|
|
end
|
|
|
|
def heading
|
|
heading = [gem]
|
|
heading << "with #{adapter}" if activerecord?
|
|
heading << "in isolation" if isolated?
|
|
heading << "integration" if integration?
|
|
heading.join(' ')
|
|
end
|
|
|
|
def tasks
|
|
if activerecord?
|
|
tasks = ["#{adapter}:#{'isolated_' if isolated?}test"]
|
|
case adapter
|
|
when 'mysql2'
|
|
tasks.unshift 'db:mysql:rebuild'
|
|
when 'postgresql'
|
|
tasks.unshift 'db:postgresql:rebuild'
|
|
end
|
|
tasks
|
|
else
|
|
["test", ('isolated' if isolated?), ('integration' if integration?)].compact.join(":")
|
|
end
|
|
end
|
|
|
|
def key
|
|
key = [gem]
|
|
key << adapter if activerecord?
|
|
key << 'isolated' if isolated?
|
|
key.join(':')
|
|
end
|
|
|
|
def activesupport?
|
|
gem == 'activesupport'
|
|
end
|
|
|
|
def activerecord?
|
|
gem == 'activerecord'
|
|
end
|
|
|
|
def guides?
|
|
gem == 'guides'
|
|
end
|
|
|
|
def isolated?
|
|
options[:isolated]
|
|
end
|
|
|
|
def integration?
|
|
component.split(':').last == 'integration'
|
|
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(env, cmd)
|
|
end
|
|
true
|
|
end
|
|
|
|
def env
|
|
if activesupport? && !isolated?
|
|
# There is a known issue with the listen tests that causes files to be
|
|
# incorrectly GC'ed even when they are still in-use. The current solution
|
|
# is to only run them in isolation to avoid randomly failing our test suite.
|
|
{ 'LISTEN' => '0' }
|
|
else
|
|
{}
|
|
end
|
|
end
|
|
|
|
def run_bug_report_templates
|
|
Dir.glob('bug_report_templates/*.rb').all? do |file|
|
|
system(Gem.ruby, '-w', file)
|
|
end
|
|
end
|
|
end
|
|
|
|
if ENV['GEM']=='aj:integration'
|
|
ENV['QC_DATABASE_URL'] = 'postgres://postgres@localhost/active_jobs_qc_int_test'
|
|
ENV['QUE_DATABASE_URL'] = 'postgres://postgres@localhost/active_jobs_que_int_test'
|
|
end
|
|
|
|
results = {}
|
|
|
|
ENV['GEM'].split(',').each do |gem|
|
|
[false, true].each do |isolated|
|
|
next if ENV['TRAVIS_PULL_REQUEST'] && ENV['TRAVIS_PULL_REQUEST'] != 'false' && isolated
|
|
next if gem == 'railties' && isolated
|
|
next if gem == 'ac' && isolated
|
|
next if gem == 'ac:integration' && isolated
|
|
next if gem == 'aj:integration' && isolated
|
|
next if gem == 'guides' && isolated
|
|
|
|
build = Build.new(gem, :isolated => isolated)
|
|
results[build.key] = build.run!
|
|
|
|
end
|
|
end
|
|
|
|
failures = results.select { |key, value| !value }
|
|
|
|
if failures.empty?
|
|
puts
|
|
puts "Rails build finished successfully"
|
|
exit(true)
|
|
else
|
|
puts
|
|
puts "Rails build FAILED"
|
|
puts "Failed components: #{failures.map(&:first).join(', ')}"
|
|
exit(false)
|
|
end
|