Skip to content

Instantly share code, notes, and snippets.

@wycleffsean
Created December 9, 2016 17:10
Show Gist options
  • Save wycleffsean/dc86575db92101d5afddadb3a55621b9 to your computer and use it in GitHub Desktop.
Save wycleffsean/dc86575db92101d5afddadb3a55621b9 to your computer and use it in GitHub Desktop.
Heroku Accio DB
namespace :accio do
desc "Drop/restore database from Heroku backup"
task :db do
Rake::Task['accio:download_backup'].invoke
Rake::Task['accio:restore_backup'].invoke
end
desc "Download database dump from Heroku"
task :download_backup => [:logger_no_env, '~/.netrc'] do |t, args|
return Rails.logger.error('curl not installed') unless \
command?('curl')
Rails.logger.info "Downloading Heroku database backup"
Bundler.with_clean_env do
url = `heroku pg:backups public-url --app itsallgravy`.chomp
`curl -o #{filename} '#{url}'`
end
end
desc "drops db and restores from backup"
task :restore_backup => [:logger] do |t, args|
return Rails.logger.error('pg_restore not installed') unless \
command?('pg_restore')
return Rails.logger.error('no db backup found') unless \
File.exists?(filename)
ActiveRecord::Base.connection
db_config = ActiveRecord::Base.connection_config
database = db_config[:database]
username = db_config[:username]
host = db_config[:host]
Rails.logger.info "Drop/creating database"
Rake::Task['db:drop'].invoke
Rake::Task['db:create'].invoke
Rails.logger.info "Restoring from database backup"
cmd = []
cmd << 'pg_restore'
cmd << "-d #{database}"
cmd << "-U #{username}"
cmd << "-h #{host}"
cmd << "#{filename}"
system cmd.join(' ')
end
end
def command?(command)
system "which #{command} > /dev/null 2>&1"
end
def filename
"#{Rails.root}/tmp/db/backup.dump"
end
# Heroku authentication
file '~/.netrc' do
Rake::Task[:heroku_login].invoke
end
task :heroku_login do
require 'pty'
require 'expect'
require 'io/console'
Bundler.with_clean_env do
PTY.spawn('heroku login') do |reader, writer, pid|
print reader.expect(/: /).join
writer.write $stdin.gets
print reader.expect(/: /).join
writer.write $stdin.noecho(&:gets)
print reader.gets rescue Errno::EIO
Process.wait(pid)
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment