Commit 38d23c0e5f816937047c9326f9dd33fb10490032
1 parent
b65903e0
Exists in
master
and in
4 other branches
Replace db:backup/restore with native mysq/pg solution
Showing
2 changed files
with
62 additions
and
41 deletions
Show diff stats
| ... | ... | @@ -0,0 +1,56 @@ |
| 1 | +require 'yaml' | |
| 2 | + | |
| 3 | +class Backup | |
| 4 | + attr_reader :config, :db_dir | |
| 5 | + | |
| 6 | + def initialize | |
| 7 | + @config = YAML.load_file(File.join(Rails.root,'config','database.yml'))[Rails.env] | |
| 8 | + @db_dir = File.join(Gitlab.config.backup.path, 'db') | |
| 9 | + FileUtils.mkdir_p(@db_dir) unless Dir.exists?(@db_dir) | |
| 10 | + end | |
| 11 | + | |
| 12 | + def backup_db | |
| 13 | + case config["adapter"] | |
| 14 | + when /^mysql/ then | |
| 15 | + system("mysqldump #{mysql_args} #{config['database']} > #{db_file_name}") | |
| 16 | + when "postgresql" then | |
| 17 | + pg_env | |
| 18 | + system("pg_dump #{config['database']} > #{db_file_name}") | |
| 19 | + end | |
| 20 | + end | |
| 21 | + | |
| 22 | + def restore_db | |
| 23 | + case config["adapter"] | |
| 24 | + when /^mysql/ then | |
| 25 | + system("mysql #{mysql_args} #{config['database']} < #{db_file_name}") | |
| 26 | + when "postgresql" then | |
| 27 | + pg_env | |
| 28 | + system("pg_restore #{config['database']} #{db_file_name}") | |
| 29 | + end | |
| 30 | + end | |
| 31 | + | |
| 32 | + protected | |
| 33 | + | |
| 34 | + def db_file_name | |
| 35 | + File.join(db_dir, 'database.sql') | |
| 36 | + end | |
| 37 | + | |
| 38 | + def mysql_args | |
| 39 | + args = { | |
| 40 | + 'host' => '--host', | |
| 41 | + 'port' => '--port', | |
| 42 | + 'socket' => '--socket', | |
| 43 | + 'username' => '--user', | |
| 44 | + 'encoding' => '--default-character-set', | |
| 45 | + 'password' => '--password' | |
| 46 | + } | |
| 47 | + args.map { |opt, arg| "#{arg}=#{config[opt]}" if config[opt] }.compact.join(' ') | |
| 48 | + end | |
| 49 | + | |
| 50 | + def pg_env | |
| 51 | + ENV['PGUSER'] = config["username"] if config["username"] | |
| 52 | + ENV['PGHOST'] = config["host"] if config["host"] | |
| 53 | + ENV['PGPORT'] = config["port"].to_s if config["port"] | |
| 54 | + ENV['PGPASSWORD'] = config["password"].to_s if config["password"] | |
| 55 | + end | |
| 56 | +end | ... | ... |
lib/tasks/gitlab/backup.rake
| ... | ... | @@ -109,11 +109,6 @@ namespace :gitlab do |
| 109 | 109 | end |
| 110 | 110 | end |
| 111 | 111 | |
| 112 | - ################################################################################ | |
| 113 | - ################################# invoked tasks ################################ | |
| 114 | - | |
| 115 | - ################################# REPOSITORIES ################################# | |
| 116 | - | |
| 117 | 112 | namespace :repo do |
| 118 | 113 | task :create => :environment do |
| 119 | 114 | backup_path_repo = File.join(Gitlab.config.backup.path, "repositories") |
| ... | ... | @@ -167,48 +162,18 @@ namespace :gitlab do |
| 167 | 162 | end |
| 168 | 163 | end |
| 169 | 164 | |
| 170 | - ###################################### DB ###################################### | |
| 171 | - | |
| 172 | 165 | namespace :db do |
| 173 | 166 | task :create => :environment do |
| 174 | - backup_path_db = File.join(Gitlab.config.backup.path, "db") | |
| 175 | - FileUtils.mkdir_p(backup_path_db) unless Dir.exists?(backup_path_db) | |
| 176 | - | |
| 177 | - puts "Dumping database tables ... ".blue | |
| 178 | - ActiveRecord::Base.connection.tables.each do |tbl| | |
| 179 | - print " * #{tbl.yellow} ... " | |
| 180 | - count = 1 | |
| 181 | - safe_tablename = ActiveRecord::Base.connection.quote_table_name(tbl) | |
| 182 | - File.open(File.join(backup_path_db, tbl + ".yml"), "w+") do |file| | |
| 183 | - ActiveRecord::Base.connection.select_all("SELECT * FROM #{safe_tablename}").each do |line| | |
| 184 | - line.delete_if{|k,v| v.blank?} | |
| 185 | - output = {tbl + '_' + count.to_s => line} | |
| 186 | - file << output.to_yaml.gsub(/^---\n/,'') + "\n" | |
| 187 | - count += 1 | |
| 188 | - end | |
| 189 | - puts "done".green | |
| 190 | - end | |
| 191 | - end | |
| 167 | + puts "Dumping database ... ".blue | |
| 168 | + Backup.new.backup_db | |
| 169 | + puts "done".green | |
| 192 | 170 | end |
| 193 | 171 | |
| 194 | 172 | task :restore => :environment do |
| 195 | - backup_path_db = File.join(Gitlab.config.backup.path, "db") | |
| 196 | - | |
| 197 | - puts "Restoring database tables (loading fixtures) ... " | |
| 198 | - Rake::Task["db:reset"].invoke | |
| 199 | - | |
| 200 | - Dir.glob(File.join(backup_path_db, "*.yml") ).each do |dir| | |
| 201 | - fixture_file = File.basename(dir, ".*" ) | |
| 202 | - print "#{fixture_file.yellow} ... " | |
| 203 | - if File.size(dir) > 0 | |
| 204 | - ActiveRecord::Fixtures.create_fixtures(backup_path_db, fixture_file) | |
| 205 | - puts "done".green | |
| 206 | - else | |
| 207 | - puts "skipping".yellow | |
| 208 | - end | |
| 209 | - end | |
| 173 | + puts "Restoring database ... ".blue | |
| 174 | + Backup.new.restore_db | |
| 175 | + puts "done".green | |
| 210 | 176 | end |
| 211 | 177 | end |
| 212 | - | |
| 213 | 178 | end # namespace end: backup |
| 214 | 179 | end # namespace end: gitlab | ... | ... |