aboutsummaryrefslogblamecommitdiffstats
path: root/ci/travis.rb
blob: 038db476e91ee42331fe4fb275ae726d91ebcd9e (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
                   

                             
                   


                 



                                                                                              



                                                                                       


                          
                                       


           








                                         
 

                       
 




                                








                                                 
                                                 
                                          
                                            
                     



                    

                                                            



                                             

           
        
                                                                                                             





                                   

                                  

     
                    
                          

     
                   
                         

     
             
                   

     



                                      



                      
                  
                                              

     
         
                              



                 
                             





                                      
                                          


        
 
         
                                   
                                                                            
                                                                               
                                                                                    
                         


        

     
                              

                                                        

       

   
                                        

                                                                                    

   

            
                                   
                                  
                                                                                           
                                            
                                         


                                                        
                                       


                                               
                                           
 
                                              
                                   


     
                                                  


                  
                                          



                           
                                                               

             
#!/usr/bin/env ruby
# frozen_string_literal: true

require "fileutils"
include FileUtils

commands = [
  'mysql -e "create user rails@localhost;"',
  'mysql -e "grant all privileges on activerecord_unittest.* to rails@localhost;"',
  'mysql -e "grant all privileges on activerecord_unittest2.* to rails@localhost;"',
  'mysql -e "grant all privileges on inexistent_activerecord_unittest.* to rails@localhost;"',
  'mysql -e "create database activerecord_unittest default character set utf8mb4;"',
  'mysql -e "create database activerecord_unittest2 default character set utf8mb4;"',
  'psql  -c "create database -E UTF8 -T template0 activerecord_unittest;" -U postgres',
  'psql  -c "create database -E UTF8 -T template0 activerecord_unittest2;" -U postgres'
]

commands.each do |command|
  system(command, [1, 2] => File::NULL)
end

class Build
  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?), ("ujs" if ujs?)].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 ujs?
    component.split(":").last == "ujs"
  end

  def isolated?
    options[:isolated]
  end

  def integration?
    component.split(":").last == "integration"
  end

  def gem
    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 random failures of 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"] == "activejob: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 RUBY_VERSION < "2.6" && isolated
    next if gem == "railties" && isolated
    next if gem == "actioncable" && isolated
    next if gem == "actioncable:integration" && isolated
    next if gem == "activejob:integration" && isolated
    next if gem == "guides" && isolated
    next if gem == "actionview:ujs" && isolated
    next if gem == "activestorage" && isolated
    next if gem == "actionmailbox" && isolated
    next if gem == "actiontext" && 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