summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2013-08-05 12:26:33 +0300
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2013-08-05 12:26:33 +0300
commit02e859a23470d799a77963503687789d4a410a0c (patch)
treee8531ca9d535a088a6cf0e22623dbaa45cea835e
parentaf5faaf0e1e001558302704a421eb01f5e7a26ea (diff)
downloadgitlab-ce-02e859a23470d799a77963503687789d4a410a0c.tar.gz
move backup logic to lib. Fixed removing outdated backups
-rw-r--r--.gitignore1
-rw-r--r--lib/backup/manager.rb106
-rw-r--r--lib/tasks/gitlab/backup.rake102
3 files changed, 114 insertions, 95 deletions
diff --git a/.gitignore b/.gitignore
index 60e17328880..de8b77ffd4b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -31,3 +31,4 @@ rails_best_practices_output.html
doc/code/*
.secret
*.log
+public/uploads.*
diff --git a/lib/backup/manager.rb b/lib/backup/manager.rb
new file mode 100644
index 00000000000..258a0fb2589
--- /dev/null
+++ b/lib/backup/manager.rb
@@ -0,0 +1,106 @@
+module Backup
+ class Manager
+ def pack
+ # saving additional informations
+ s = {}
+ s[:db_version] = "#{ActiveRecord::Migrator.current_version}"
+ s[:backup_created_at] = Time.now
+ s[:gitlab_version] = %x{git rev-parse HEAD}.gsub(/\n/,"")
+ s[:tar_version] = %x{tar --version | head -1}.gsub(/\n/,"")
+
+ Dir.chdir(Gitlab.config.backup.path)
+
+ File.open("#{Gitlab.config.backup.path}/backup_information.yml", "w+") do |file|
+ file << s.to_yaml.gsub(/^---\n/,'')
+ end
+
+ # create archive
+ print "Creating backup archive: #{s[:backup_created_at].to_i}_gitlab_backup.tar ... "
+ if Kernel.system("tar -cf #{s[:backup_created_at].to_i}_gitlab_backup.tar repositories/ db/ uploads/ backup_information.yml")
+ puts "done".green
+ else
+ puts "failed".red
+ end
+ end
+
+ def cleanup
+ print "Deleting tmp directories ... "
+ if Kernel.system("rm -rf repositories/ db/ uploads/ backup_information.yml")
+ puts "done".green
+ else
+ puts "failed".red
+ end
+ end
+
+ def remove_old
+ # delete backups
+ print "Deleting old backups ... "
+ keep_time = Gitlab.config.backup.keep_time.to_i
+ path = Gitlab.config.backup.path
+
+ if keep_time > 0
+ removed = 0
+ file_list = Dir.glob(Rails.root.join(path, "*_gitlab_backup.tar"))
+ file_list.map! { |f| $1.to_i if f =~ /(\d+)_gitlab_backup.tar/ }
+ file_list.sort.each do |timestamp|
+ if Time.at(timestamp) < (Time.now - keep_time)
+ if system("rm #{timestamp}_gitlab_backup.tar")
+ removed += 1
+ end
+ end
+ end
+ puts "done. (#{removed} removed)".green
+ else
+ puts "skipping".yellow
+ end
+ end
+
+ def unpack
+ Dir.chdir(Gitlab.config.backup.path)
+
+ # check for existing backups in the backup dir
+ file_list = Dir.glob("*_gitlab_backup.tar").each.map { |f| f.split(/_/).first.to_i }
+ puts "no backups found" if file_list.count == 0
+ 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
+ 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
+ end
+
+ print "Unpacking backup ... "
+ unless Kernel.system("tar -xf #{tar_file}")
+ puts "failed".red
+ exit 1
+ else
+ puts "done".green
+ end
+
+ settings = YAML.load_file("backup_information.yml")
+ ENV["VERSION"] = "#{settings[:db_version]}" if settings[:db_version].to_i > 0
+
+ # backups directory is not always sub of Rails root and able to execute the git rev-parse below
+ begin
+ Dir.chdir(Rails.root)
+
+ # 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 " 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
+ exit 1
+ end
+ ensure
+ # chdir back to original intended dir
+ Dir.chdir(Gitlab.config.backup.path)
+ end
+ end
+ end
+end
diff --git a/lib/tasks/gitlab/backup.rake b/lib/tasks/gitlab/backup.rake
index d071938acb5..2eff1260b61 100644
--- a/lib/tasks/gitlab/backup.rake
+++ b/lib/tasks/gitlab/backup.rake
@@ -11,49 +11,10 @@ namespace :gitlab do
Rake::Task["gitlab:backup:repo:create"].invoke
Rake::Task["gitlab:backup:uploads:create"].invoke
-
- # saving additional informations
- s = {}
- s[:db_version] = "#{ActiveRecord::Migrator.current_version}"
- s[:backup_created_at] = Time.now
- s[:gitlab_version] = %x{git rev-parse HEAD}.gsub(/\n/,"")
- s[:tar_version] = %x{tar --version | head -1}.gsub(/\n/,"")
-
- Dir.chdir(Gitlab.config.backup.path)
-
- File.open("#{Gitlab.config.backup.path}/backup_information.yml", "w+") do |file|
- file << s.to_yaml.gsub(/^---\n/,'')
- end
-
- # create archive
- print "Creating backup archive: #{s[:backup_created_at].to_i}_gitlab_backup.tar ... "
- if Kernel.system("tar -cf #{s[:backup_created_at].to_i}_gitlab_backup.tar repositories/ db/ uploads/ backup_information.yml")
- puts "done".green
- else
- puts "failed".red
- end
-
- # cleanup: remove tmp files
- print "Deleting tmp directories ... "
- if Kernel.system("rm -rf repositories/ db/ uploads/ backup_information.yml")
- puts "done".green
- else
- puts "failed".red
- end
-
- # delete 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|
- if Time.at(timestamp) < (Time.now - Gitlab.config.backup.keep_time)
- %x{rm #{timestamp}_gitlab_backup.tar}
- end
- end
- puts "done".green
- else
- puts "skipping".yellow
- end
+ backup = Backup::Manager.new
+ backup.pack
+ backup.cleanup
+ backup.remove_old
end
# Restore backup of GitLab system
@@ -61,64 +22,15 @@ namespace :gitlab do
task restore: :environment do
warn_user_is_not_gitlab
- Dir.chdir(Gitlab.config.backup.path)
-
- # check for existing backups in the backup dir
- file_list = Dir.glob("*_gitlab_backup.tar").each.map { |f| f.split(/_/).first.to_i }
- puts "no backups found" if file_list.count == 0
- 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
- 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
- end
-
- print "Unpacking backup ... "
- unless Kernel.system("tar -xf #{tar_file}")
- puts "failed".red
- exit 1
- else
- puts "done".green
- end
-
- settings = YAML.load_file("backup_information.yml")
- ENV["VERSION"] = "#{settings[:db_version]}" if settings[:db_version].to_i > 0
-
- # backups directory is not always sub of Rails root and able to execute the git rev-parse below
- begin
- Dir.chdir(Rails.root)
-
- # 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 " 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
- exit 1
- end
- ensure
- # chdir back to original intended dir
- Dir.chdir(Gitlab.config.backup.path)
- end
+ backup = Backup::Manager.new
+ backup.unpack
Rake::Task["gitlab:backup:db:restore"].invoke
Rake::Task["gitlab:backup:repo:restore"].invoke
Rake::Task["gitlab:backup:uploads:restore"].invoke
Rake::Task["gitlab:shell:setup"].invoke
- # cleanup: remove tmp files
- print "Deleting tmp directories ... "
- if Kernel.system("rm -rf repositories/ db/ uploads/ backup_information.yml")
- puts "done".green
- else
- puts "failed".red
- end
+ backup.cleanup
end
namespace :repo do