Skip to content
Snippets Groups Projects
backup.rake 6.79 KiB
Newer Older
  • Learn to ignore specific revisions
  • require 'active_record/fixtures'
    
    namespace :gitlab do
    
      namespace :backup do
    
    Nihad Abbasov's avatar
    Nihad Abbasov committed
        # Create backup of GitLab system
    
        desc "GitLab | Create a backup of the GitLab system"
    
        task create: :environment do
    
          warn_user_is_not_gitlab
    
          configure_cron_mode
    
          Rake::Task["gitlab:backup:db:create"].invoke
          Rake::Task["gitlab:backup:repo:create"].invoke
    
          Rake::Task["gitlab:backup:uploads:create"].invoke
    
          Rake::Task["gitlab:backup:builds:create"].invoke
    
          Rake::Task["gitlab:backup:artifacts:create"].invoke
    
          Rake::Task["gitlab:backup:lfs:create"].invoke
    
          Rake::Task["gitlab:backup:registry:create"].invoke
    
          backup = Backup::Manager.new
          backup.pack
          backup.cleanup
          backup.remove_old
    
    Nihad Abbasov's avatar
    Nihad Abbasov committed
        # Restore backup of GitLab system
    
        desc 'GitLab | Restore a previously created backup'
    
        task restore: :environment do
    
          warn_user_is_not_gitlab
    
          configure_cron_mode
    
          backup = Backup::Manager.new
          backup.unpack
    
          unless backup.skipped?('db')
            unless ENV['force'] == 'yes'
    
              warning = <<-MSG.strip_heredoc
    
                Before restoring the database we recommend removing 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)
    
              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
    
            $progress.puts 'Cleaning the database ... '.color(:blue)
    
            Rake::Task['gitlab:db:drop_tables'].invoke
    
            $progress.puts 'done'.color(:green)
    
            Rake::Task['gitlab:backup:db:restore'].invoke
          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:lfs:restore'].invoke unless backup.skipped?('lfs')
    
          Rake::Task['gitlab:backup:registry:restore'].invoke unless backup.skipped?('registry')
    
          Rake::Task['gitlab:shell:setup'].invoke
    
        namespace :repo do
    
          task create: :environment do
    
            $progress.puts "Dumping repositories ...".color(:blue)
    
    
            if ENV["SKIP"] && ENV["SKIP"].include?("repositories")
    
              $progress.puts "[SKIPPED]".color(:cyan)
    
            else
              Backup::Repository.new.dump
    
              $progress.puts "done".color(:green)
    
          task restore: :environment do
    
            $progress.puts "Restoring repositories ...".color(:blue)
    
            Backup::Repository.new.restore
    
            $progress.puts "done".color(:green)
    
          task create: :environment do
    
            $progress.puts "Dumping database ... ".color(:blue)
    
    
            if ENV["SKIP"] && ENV["SKIP"].include?("db")
    
              $progress.puts "[SKIPPED]".color(:cyan)
    
            else
              Backup::Database.new.dump
    
              $progress.puts "done".color(:green)
    
          task restore: :environment do
    
            $progress.puts "Restoring database ... ".color(:blue)
    
            Backup::Database.new.restore
    
            $progress.puts "done".color(:green)
    
        namespace :builds do
          task create: :environment do
    
            $progress.puts "Dumping builds ... ".color(:blue)
    
    
            if ENV["SKIP"] && ENV["SKIP"].include?("builds")
    
              $progress.puts "[SKIPPED]".color(:cyan)
    
            else
              Backup::Builds.new.dump
    
              $progress.puts "done".color(:green)
    
            end
          end
    
          task restore: :environment do
    
            $progress.puts "Restoring builds ... ".color(:blue)
    
            Backup::Builds.new.restore
    
            $progress.puts "done".color(:green)
    
        namespace :uploads do
    
          task create: :environment do
    
            $progress.puts "Dumping uploads ... ".color(:blue)
    
    
            if ENV["SKIP"] && ENV["SKIP"].include?("uploads")
    
              $progress.puts "[SKIPPED]".color(:cyan)
    
            else
              Backup::Uploads.new.dump
    
              $progress.puts "done".color(:green)
    
          task restore: :environment do
    
            $progress.puts "Restoring uploads ... ".color(:blue)
    
            Backup::Uploads.new.restore
    
            $progress.puts "done".color(:green)
    
        namespace :artifacts do
          task create: :environment do
    
            $progress.puts "Dumping artifacts ... ".color(:blue)
    
    
            if ENV["SKIP"] && ENV["SKIP"].include?("artifacts")
    
              $progress.puts "[SKIPPED]".color(:cyan)
    
            else
              Backup::Artifacts.new.dump
    
              $progress.puts "done".color(:green)
    
            end
          end
    
          task restore: :environment do
    
            $progress.puts "Restoring artifacts ... ".color(:blue)
    
            Backup::Artifacts.new.restore
    
            $progress.puts "done".color(:green)
    
        namespace :lfs do
          task create: :environment do
    
            $progress.puts "Dumping lfs objects ... ".color(:blue)
    
    
            if ENV["SKIP"] && ENV["SKIP"].include?("lfs")
    
              $progress.puts "[SKIPPED]".color(:cyan)
    
            else
              Backup::Lfs.new.dump
    
              $progress.puts "done".color(:green)
    
            end
          end
    
          task restore: :environment do
    
            $progress.puts "Restoring lfs objects ... ".color(:blue)
    
            Backup::Lfs.new.restore
    
            $progress.puts "done".color(:green)
    
        namespace :registry do
          task create: :environment do
    
            $progress.puts "Dumping container registry images ... ".color(:blue)
    
            if Gitlab.config.registry.enabled
              if ENV["SKIP"] && ENV["SKIP"].include?("registry")
    
                $progress.puts "[SKIPPED]".color(:cyan)
    
              else
                Backup::Registry.new.dump
    
                $progress.puts "done".color(:green)
    
              $progress.puts "[DISABLED]".color(:cyan)
    
            end
          end
    
          task restore: :environment do
    
            $progress.puts "Restoring container registry images ... ".color(:blue)
    
            if Gitlab.config.registry.enabled
              Backup::Registry.new.restore
    
              $progress.puts "done".color(:green)
    
              $progress.puts "[DISABLED]".color(:cyan)
    
        def configure_cron_mode
          if ENV['CRON']
    
            # We need an object we can say 'puts' and 'print' to; let's use a
            # StringIO.
    
            require 'stringio'
            $progress = StringIO.new
          else
            $progress = $stdout
    
      end # namespace end: backup
    
    end # namespace end: gitlab