2013-12-16 9 views
8

db:schema:loaddb:migrateの代わりに実行したいと思っています。スキーマを実行する方法:最初のcapistrano 3をロードするrails appの

これはかなり以前はin this stack overflow questionと表示されていましたが、Capistrano 3では、deploy:coldというタスクが非推奨になりました。最初のデプロイメントは、それ以降のすべてのデプロイメントと同じではありません。

提案がありますか?ありがとう!

答えて

2

deploy:coldは、基本的に通常の展開タスクの複製として定義する必要がありますが、deploy:migrationsの代わりにdeploy:db_load_schemaです。たとえば、次のように

desc 'Deploy app for first time' 
task :cold do 
    invoke 'deploy:starting' 
    invoke 'deploy:started' 
    invoke 'deploy:updating' 
    invoke 'bundler:install' 
    invoke 'deploy:db_load_schema' # This replaces deploy:migrations 
    invoke 'deploy:compile_assets' 
    invoke 'deploy:normalize_assets' 
    invoke 'deploy:publishing' 
    invoke 'deploy:published' 
    invoke 'deploy:finishing' 
    invoke 'deploy:finished' 
end 

desc 'Setup database' 
task :db_load_schema do 
    on roles(:db) do 
    within release_path do 
     with rails_env: (fetch(:rails_env) || fetch(:stage)) do 
     execute :rake, 'db:schema:load' 
     end 
    end 
    end 
end 

それもデフォルトdeployに含まれたタスクは、時間の経過とともに変更される可能性があるとして、独立deploy:db_schema_loadタスクを実行する方が良いかもしれません。

それ種子がデータベースのテーブルを作成した後ので、私は実際に新鮮が展開するためのdb:setupを使用して:

desc 'Setup database' 
task :db_setup do 
    ... 
     execute :rake, 'db:setup' 
    ... 
end 
+0

ありがとうございます。展開を再現するという私の本能で私はより快適になりました。あなたの下に自分のバージョンを投稿しました。 – odigity

2

を、私は、あまりにも、カピストラーノに新しいです、とRailsアプリを展開する最初の時間のためにそれを使用しようとしていますパペットで設定したプロダクションサーバーに送信します。

最終的に私は自分自身のために何を決定するかを感じる前に、Capistranoのソース(とcapistrano/bundler、capistrano/rails、さらにはsshkitとnet-ssh)を掘り下げて、私が作りたいと思っていた変更。私はちょうどそれらの変更を完了し、私は結果に満足している:

# lib/capistrano/tasks/cold.rake 
namespace :deploy do 

    desc "deploy app for the first time (expects pre-created but empty DB)" 
    task :cold do 
    before 'deploy:migrate', 'deploy:initdb' 
    invoke 'deploy' 
    end 

    desc "initialize a brand-new database (db:schema:load, db:seed)" 
    task :initdb do 
    on primary :web do |host| 
     within release_path do 
     if test(:psql, 'portal_production -c "SELECT table_name FROM information_schema.tables WHERE table_schema=\'public\' AND table_type=\'BASE TABLE\';"|grep schema_migrations') 
      puts '*** THE PRODUCTION DATABASE IS ALREADY INITIALIZED, YOU IDIOT! ***' 
     else 
      execute :rake, 'db:schema:load' 
      execute :rake, 'db:seed' 
     end 
     end 
    end 
    end 

end 

デプロイ:デプロイ前に実行するタスクinidb:移行冷たいタスクは単に私のカスタム展開をフックします。このようにして、スキーマとシードがロードされ、実行する新しい移行がないため、後に続くdeploy:migrateステップは何もしません(安全に)。安全のために、deploy:coldを実行した場合にスキーマを読み込む前に、schema_migrationsテーブルがすでに存在するかどうかを調べます。

注:私は、プロペットを使用してDBを作成することを選択しましたので、私のプロダクションpostgresqlユーザにCREATEDB権限を与える必要はありませんが、カピストラノにそれを実行させたい場合は、 "execute:rake、 'db:create ':db:schema:loadの前に' 'を追加するか、3つの行をすべて' db:setup 'で置き換えてください。

+0

私はなぜ彼らがデプロイメントを削除したのかわかりません:カピストラーノ3の寒さ - それは私にとって正しいアプローチのようです。しかし、私のニーズに合わせて独自のバージョンを作ることに私を押し込んでくれてうれしいです。私は今、システムの内部動作を理解してうれしく思います。 – odigity

+0

'portal_production'とは何ですか? –

+0

本番データベースの名前。 – odigity

関連する問題