BigW Consortium Gitlab

Commit c33d5e16 by Dmitriy Zaporozhets

refactor backup/restore

parent 362d82d1
...@@ -21,7 +21,7 @@ GitLab supports the following databases: ...@@ -21,7 +21,7 @@ GitLab supports the following databases:
mysql> CREATE DATABASE IF NOT EXISTS `gitlabhq_production` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`; mysql> CREATE DATABASE IF NOT EXISTS `gitlabhq_production` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;
# Grant the GitLab user necessary permissopns on the table. # Grant the GitLab user necessary permissopns on the table.
mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON `gitlabhq_production`.* TO 'gitlab'@'localhost'; mysql> GRANT SELECT, LOCK TABLES, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON `gitlabhq_production`.* TO 'gitlab'@'localhost';
# Quit the database session # Quit the database session
mysql> \q mysql> \q
......
require 'yaml' require 'yaml'
class Backup module Backup
class Database
attr_reader :config, :db_dir attr_reader :config, :db_dir
def initialize def initialize
...@@ -9,7 +10,7 @@ class Backup ...@@ -9,7 +10,7 @@ class Backup
FileUtils.mkdir_p(@db_dir) unless Dir.exists?(@db_dir) FileUtils.mkdir_p(@db_dir) unless Dir.exists?(@db_dir)
end end
def backup_db def dump
case config["adapter"] case config["adapter"]
when /^mysql/ then when /^mysql/ then
system("mysqldump #{mysql_args} #{config['database']} > #{db_file_name}") system("mysqldump #{mysql_args} #{config['database']} > #{db_file_name}")
...@@ -19,7 +20,7 @@ class Backup ...@@ -19,7 +20,7 @@ class Backup
end end
end end
def restore_db def restore
case config["adapter"] case config["adapter"]
when /^mysql/ then when /^mysql/ then
system("mysql #{mysql_args} #{config['database']} < #{db_file_name}") system("mysql #{mysql_args} #{config['database']} < #{db_file_name}")
...@@ -53,4 +54,5 @@ class Backup ...@@ -53,4 +54,5 @@ class Backup
ENV['PGPORT'] = config["port"].to_s if config["port"] ENV['PGPORT'] = config["port"].to_s if config["port"]
ENV['PGPASSWORD'] = config["password"].to_s if config["password"] ENV['PGPASSWORD'] = config["password"].to_s if config["password"]
end end
end
end end
require 'yaml'
module Backup
class Repository
attr_reader :repos_path
def dump
prepare
Project.find_each(batch_size: 1000) do |project|
print " * #{project.path_with_namespace} ... "
if project.empty_repo?
puts "[SKIPPED]".cyan
next
end
# Create namespace dir if missing
FileUtils.mkdir_p(File.join(backup_repos_path, project.namespace.path)) if project.namespace
if system("cd #{path_to_repo(project)} > /dev/null 2>&1 && git bundle create #{path_to_bundle(project)} --all > /dev/null 2>&1")
puts "[DONE]".green
else
puts "[FAILED]".red
end
end
end
def restore
if File.exists?(repos_path)
# Move repos dir to 'repositories.old' dir
bk_repos_path = File.join(repos_path, '..', 'repositories.old')
FileUtils.mv(repos_path, bk_repos_path)
end
FileUtils.mkdir_p(repos_path)
Project.find_each(batch_size: 1000) do |project|
print "#{project.path_with_namespace} ... "
project.namespace.ensure_dir_exist if project.namespace
if system("git clone --bare #{path_to_bundle(project)} #{path_to_repo(project)} > /dev/null 2>&1")
puts "[DONE]".green
else
puts "[FAILED]".red
end
end
end
protected
def path_to_repo(project)
File.join(repos_path, project.path_with_namespace + '.git')
end
def path_to_bundle(project)
File.join(backup_repos_path, project.path_with_namespace + ".bundle")
end
def repos_path
Gitlab.config.gitlab_shell.repos_path
end
def backup_repos_path
File.join(Gitlab.config.backup.path, "repositories")
end
def prepare
FileUtils.rm_rf(backup_repos_path)
FileUtils.mkdir_p(backup_repos_path)
end
end
end
...@@ -111,67 +111,28 @@ namespace :gitlab do ...@@ -111,67 +111,28 @@ namespace :gitlab do
namespace :repo do namespace :repo do
task :create => :environment do task :create => :environment do
backup_path_repo = File.join(Gitlab.config.backup.path, "repositories")
FileUtils.mkdir_p(backup_path_repo) until Dir.exists?(backup_path_repo)
puts "Dumping repositories ...".blue puts "Dumping repositories ...".blue
Backup::Repository.new.dump
Project.find_each(:batch_size => 1000) do |project| puts "done".green
print " * #{project.path_with_namespace} ... "
if project.empty_repo?
puts "[SKIPPED]".cyan
next
end
# Create namespace dir if missing
FileUtils.mkdir_p(File.join(backup_path_repo, project.namespace.path)) if project.namespace
# Build a destination path for backup
path_to_bundle = File.join(backup_path_repo, project.path_with_namespace + ".bundle")
if Kernel.system("cd #{project.repository.path_to_repo} > /dev/null 2>&1 && git bundle create #{path_to_bundle} --all > /dev/null 2>&1")
puts "[DONE]".green
else
puts "[FAILED]".red
end
end
end end
task :restore => :environment do task :restore => :environment do
backup_path_repo = File.join(Gitlab.config.backup.path, "repositories") puts "Restoring repositories ...".blue
repos_path = Gitlab.config.gitlab_shell.repos_path Backup::Repository.new.restore
puts "done".green
puts "Restoring repositories ... "
Project.find_each(:batch_size => 1000) do |project|
print "#{project.path_with_namespace} ... "
if project.namespace
project.namespace.ensure_dir_exist
end
# Build a backup path
path_to_bundle = File.join(backup_path_repo, project.path_with_namespace + ".bundle")
if Kernel.system("git clone --bare #{path_to_bundle} #{project.repository.path_to_repo} > /dev/null 2>&1")
puts "[DONE]".green
else
puts "[FAILED]".red
end
end
end end
end end
namespace :db do namespace :db do
task :create => :environment do task :create => :environment do
puts "Dumping database ... ".blue puts "Dumping database ... ".blue
Backup.new.backup_db Backup::Database.new.dump
puts "done".green puts "done".green
end end
task :restore => :environment do task :restore => :environment do
puts "Restoring database ... ".blue puts "Restoring database ... ".blue
Backup.new.restore_db Backup::Database.new.restore
puts "done".green puts "done".green
end end
end end
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment