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 |