lib/support/bootstrap_rails.rb (91 lines of code) (raw):
# frozen_string_literal: true
require 'socket'
require 'fileutils'
require_relative '../gdk'
module Support
# Bootstrap GitLab rails environment
class BootstrapRails
# The log file should be in the "support" folder, not in "suppport/lib"
LOG_FILE = '../bootstrap-rails.log'
def execute
if config.geo.secondary?
GDK::Output.info("Exiting as we're a Geo secondary.")
exit
end
GDK::Output.abort('Cannot connect to PostgreSQL.') unless postgresql.ready?
FileUtils.rm_f(LOG_FILE)
bootstrap_main_db && bootstrap_ci_db && bootstrap_sec_db && bootstrap_embedding_db
end
private
def bootstrap_main_db
if_db_not_found('gitlabhq_development') do
run_tasks(%w[db:drop db:create gitlab:db:configure]) &&
set_feature_flags
end
end
def set_feature_flags
# Nothing set right now
true
end
def bootstrap_ci_db
return if !config.gitlab.rails.databases.ci.__enabled || config.gitlab.rails.databases.ci.__use_main_database
if_db_not_found('gitlabhq_development_ci') do
run_tasks('dev:copy_db:ci')
end
end
def bootstrap_sec_db
return if !config.gitlab.rails.databases.sec.__enabled || config.gitlab.rails.databases.sec.__use_main_database
if_db_not_found('gitlabhq_development_sec') do
run_tasks('dev:copy_db:sec')
end
end
def bootstrap_embedding_db
return unless config.gitlab.rails.databases.embedding.enabled
if_db_not_found('gitlabhq_development_embedding') do
run_tasks('db:reset:embedding')
end
end
def run_tasks(*tasks)
test_gitaly_up!
rake = GDK::Execute::Rake.new(*tasks)
unless rake.execute_in_gitlab(retry_attempts: 3).success?
GDK::Output.abort <<~MESSAGE
The rake task '#{tasks.join(' ')}' failed. Trying to run it again!
MESSAGE
end
true
end
def if_db_not_found(db)
if postgresql.db_exists?(db)
GDK::Output.info("#{db} exists, nothing to do here.")
true
else
yield
end
end
def postgresql
@postgresql ||= GDK::Postgresql.new
end
def config
GDK.config
end
def test_gitaly_up!
try_connect!(config.praefect? ? 'praefect' : 'gitaly')
end
def try_connect!(service)
print "Waiting for #{service} to boot"
sleep_time = 0.1
repeats = 100
repeats.times do
sleep sleep_time
print '.'
begin
UNIXSocket.new("#{service}.socket").close
GDK::Output.puts 'OK'
return
rescue Errno::ENOENT, Errno::ECONNREFUSED
end
end
GDK::Output.error " failed to connect to #{service} after #{repeats * sleep_time}s"
GDK::Output.puts(stderr: true)
system('grep', "#{service}.1", LOG_FILE)
abort
end
end
end