#!/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