11

Rails アプリの初期デプロイのdb:schema:load代わりに実行したいと思います。db:migrate

このスタック オーバーフローの質問に見られるように、これは以前はかなり些細なことでしたが、Capistrano 3 では、このdeploy:coldタスクは非推奨になりました。最初のデプロイは、その後のすべてのデプロイと何ら変わりはありません。

助言がありますか?ありがとう!

4

2 に答える 2

3

私も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」に置き換えます。

于 2015-01-17T16:03:27.963 に答える
2

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
于 2014-08-02T23:42:26.993 に答える