BigW Consortium Gitlab

backup.rake 6.45 KB
Newer Older
1 2 3
require 'active_record/fixtures'

namespace :gitlab do
4
  namespace :backup do
Nihad Abbasov committed
5
    # Create backup of GitLab system
6
    desc "GitLab | Create a backup of the GitLab system"
7
    task create: :environment do
8
      warn_user_is_not_gitlab
9
      configure_cron_mode
10

11 12
      Rake::Task["gitlab:backup:db:create"].invoke
      Rake::Task["gitlab:backup:repo:create"].invoke
13
      Rake::Task["gitlab:backup:uploads:create"].invoke
14
      Rake::Task["gitlab:backup:builds:create"].invoke
15
      Rake::Task["gitlab:backup:artifacts:create"].invoke
16
      Rake::Task["gitlab:backup:lfs:create"].invoke
17
      Rake::Task["gitlab:backup:registry:create"].invoke
18

19 20 21 22
      backup = Backup::Manager.new
      backup.pack
      backup.cleanup
      backup.remove_old
23 24
    end

Nihad Abbasov committed
25
    # Restore backup of GitLab system
26
    desc 'GitLab | Restore a previously created backup'
27
    task restore: :environment do
28
      warn_user_is_not_gitlab
29
      configure_cron_mode
30

31 32
      backup = Backup::Manager.new
      backup.unpack
33

34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
      unless backup.skipped?('db')
        unless ENV['force'] == 'yes'
          warning = 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
          ask_to_continue
          puts 'Removing all tables. Press `Ctrl-C` within 5 seconds to abort'.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 ... '.blue
        Rake::Task['gitlab:db:drop_tables'].invoke
        $progress.puts 'done'.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')
58
      Rake::Task['gitlab:backup:registry:restore'].invoke unless backup.skipped?('registry')
59
      Rake::Task['gitlab:shell:setup'].invoke
60

61
      backup.cleanup
62 63
    end

64
    namespace :repo do
65
      task create: :environment do
66
        $progress.puts "Dumping repositories ...".blue
67 68 69 70 71 72 73

        if ENV["SKIP"] && ENV["SKIP"].include?("repositories")
          $progress.puts "[SKIPPED]".cyan
        else
          Backup::Repository.new.dump
          $progress.puts "done".green
        end
74 75
      end

76
      task restore: :environment do
77
        $progress.puts "Restoring repositories ...".blue
78
        Backup::Repository.new.restore
79
        $progress.puts "done".green
80 81 82
      end
    end

83
    namespace :db do
84
      task create: :environment do
85
        $progress.puts "Dumping database ... ".blue
86 87 88 89 90 91 92

        if ENV["SKIP"] && ENV["SKIP"].include?("db")
          $progress.puts "[SKIPPED]".cyan
        else
          Backup::Database.new.dump
          $progress.puts "done".green
        end
93 94
      end

95
      task restore: :environment do
96
        $progress.puts "Restoring database ... ".blue
97
        Backup::Database.new.restore
98
        $progress.puts "done".green
99 100
      end
    end
101

102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
    namespace :builds do
      task create: :environment do
        $progress.puts "Dumping builds ... ".blue

        if ENV["SKIP"] && ENV["SKIP"].include?("builds")
          $progress.puts "[SKIPPED]".cyan
        else
          Backup::Builds.new.dump
          $progress.puts "done".green
        end
      end

      task restore: :environment do
        $progress.puts "Restoring builds ... ".blue
        Backup::Builds.new.restore
        $progress.puts "done".green
      end
    end

121
    namespace :uploads do
122
      task create: :environment do
123
        $progress.puts "Dumping uploads ... ".blue
124 125 126 127 128 129 130

        if ENV["SKIP"] && ENV["SKIP"].include?("uploads")
          $progress.puts "[SKIPPED]".cyan
        else
          Backup::Uploads.new.dump
          $progress.puts "done".green
        end
131 132
      end

133
      task restore: :environment do
134
        $progress.puts "Restoring uploads ... ".blue
135
        Backup::Uploads.new.restore
136 137 138 139
        $progress.puts "done".green
      end
    end

140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
    namespace :artifacts do
      task create: :environment do
        $progress.puts "Dumping artifacts ... ".blue

        if ENV["SKIP"] && ENV["SKIP"].include?("artifacts")
          $progress.puts "[SKIPPED]".cyan
        else
          Backup::Artifacts.new.dump
          $progress.puts "done".green
        end
      end

      task restore: :environment do
        $progress.puts "Restoring artifacts ... ".blue
        Backup::Artifacts.new.restore
        $progress.puts "done".green
      end
    end

159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
    namespace :lfs do
      task create: :environment do
        $progress.puts "Dumping lfs objects ... ".blue

        if ENV["SKIP"] && ENV["SKIP"].include?("lfs")
          $progress.puts "[SKIPPED]".cyan
        else
          Backup::Lfs.new.dump
          $progress.puts "done".green
        end
      end

      task restore: :environment do
        $progress.puts "Restoring lfs objects ... ".blue
        Backup::Lfs.new.restore
        $progress.puts "done".green
      end
    end

178 179 180 181
    namespace :registry do
      task create: :environment do
        $progress.puts "Dumping container registry images ... ".blue

182 183 184 185 186 187 188
        if Gitlab.config.registry.enabled
          if ENV["SKIP"] && ENV["SKIP"].include?("registry")
            $progress.puts "[SKIPPED]".cyan
          else
            Backup::Registry.new.dump
            $progress.puts "done".green
          end
189
        else
190
          $progress.puts "[DISABLED]".cyan
191 192 193 194 195
        end
      end

      task restore: :environment do
        $progress.puts "Restoring container registry images ... ".blue
196 197 198 199 200 201
        if Gitlab.config.registry.enabled
          Backup::Registry.new.restore
          $progress.puts "done".green
        else
          $progress.puts "[DISABLED]".cyan
        end
202 203 204
      end
    end

205 206
    def configure_cron_mode
      if ENV['CRON']
207 208
        # We need an object we can say 'puts' and 'print' to; let's use a
        # StringIO.
209 210 211 212
        require 'stringio'
        $progress = StringIO.new
      else
        $progress = $stdout
213 214
      end
    end
215
  end # namespace end: backup
216
end # namespace end: gitlab