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.rake284
1 files changed, 22 insertions, 262 deletions
diff --git a/lib/tasks/gitlab/backup.rake b/lib/tasks/gitlab/backup.rake
index 0bca63a64f5..78cb7d72d4f 100644
--- a/lib/tasks/gitlab/backup.rake
+++ b/lib/tasks/gitlab/backup.rake
@@ -9,26 +9,7 @@ namespace :gitlab do
task create: :gitlab_environment do
warn_user_is_not_gitlab
- %w(db repo uploads builds artifacts pages lfs terraform_state registry packages).each do |type|
- Rake::Task["gitlab:backup:#{type}:create"].invoke
- end
-
- backup = Backup::Manager.new(progress)
- backup.write_info
-
- if ENV['SKIP'] && ENV['SKIP'].include?('tar')
- backup.upload
- else
- backup.pack
- backup.upload
- backup.cleanup
- backup.remove_old
- end
-
- progress.puts "Warning: Your gitlab.rb and gitlab-secrets.json files contain sensitive data \n" \
- "and are not included in this backup. You will need these files to restore a backup.\n" \
- "Please back them up manually.".color(:red)
- progress.puts "Backup task is done."
+ Backup::Manager.new(progress).create
end
# Restore backup of GitLab system
@@ -36,320 +17,109 @@ namespace :gitlab do
task restore: :gitlab_environment do
warn_user_is_not_gitlab
- backup = Backup::Manager.new(progress)
- cleanup_required = backup.unpack
- backup.verify_backup_version
-
- unless backup.skipped?('db')
- begin
- unless ENV['force'] == 'yes'
- warning = <<-MSG.strip_heredoc
- Be sure to stop Puma, Sidekiq, and any other process that
- connects to the database before proceeding. For Omnibus
- installs, see the following link for more information:
- https://docs.gitlab.com/ee/raketasks/backup_restore.html#restore-for-omnibus-gitlab-installations
-
- Before restoring the database, we will remove all existing
- tables to avoid future upgrade problems. Be aware that if you have
- custom tables in the GitLab database these tables and all data will be
- removed.
- MSG
- puts warning.color(:red)
- ask_to_continue
- puts 'Removing all tables. Press `Ctrl-C` within 5 seconds to abort'.color(:yellow)
- sleep(5)
- end
-
- # Drop all tables Load the schema to ensure we don't have any newer tables
- # hanging out from a failed upgrade
- puts_time 'Cleaning the database ... '.color(:blue)
- Rake::Task['gitlab:db:drop_tables'].invoke
- puts_time 'done'.color(:green)
- Rake::Task['gitlab:backup:db:restore'].invoke
- rescue Gitlab::TaskAbortedByUserError
- puts "Quitting...".color(:red)
- exit 1
- end
- end
-
- Rake::Task['gitlab:backup:repo:restore'].invoke unless backup.skipped?('repositories')
- Rake::Task['gitlab:backup:uploads:restore'].invoke unless backup.skipped?('uploads')
- Rake::Task['gitlab:backup:builds:restore'].invoke unless backup.skipped?('builds')
- Rake::Task['gitlab:backup:artifacts:restore'].invoke unless backup.skipped?('artifacts')
- Rake::Task['gitlab:backup:pages:restore'].invoke unless backup.skipped?('pages')
- Rake::Task['gitlab:backup:lfs:restore'].invoke unless backup.skipped?('lfs')
- Rake::Task['gitlab:backup:terraform_state:restore'].invoke unless backup.skipped?('terraform_state')
- Rake::Task['gitlab:backup:registry:restore'].invoke unless backup.skipped?('registry')
- Rake::Task['gitlab:backup:packages:restore'].invoke unless backup.skipped?('packages')
- Rake::Task['gitlab:shell:setup'].invoke
- Rake::Task['cache:clear'].invoke
-
- if cleanup_required
- backup.cleanup
- end
-
- backup.remove_tmp
-
- puts "Warning: Your gitlab.rb and gitlab-secrets.json files contain sensitive data \n" \
- "and are not included in this backup. You will need to restore these files manually.".color(:red)
- puts "Restore task is done."
+ Backup::Manager.new(progress).restore
end
namespace :repo do
task create: :gitlab_environment do
- puts_time "Dumping repositories ...".color(:blue)
-
- max_concurrency = ENV.fetch('GITLAB_BACKUP_MAX_CONCURRENCY', 1).to_i
- max_storage_concurrency = ENV.fetch('GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY', 1).to_i
-
- if ENV["SKIP"] && ENV["SKIP"].include?("repositories")
- puts_time "[SKIPPED]".color(:cyan)
- elsif max_concurrency < 1 || max_storage_concurrency < 1
- puts "GITLAB_BACKUP_MAX_CONCURRENCY and GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY must have a value of at least 1".color(:red)
- exit 1
- else
- Backup::Repositories.new(progress, strategy: repository_backup_strategy).dump(
- max_concurrency: max_concurrency,
- max_storage_concurrency: max_storage_concurrency
- )
- puts_time "done".color(:green)
- end
+ Backup::Manager.new(progress).run_create_task('repositories')
end
task restore: :gitlab_environment do
- puts_time "Restoring repositories ...".color(:blue)
- Backup::Repositories.new(progress, strategy: repository_backup_strategy).restore
- puts_time "done".color(:green)
+ Backup::Manager.new(progress).run_restore_task('repositories')
end
end
namespace :db do
task create: :gitlab_environment do
- puts_time "Dumping database ... ".color(:blue)
-
- if ENV["SKIP"] && ENV["SKIP"].include?("db")
- puts_time "[SKIPPED]".color(:cyan)
- else
- begin
- Backup::Database.new(progress).dump
- puts_time "done".color(:green)
- rescue Backup::DatabaseBackupError => e
- progress.puts "#{e.message}"
- end
- end
+ Backup::Manager.new(progress).run_create_task('db')
end
task restore: :gitlab_environment do
- puts_time "Restoring database ... ".color(:blue)
- errors = Backup::Database.new(progress).restore
-
- if errors.present?
- warning = <<~MSG
- There were errors in restoring the schema. This may cause
- issues if this results in missing indexes, constraints, or
- columns. Please record the errors above and contact GitLab
- Support if you have questions:
- https://about.gitlab.com/support/
- MSG
-
- warn warning.color(:red)
- ask_to_continue
- end
-
- puts_time "done".color(:green)
+ Backup::Manager.new(progress).run_restore_task('db')
end
end
namespace :builds do
task create: :gitlab_environment do
- puts_time "Dumping builds ... ".color(:blue)
-
- if ENV["SKIP"] && ENV["SKIP"].include?("builds")
- puts_time "[SKIPPED]".color(:cyan)
- else
- begin
- Backup::Builds.new(progress).dump
- puts_time "done".color(:green)
- rescue Backup::FileBackupError => e
- progress.puts "#{e.message}"
- end
- end
+ Backup::Manager.new(progress).run_create_task('builds')
end
task restore: :gitlab_environment do
- puts_time "Restoring builds ... ".color(:blue)
- Backup::Builds.new(progress).restore
- puts_time "done".color(:green)
+ Backup::Manager.new(progress).run_restore_task('builds')
end
end
namespace :uploads do
task create: :gitlab_environment do
- puts_time "Dumping uploads ... ".color(:blue)
-
- if ENV["SKIP"] && ENV["SKIP"].include?("uploads")
- puts_time "[SKIPPED]".color(:cyan)
- else
- begin
- Backup::Uploads.new(progress).dump
- puts_time "done".color(:green)
- rescue Backup::FileBackupError => e
- progress.puts "#{e.message}"
- end
- end
+ Backup::Manager.new(progress).run_create_task('uploads')
end
task restore: :gitlab_environment do
- puts_time "Restoring uploads ... ".color(:blue)
- Backup::Uploads.new(progress).restore
- puts_time "done".color(:green)
+ Backup::Manager.new(progress).run_restore_task('uploads')
end
end
namespace :artifacts do
task create: :gitlab_environment do
- puts_time "Dumping artifacts ... ".color(:blue)
-
- if ENV["SKIP"] && ENV["SKIP"].include?("artifacts")
- puts_time "[SKIPPED]".color(:cyan)
- else
- begin
- Backup::Artifacts.new(progress).dump
- puts_time "done".color(:green)
- rescue Backup::FileBackupError => e
- progress.puts "#{e.message}"
- end
- end
+ Backup::Manager.new(progress).run_create_task('artifacts')
end
task restore: :gitlab_environment do
- puts_time "Restoring artifacts ... ".color(:blue)
- Backup::Artifacts.new(progress).restore
- puts_time "done".color(:green)
+ Backup::Manager.new(progress).run_restore_task('artifacts')
end
end
namespace :pages do
task create: :gitlab_environment do
- puts_time "Dumping pages ... ".color(:blue)
-
- if ENV["SKIP"] && ENV["SKIP"].include?("pages")
- puts_time "[SKIPPED]".color(:cyan)
- else
- begin
- Backup::Pages.new(progress).dump
- puts_time "done".color(:green)
- rescue Backup::FileBackupError => e
- progress.puts "#{e.message}"
- end
- end
+ Backup::Manager.new(progress).run_create_task('pages')
end
task restore: :gitlab_environment do
- puts_time "Restoring pages ... ".color(:blue)
- Backup::Pages.new(progress).restore
- puts_time "done".color(:green)
+ Backup::Manager.new(progress).run_restore_task('pages')
end
end
namespace :lfs do
task create: :gitlab_environment do
- puts_time "Dumping lfs objects ... ".color(:blue)
-
- if ENV["SKIP"] && ENV["SKIP"].include?("lfs")
- puts_time "[SKIPPED]".color(:cyan)
- else
- begin
- Backup::Lfs.new(progress).dump
- puts_time "done".color(:green)
- rescue Backup::FileBackupError => e
- progress.puts "#{e.message}"
- end
- end
+ Backup::Manager.new(progress).run_create_task('lfs')
end
task restore: :gitlab_environment do
- puts_time "Restoring lfs objects ... ".color(:blue)
- Backup::Lfs.new(progress).restore
- puts_time "done".color(:green)
+ Backup::Manager.new(progress).run_restore_task('lfs')
end
end
namespace :terraform_state do
task create: :gitlab_environment do
- puts_time "Dumping terraform states ... ".color(:blue)
-
- if ENV["SKIP"] && ENV["SKIP"].include?("terraform_state")
- puts_time "[SKIPPED]".color(:cyan)
- else
- Backup::TerraformState.new(progress).dump
- puts_time "done".color(:green)
- end
+ Backup::Manager.new(progress).run_create_task('terraform_state')
end
task restore: :gitlab_environment do
- puts_time "Restoring terraform states ... ".color(:blue)
- Backup::TerraformState.new(progress).restore
- puts_time "done".color(:green)
+ Backup::Manager.new(progress).run_restore_task('terraform_state')
end
end
namespace :registry do
task create: :gitlab_environment do
- puts_time "Dumping container registry images ... ".color(:blue)
-
- if Gitlab.config.registry.enabled
- if ENV["SKIP"] && ENV["SKIP"].include?("registry")
- puts_time "[SKIPPED]".color(:cyan)
- else
- begin
- Backup::Registry.new(progress).dump
- puts_time "done".color(:green)
- rescue Backup::FileBackupError => e
- progress.puts "#{e.message}"
- end
- end
- else
- puts_time "[DISABLED]".color(:cyan)
- end
+ Backup::Manager.new(progress).run_create_task('registry')
end
task restore: :gitlab_environment do
- puts_time "Restoring container registry images ... ".color(:blue)
-
- if Gitlab.config.registry.enabled
- Backup::Registry.new(progress).restore
- puts_time "done".color(:green)
- else
- puts_time "[DISABLED]".color(:cyan)
- end
+ Backup::Manager.new(progress).run_restore_task('registry')
end
end
namespace :packages do
task create: :gitlab_environment do
- puts_time "Dumping packages ... ".color(:blue)
-
- if ENV['SKIP'] && ENV['SKIP'].include?('packages')
- puts_time "[SKIPPED]".color(:cyan)
- else
- Backup::Packages.new(progress).dump
- puts_time "done".color(:green)
- end
+ Backup::Manager.new(progress).run_create_task('packages')
end
task restore: :gitlab_environment do
- puts_time "Restoring packages ...".color(:blue)
- Backup::Packages.new(progress).restore
- puts_time "done".color(:green)
+ Backup::Manager.new(progress).run_restore_task('packages')
end
end
- def puts_time(msg)
- progress.puts "#{Time.now} -- #{msg}"
- Gitlab::BackupLogger.info(message: "#{Rainbow.uncolor(msg)}")
- end
-
def progress
if ENV['CRON']
# We need an object we can say 'puts' and 'print' to; let's use a
@@ -360,16 +130,6 @@ namespace :gitlab do
$stdout
end
end
-
- def repository_backup_strategy
- if Feature.enabled?(:gitaly_backup, default_enabled: :yaml)
- max_concurrency = ENV['GITLAB_BACKUP_MAX_CONCURRENCY'].presence
- max_storage_concurrency = ENV['GITLAB_BACKUP_MAX_STORAGE_CONCURRENCY'].presence
- Backup::GitalyBackup.new(progress, max_parallelism: max_concurrency, storage_parallelism: max_storage_concurrency)
- else
- Backup::GitalyRpcBackup.new(progress)
- end
- end
end
# namespace end: backup
end