Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'lib/tasks/gitlab/backup.rake')
-rw-r--r--lib/tasks/gitlab/backup.rake128
1 files changed, 102 insertions, 26 deletions
diff --git a/lib/tasks/gitlab/backup.rake b/lib/tasks/gitlab/backup.rake
index ff43a36d930..6647a10898f 100644
--- a/lib/tasks/gitlab/backup.rake
+++ b/lib/tasks/gitlab/backup.rake
@@ -4,121 +4,168 @@ require 'active_record/fixtures'
namespace :gitlab do
namespace :backup do
+ PID = Process.pid.freeze
+ PID_FILE = "#{Rails.application.root}/tmp/backup_restore.pid"
+
# Create backup of GitLab system
desc 'GitLab | Backup | Create a backup of the GitLab system'
task create: :gitlab_environment do
- warn_user_is_not_gitlab
+ lock do
+ warn_user_is_not_gitlab
- Backup::Manager.new(progress).create
+ Backup::Manager.new(progress).create
+ end
end
# Restore backup of GitLab system
desc 'GitLab | Backup | Restore a previously created backup'
task restore: :gitlab_environment do
- warn_user_is_not_gitlab
+ lock do
+ warn_user_is_not_gitlab
- Backup::Manager.new(progress).restore
+ Backup::Manager.new(progress).restore
+ end
end
namespace :repo do
task create: :gitlab_environment do
- Backup::Manager.new(progress).run_create_task('repositories')
+ lock do
+ Backup::Manager.new(progress).run_create_task('repositories')
+ end
end
task restore: :gitlab_environment do
- Backup::Manager.new(progress).run_restore_task('repositories')
+ lock do
+ Backup::Manager.new(progress).run_restore_task('repositories')
+ end
end
end
namespace :db do
task create: :gitlab_environment do
- Backup::Manager.new(progress).run_create_task('main_db')
- Backup::Manager.new(progress).run_create_task('ci_db')
+ lock do
+ Backup::Manager.new(progress).run_create_task('main_db')
+ Backup::Manager.new(progress).run_create_task('ci_db')
+ end
end
task restore: :gitlab_environment do
- Backup::Manager.new(progress).run_restore_task('main_db')
- Backup::Manager.new(progress).run_restore_task('ci_db')
+ lock do
+ Backup::Manager.new(progress).run_restore_task('main_db')
+ Backup::Manager.new(progress).run_restore_task('ci_db')
+ end
end
end
namespace :builds do
task create: :gitlab_environment do
- Backup::Manager.new(progress).run_create_task('builds')
+ lock do
+ Backup::Manager.new(progress).run_create_task('builds')
+ end
end
task restore: :gitlab_environment do
- Backup::Manager.new(progress).run_restore_task('builds')
+ lock do
+ Backup::Manager.new(progress).run_restore_task('builds')
+ end
end
end
namespace :uploads do
task create: :gitlab_environment do
- Backup::Manager.new(progress).run_create_task('uploads')
+ lock do
+ Backup::Manager.new(progress).run_create_task('uploads')
+ end
end
task restore: :gitlab_environment do
- Backup::Manager.new(progress).run_restore_task('uploads')
+ lock do
+ Backup::Manager.new(progress).run_restore_task('uploads')
+ end
end
end
namespace :artifacts do
task create: :gitlab_environment do
- Backup::Manager.new(progress).run_create_task('artifacts')
+ lock do
+ Backup::Manager.new(progress).run_create_task('artifacts')
+ end
end
task restore: :gitlab_environment do
- Backup::Manager.new(progress).run_restore_task('artifacts')
+ lock do
+ Backup::Manager.new(progress).run_restore_task('artifacts')
+ end
end
end
namespace :pages do
task create: :gitlab_environment do
- Backup::Manager.new(progress).run_create_task('pages')
+ lock do
+ Backup::Manager.new(progress).run_create_task('pages')
+ end
end
task restore: :gitlab_environment do
- Backup::Manager.new(progress).run_restore_task('pages')
+ lock do
+ Backup::Manager.new(progress).run_restore_task('pages')
+ end
end
end
namespace :lfs do
task create: :gitlab_environment do
- Backup::Manager.new(progress).run_create_task('lfs')
+ lock do
+ Backup::Manager.new(progress).run_create_task('lfs')
+ end
end
task restore: :gitlab_environment do
- Backup::Manager.new(progress).run_restore_task('lfs')
+ lock do
+ Backup::Manager.new(progress).run_restore_task('lfs')
+ end
end
end
namespace :terraform_state do
task create: :gitlab_environment do
- Backup::Manager.new(progress).run_create_task('terraform_state')
+ lock do
+ Backup::Manager.new(progress).run_create_task('terraform_state')
+ end
end
task restore: :gitlab_environment do
- Backup::Manager.new(progress).run_restore_task('terraform_state')
+ lock do
+ Backup::Manager.new(progress).run_restore_task('terraform_state')
+ end
end
end
namespace :registry do
task create: :gitlab_environment do
- Backup::Manager.new(progress).run_create_task('registry')
+ lock do
+ Backup::Manager.new(progress).run_create_task('registry')
+ end
end
task restore: :gitlab_environment do
- Backup::Manager.new(progress).run_restore_task('registry')
+ lock do
+ Backup::Manager.new(progress).run_restore_task('registry')
+ end
end
end
namespace :packages do
task create: :gitlab_environment do
- Backup::Manager.new(progress).run_create_task('packages')
+ lock do
+ Backup::Manager.new(progress).run_create_task('packages')
+ end
end
task restore: :gitlab_environment do
- Backup::Manager.new(progress).run_restore_task('packages')
+ lock do
+ Backup::Manager.new(progress).run_restore_task('packages')
+ end
end
end
@@ -132,6 +179,35 @@ namespace :gitlab do
$stdout
end
end
+
+ def lock
+ File.open(PID_FILE, File::RDWR | File::CREAT, 0644) do |f|
+ f.flock(File::LOCK_EX)
+
+ unless f.read.empty?
+ # There is a PID inside so the process fails
+ progress.puts(<<~HEREDOC.color(:red))
+ Backup and restore in progress:
+ There is a backup and restore task in progress. Please, try to run the current task once the previous one ends.
+ If there is no other process running, please remove the PID file manually: rm #{PID_FILE}
+ HEREDOC
+
+ exit 1
+ end
+
+ f.write(PID)
+ f.flush
+ ensure
+ f.flock(File::LOCK_UN)
+ end
+
+ begin
+ yield
+ ensure
+ progress.puts "#{Time.now} " + "-- Deleting backup and restore lock file".color(:blue)
+ File.delete(PID_FILE)
+ end
+ end
end
# namespace end: backup
end