capistranoのレシピ-開発マシンへの生産拠点のインポート

開発およびテストのために、実稼働ベースを取得する必要がある場合に状況が発生することがあります。

私はこのレシピをgemの一部として作成しましたが、現在は生産と開発のベースが同じ場合にのみ機能します(この場合はpostgresql)。 必要に応じて、他のベースを追加できます。



この目的のために(他の人にとっても)カピストラーノは私たちにとって完璧です。



レシピを使用するには、サーバーとローカルマシンに7zipをインストールする必要があります。

sudo apt-get --assume-yes install p7zip-full
      
      







このコードをCapfileに追加します。

...

 mac_os = `uname -a`.include?("Darwin") run_local_sudo_psql = mac_os ? "psql -h localhost -U postgres" : "#{sudo} -u postgres psql" run_local_psql = mac_os ? "psql -h localhost" : "psql" database_yml_path = "config/database.yml" config = YAML::load(capture("cat #{current_path}/#{database_yml_path}")) adapter = config[rails_env]["adapter"] database = config[rails_env]["database"] db_username = config[rails_env]["username"] db_password = config[rails_env]["password"] config = YAML::load(File.open(database_yml_path)) local_rails_env = 'development' local_adapter = config[local_rails_env]["adapter"] local_database = config[local_rails_env]["database"] local_db_username = config[local_rails_env]["username"] local_db_password = config[local_rails_env]["password"] set :local_folder_path, "tmp/backup" # you can set where to store *.sql.7z files on dev machine set :timestamp, Time.now.to_i # timestamp in seconds set :db_file_name, "#{database}-#{timestamp}.sql" # etc. app_production-1332404980.sql set :db_archive_ext, "7z" namespace :db do task :backup do file_name = fetch(:db_file_name) archive_ext = fetch(:db_archive_ext) dump_file_path = "#{shared_path}/backup/#{file_name}" output_file = "#{dump_file_path}.#{archive_ext}" run "mkdir -p #{shared_path}/backup" if adapter == "postgresql" run %{export PGPASSWORD="#{db_password}" && pg_dump -U #{db_username} #{database} > #{dump_file_path}} run "cd #{shared_path} && 7z a #{output_file} #{dump_file_path} && rm #{dump_file_path}" else puts "Cannot backup, adapter #{adapter} is not implemented for backup yet" end system "mkdir -p #{local_folder_path}" download(output_file, "#{local_folder_path}/#{file_name}.#{archive_ext}") end task :import do file_name = "#{db_file_name}.#{db_archive_ext}" file_path = "#{local_folder_path}/#{file_name}" if local_adapter == "postgresql" system "cd #{local_folder_path} && 7z x #{file_name}" system %{echo "drop database #{local_database}" | #{run_local_sudo_psql}} system %{echo "create database #{local_database} owner #{local_db_username};" | #{run_local_sudo_psql}} puts "ENTER your development password: #{local_db_password}" system "#{run_local_psql} -U#{local_db_username} #{local_database} < #{local_folder_path}/#{db_file_name}" system "rm #{local_folder_path}/#{db_file_name}" else puts "Cannot import, adapter #{local_adapter} is not implemented for backup yet" end end task :pg_import do if adapter == local_adapter db.backup db.import else puts "Sorry, but development and production adapters must be equals" end end end
      
      







仕組み:



cap db:pg_import



  1. サーバー上にフォルダー「#{project_name} / shared / backup」を作成します
  2. 実動ベースをこのフォルダーにダンプし、7zipをアーカイブします
  3. sshを介してプロジェクトフォルダー「tmp / backup」のローカルマシンに転送します
  4. 解凍して開発データベースにインポートします重要 :これを行う前に、現在のローカルデータベースを削除します



All Articles