Rails アプリの初期デプロイのdb:schema:load
代わりに実行したいと思います。db:migrate
このスタック オーバーフローの質問に見られるように、これは以前はかなり些細なことでしたが、Capistrano 3 では、このdeploy:cold
タスクは非推奨になりました。最初のデプロイは、その後のすべてのデプロイと何ら変わりはありません。
助言がありますか?ありがとう!
Rails アプリの初期デプロイのdb:schema:load
代わりに実行したいと思います。db:migrate
このスタック オーバーフローの質問に見られるように、これは以前はかなり些細なことでしたが、Capistrano 3 では、このdeploy:cold
タスクは非推奨になりました。最初のデプロイは、その後のすべてのデプロイと何ら変わりはありません。
助言がありますか?ありがとう!
私もCapistranoは初めてで、Puppetで構成した本番サーバーにRailsアプリをデプロイするために初めてCapistranoを使用しようとしています。
最終的に、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
deploy:cold タスクは、カスタム deploy:inidb タスクをフックして deploy:migrate の前に実行するだけです。そうすることで、スキーマとシードがロードされ、その後に続く deploy:migrate ステップは (安全に) 何も実行しません。これは、実行する新しい移行がないためです。安全のために、もう一度 deploy:cold を実行する場合に備えて、スキーマをロードする前に schema_migrations テーブルが既に存在するかどうかをテストします。
注: Puppet を使用して DB を作成することを選択したので、実稼働の postgresql ユーザーに CREATEDB 権限を付与する必要がなくなりますが、Capistrano にそれを実行させたい場合は、「execute :rake, 'db:create'」をdb:schema:load にするか、3 行すべてを「db:setup」に置き換えます。
deploy:cold
基本的には通常のデプロイ タスクの複製として定義する必要がありますが、deploy:db_load_schema
代わりにdeploy:migrations
. 例えば:
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:db_schema_load
タスクを個別に実行することをお勧めします。deploy
db:setup
テーブルを作成した後にデータベースをシードするため、実際に新しい展開に使用します。
desc 'Setup database'
task :db_setup do
...
execute :rake, 'db:setup'
...
end