namespace :backup do desc 'Restore and database and :backup_dirs from the git :backup_repo, with the TAG given' task restore: :get_config do pull_repo(tag) sh "rake db:restore #{@backup_path}/db.sql" @asset_folders.each do |folder| dest_folder = "#{Rails.root}/#{folder}" sh "mkdir -p #{dest_folder}" unless File.directory?(dest_folder) sh "cp -r #{@backup_path}/#{folder}/* #{dest_folder}" end end end desc 'Commits and tag the database dump and :backup_dirs into a git :backup_repo' task backup: ["db:backup", :get_config] do pull_repo # Gather data sh "mv #{@dump_file} #{@backup_path}" @asset_folders.each do |folder| dest_folder = "#{@backup_path}/#{folder}" sh "mkdir -p #{dest_folder}" unless File.directory?(dest_folder) sh "cp -Lr #{Rails.root}/#{folder}/* #{dest_folder}" end # Pushing data comment = "#{@app_name} backup at #{Time.now.strftime "%F %R"}" sh "git add --all && git commit -m '#{comment}'" do |ok, res| if ! ok puts "Nothing change since last backup" else sh "git push origin master" end end # Tagging tagname = if tag.blank? "#{@app_name}-#{Date.today.strftime "%Y%m%d" }" else tag end sh "git tag -a #{tagname} -m '#{comment}' -f" sh "git push origin #{tagname}" end task :get_config do @environment = Rails.env @app_name = Rails.application.class.parent_name.parameterize tmp_dir = "#{Rails.root}/tmp" @repo_path = "#{tmp_dir}/backup" @backup_path = "#{@repo_path}/#{@app_name}" @dump_file = "#{tmp_dir}/db.sql" @git_repo = Rails.configuration.backup_repo @asset_folders = Rails.configuration.backup_dirs end def tag name = ARGV[1] task name.to_sym do ; end unless name.nil? return name end def pull_repo(tag="") if File.directory?(@repo_path) cd "#{@repo_path}" sh "git pull origin master" else sh "git clone #{@git_repo} #{@repo_path}" cd "#{@repo_path}" end sh "git checkout tags/#{tag}" unless tag.blank? end