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 @@ | @@ -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,11 +109,6 @@ namespace :gitlab do | ||
| 109 | end | 109 | end |
| 110 | end | 110 | end |
| 111 | 111 | ||
| 112 | - ################################################################################ | ||
| 113 | - ################################# invoked tasks ################################ | ||
| 114 | - | ||
| 115 | - ################################# REPOSITORIES ################################# | ||
| 116 | - | ||
| 117 | namespace :repo do | 112 | namespace :repo do |
| 118 | task :create => :environment do | 113 | task :create => :environment do |
| 119 | backup_path_repo = File.join(Gitlab.config.backup.path, "repositories") | 114 | backup_path_repo = File.join(Gitlab.config.backup.path, "repositories") |
| @@ -167,48 +162,18 @@ namespace :gitlab do | @@ -167,48 +162,18 @@ namespace :gitlab do | ||
| 167 | end | 162 | end |
| 168 | end | 163 | end |
| 169 | 164 | ||
| 170 | - ###################################### DB ###################################### | ||
| 171 | - | ||
| 172 | namespace :db do | 165 | namespace :db do |
| 173 | task :create => :environment do | 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 | end | 170 | end |
| 193 | 171 | ||
| 194 | task :restore => :environment do | 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 | end | 176 | end |
| 211 | end | 177 | end |
| 212 | - | ||
| 213 | end # namespace end: backup | 178 | end # namespace end: backup |
| 214 | end # namespace end: gitlab | 179 | end # namespace end: gitlab |