2012-04-03 18:02:54 -04:00
|
|
|
namespace :gitlab do
|
2015-06-23 10:52:40 -04:00
|
|
|
desc "GitLab | Setup production application"
|
2018-01-24 03:12:33 -05:00
|
|
|
task setup: :gitlab_environment do
|
2018-04-19 04:40:28 -04:00
|
|
|
check_gitaly_connection
|
2013-02-14 16:39:48 -05:00
|
|
|
setup_db
|
2013-01-17 15:26:22 -05:00
|
|
|
end
|
2013-01-17 15:19:36 -05:00
|
|
|
|
2018-04-19 04:40:28 -04:00
|
|
|
def check_gitaly_connection
|
|
|
|
Gitlab.config.repositories.storages.each do |name, _details|
|
|
|
|
Gitlab::GitalyClient::ServerService.new(name).info
|
|
|
|
end
|
|
|
|
rescue GRPC::Unavailable => ex
|
|
|
|
puts "Failed to connect to Gitaly...".color(:red)
|
|
|
|
puts "Error: #{ex}"
|
|
|
|
exit 1
|
|
|
|
end
|
|
|
|
|
2013-02-14 16:39:48 -05:00
|
|
|
def setup_db
|
2013-01-17 15:26:22 -05:00
|
|
|
warn_user_is_not_gitlab
|
2013-01-17 15:19:36 -05:00
|
|
|
|
2013-02-19 22:44:03 -05:00
|
|
|
unless ENV['force'] == 'yes'
|
|
|
|
puts "This will create the necessary database tables and seed the database."
|
|
|
|
puts "You will lose any previous data stored in the database."
|
|
|
|
ask_to_continue
|
|
|
|
puts ""
|
|
|
|
end
|
2013-01-17 15:19:36 -05:00
|
|
|
|
2019-01-28 17:46:05 -05:00
|
|
|
# In production, we might want to prevent ourselves from shooting
|
|
|
|
# ourselves in the foot, so let's only do this in a test or
|
|
|
|
# development environment.
|
2019-02-08 18:32:59 -05:00
|
|
|
terminate_all_connections unless Rails.env.production?
|
2019-01-28 17:46:05 -05:00
|
|
|
|
2016-04-14 09:53:54 -04:00
|
|
|
Rake::Task["db:reset"].invoke
|
2015-10-07 11:42:47 -04:00
|
|
|
Rake::Task["setup_postgresql"].invoke
|
2013-01-17 15:26:22 -05:00
|
|
|
Rake::Task["db:seed_fu"].invoke
|
|
|
|
rescue Gitlab::TaskAbortedByUserError
|
2016-06-06 17:17:42 -04:00
|
|
|
puts "Quitting...".color(:red)
|
2013-01-17 15:26:22 -05:00
|
|
|
exit 1
|
2012-04-03 18:02:54 -04:00
|
|
|
end
|
2019-02-08 18:32:59 -05:00
|
|
|
|
|
|
|
# If there are any clients connected to the DB, PostgreSQL won't let
|
|
|
|
# you drop the database. It's possible that Sidekiq, Unicorn, or
|
|
|
|
# some other client will be hanging onto a connection, preventing
|
|
|
|
# the DROP DATABASE from working. To workaround this problem, this
|
|
|
|
# method terminates all the connections so that a subsequent DROP
|
|
|
|
# will work.
|
|
|
|
def self.terminate_all_connections
|
|
|
|
cmd = <<~SQL
|
|
|
|
SELECT pg_terminate_backend(pg_stat_activity.pid)
|
|
|
|
FROM pg_stat_activity
|
|
|
|
WHERE datname = current_database()
|
|
|
|
AND pid <> pg_backend_pid();
|
|
|
|
SQL
|
|
|
|
|
|
|
|
ActiveRecord::Base.connection.execute(cmd)&.result_status == PG::PGRES_TUPLES_OK
|
|
|
|
rescue ActiveRecord::NoDatabaseError
|
|
|
|
end
|
2012-04-03 18:02:54 -04:00
|
|
|
end
|