summaryrefslogtreecommitdiff
path: root/lib/tasks/gitlab/backup.rake
diff options
context:
space:
mode:
authorRiyad Preukschas <riyad@informatik.uni-bremen.de>2013-01-15 00:52:25 +0100
committerRiyad Preukschas <riyad@informatik.uni-bremen.de>2013-01-15 00:52:25 +0100
commit30227869482bbbdbfea153f2b45ef3bb9a9fd218 (patch)
treeaff64071116447092751770d2896998f62d1b44a /lib/tasks/gitlab/backup.rake
parent8ee5fce9d64b70d8981896457484fae622d142c9 (diff)
parentaca0caa8cc1a6bd481f87dd810284e69d3747050 (diff)
downloadgitlab-ce-30227869482bbbdbfea153f2b45ef3bb9a9fd218.tar.gz
Merge commit 'master' into discussions
Conflicts: app/assets/stylesheets/sections/notes.scss app/contexts/notes/load_context.rb app/models/project.rb app/observers/note_observer.rb app/roles/votes.rb app/views/commit/show.html.haml app/views/merge_requests/_show.html.haml app/views/merge_requests/diffs.js.haml app/views/merge_requests/show.js.haml app/views/notes/_note.html.haml features/steps/project/project_merge_requests.rb spec/models/note_spec.rb
Diffstat (limited to 'lib/tasks/gitlab/backup.rake')
-rw-r--r--lib/tasks/gitlab/backup.rake106
1 files changed, 62 insertions, 44 deletions
diff --git a/lib/tasks/gitlab/backup.rake b/lib/tasks/gitlab/backup.rake
index 44da6d671e0..ae2b1bb793f 100644
--- a/lib/tasks/gitlab/backup.rake
+++ b/lib/tasks/gitlab/backup.rake
@@ -5,6 +5,8 @@ namespace :gitlab do
# Create backup of GitLab system
desc "GITLAB | Create a backup of the GitLab system"
task :create => :environment do
+ warn_user_is_not_gitlab
+
Rake::Task["gitlab:backup:db:create"].invoke
Rake::Task["gitlab:backup:repo:create"].invoke
@@ -22,23 +24,23 @@ namespace :gitlab do
end
# create archive
- print "Creating backup archive: #{Time.now.to_i}_gitlab_backup.tar "
+ print "Creating backup archive: #{Time.now.to_i}_gitlab_backup.tar ... "
if Kernel.system("tar -cf #{Time.now.to_i}_gitlab_backup.tar repositories/ db/ backup_information.yml")
- puts "[DONE]".green
+ puts "done".green
else
- puts "[FAILED]".red
+ puts "failed".red
end
# cleanup: remove tmp files
- print "Deleting tmp directories..."
+ print "Deleting tmp directories ... "
if Kernel.system("rm -rf repositories/ db/ backup_information.yml")
- puts "[DONE]".green
+ puts "done".green
else
- puts "[FAILED]".red
+ puts "failed".red
end
# delete backups
- print "Deleting old backups... "
+ print "Deleting old backups ... "
if Gitlab.config.backup.keep_time > 0
file_list = Dir.glob("*_gitlab_backup.tar").map { |f| f.split(/_/).first.to_i }
file_list.sort.each do |timestamp|
@@ -46,15 +48,17 @@ namespace :gitlab do
%x{rm #{timestamp}_gitlab_backup.tar}
end
end
- puts "[DONE]".green
+ puts "done".green
else
- puts "[SKIPPING]".yellow
+ puts "skipping".yellow
end
end
# Restore backup of GitLab system
desc "GITLAB | Restore a previously created backup"
task :restore => :environment do
+ warn_user_is_not_gitlab
+
Dir.chdir(Gitlab.config.backup.path)
# check for existing backups in the backup dir
@@ -63,22 +67,22 @@ namespace :gitlab do
if file_list.count > 1 && ENV["BACKUP"].nil?
puts "Found more than one backup, please specify which one you want to restore:"
puts "rake gitlab:backup:restore BACKUP=timestamp_of_backup"
- exit 1;
+ exit 1
end
tar_file = ENV["BACKUP"].nil? ? File.join("#{file_list.first}_gitlab_backup.tar") : File.join(ENV["BACKUP"] + "_gitlab_backup.tar")
unless File.exists?(tar_file)
puts "The specified backup doesn't exist!"
- exit 1;
+ exit 1
end
- print "Unpacking backup... "
+ print "Unpacking backup ... "
unless Kernel.system("tar -xf #{tar_file}")
- puts "[FAILED]".red
+ puts "failed".red
exit 1
else
- puts "[DONE]".green
+ puts "done".green
end
settings = YAML.load_file("backup_information.yml")
@@ -86,7 +90,7 @@ namespace :gitlab do
# restoring mismatching backups can lead to unexpected problems
if settings[:gitlab_version] != %x{git rev-parse HEAD}.gsub(/\n/,"")
- puts "gitlab_version mismatch:".red
+ puts "GitLab version mismatch:".red
puts " Your current HEAD differs from the HEAD in the backup!".red
puts " Please switch to the following revision and try again:".red
puts " revision: #{settings[:gitlab_version]}".red
@@ -97,11 +101,11 @@ namespace :gitlab do
Rake::Task["gitlab:backup:repo:restore"].invoke
# cleanup: remove tmp files
- print "Deleting tmp directories..."
+ print "Deleting tmp directories ... "
if Kernel.system("rm -rf repositories/ db/ backup_information.yml")
- puts "[DONE]".green
+ puts "done".green
else
- puts "[FAILED]".red
+ puts "failed".red
end
end
@@ -114,12 +118,23 @@ namespace :gitlab 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:"
- project = Project.all.map { |n| [n.path, n.path_to_repo] }
- project << ["gitolite-admin.git", File.join(Gitlab.config.git_base_path, "gitolite-admin.git")]
- project.each do |project|
- print "- Dumping repository #{project.first}... "
- if Kernel.system("cd #{project.second} > /dev/null 2>&1 && git bundle create #{backup_path_repo}/#{project.first}.bundle --all > /dev/null 2>&1")
+ puts "Dumping repositories ...".blue
+
+ 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_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
@@ -129,18 +144,21 @@ namespace :gitlab do
task :restore => :environment do
backup_path_repo = File.join(Gitlab.config.backup.path, "repositories")
- puts "Restoring repositories:"
- project = Project.all.map { |n| [n.path, n.path_to_repo] }
- project << ["gitolite-admin.git", File.join(File.dirname(project.first.second), "gitolite-admin.git")]
- project.each do |project|
- print "- Restoring repository #{project.first}... "
- FileUtils.rm_rf(project.second) if File.dirname(project.second) # delete old stuff
- if Kernel.system("cd #{File.dirname(project.second)} > /dev/null 2>&1 && git clone --bare #{backup_path_repo}/#{project.first}.bundle #{project.first}.git > /dev/null 2>&1")
- permission_commands = [
- "sudo chmod -R g+rwX #{Gitlab.config.git_base_path}",
- "sudo chown -R #{Gitlab.config.ssh_user}:#{Gitlab.config.ssh_user} #{Gitlab.config.git_base_path}"
- ]
- permission_commands.each { |command| Kernel.system(command) }
+ repos_path = Gitlab.config.gitolite.repos_path
+
+ 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
@@ -156,9 +174,9 @@ namespace :gitlab do
backup_path_db = File.join(Gitlab.config.backup.path, "db")
FileUtils.mkdir_p(backup_path_db) unless Dir.exists?(backup_path_db)
- puts "Dumping database tables:"
+ puts "Dumping database tables ... ".blue
ActiveRecord::Base.connection.tables.each do |tbl|
- print "- Dumping table #{tbl}... "
+ print " * #{tbl.yellow} ... "
count = 1
File.open(File.join(backup_path_db, tbl + ".yml"), "w+") do |file|
ActiveRecord::Base.connection.select_all("SELECT * FROM `#{tbl}`").each do |line|
@@ -167,25 +185,25 @@ namespace :gitlab do
file << output.to_yaml.gsub(/^---\n/,'') + "\n"
count += 1
end
- puts "[DONE]".green
+ puts "done".green
end
end
end
- task :restore=> :environment do
+ task :restore => :environment do
backup_path_db = File.join(Gitlab.config.backup.path, "db")
- puts "Restoring database tables:"
+ puts "Restoring database tables (loading fixtures) ... "
Rake::Task["db:reset"].invoke
Dir.glob(File.join(backup_path_db, "*.yml") ).each do |dir|
fixture_file = File.basename(dir, ".*" )
- print "- Loading fixture #{fixture_file}..."
+ print "#{fixture_file.yellow} ... "
if File.size(dir) > 0
ActiveRecord::Fixtures.create_fixtures(backup_path_db, fixture_file)
- puts "[DONE]".green
+ puts "done".green
else
- puts "[SKIPPING]".yellow
+ puts "skipping".yellow
end
end
end