10

そのため、私はレール (ruby 1.9.3p392、レール 3.2、sqlite3 db) をいじっており、ユビキタスなブログ チュートリアル コードを「実稼働」サーバー (Apache、パッセンジャー、ubuntu) にデプロイしようとしています。私の deploy.rb は次のようになります。

require 'bundler/capistrano'
require 'rvm/capistrano'
load 'deploy/assets'
set :rvm_ruby_string,  ENV['GEM_HOME'].gsub(/.*\//,"")
set :rvm_type, :user
set :user, 'blah'
set :application, 'railsTest'
set :domain, 'www.blah.com'
set :applicationdir, "/home/sean/public/blah.com/public"
set :scm, 'git'
set :repository,  "ssh://blah@1.1.1.1/home/blah/public/bla.com/public/capDep.git"
#set :git_enable_submodules, 1 # if you have vendored rails
set :branch, 'master'
set :git_shallow_clone, 1
set :scm_verbose, true
set :use_sudo, false


# roles (servers)
role :web, domain
role :app, domain
role :db,  domain, :primary => true

# deploy config
set :deploy_to, applicationdir
set :deploy_via, :export
set :migrate_target, :latest
# additional settings
default_run_options[:pty] = true  # Forgo errors when deploying from windows
#ssh_options[:keys] = %w(/home/blah/.ssh/id_rsa)
ssh_options[:forward_agent] = true
# if you want to clean up old releases on each deploy uncomment this:

# If you are using Passenger mod_rails uncomment this:
namespace :deploy do
  task :start do ; end
  task :stop do ; end
  task :restart, :roles => :app, :except => { :no_release => true } do
    run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
  end
end

#after "deploy:update_code", "deploy:migrate"

さて、カピストラーノで何をしているのかを知っている人にとっては、それは大きな混乱のように見えるに違いないと確信していますが、私は完全にルーブです. 最終的に、私の不備にもかかわらず、展開はうまくいくようです。なぜなら、次を実行すると

cap deploy:setup
cap deploy

私のアプリは稼働しており、できるという理由だけで、レールによって作成された Web UI を介してデータベースのテーブルにいくつかの行を追加します。ここで、大胆に移行を作成し、テーブルに列を追加します。変更を git にプッシュします。恐ろしいことに、私が走るとき

cap deploy

すべての移行が実行され、テーブルが再作成され、すべてのデータが破壊されます。この苦しいプロセスを何度か繰り返しました。私の schema_migrations テーブルは次のようになります。

20130620210004
20130620220229
20130628213331
20130628214946
20130628223002

ここで何が欠けていますか?

更新: 私は最近、コマンド ラインで deploy:migrations を実行し、それを deploy.rb から削除することに関する @TheMahrvin の提案を行いました。うまくいきませんでした...もう一度、すべての移行が実行されました。サーバー自体で db:migrate を実行してみることにしたので、ミューズが耳元で何かささやいたに違いありません。「rake」だけを実行した後、この出力を見て驚いた:

  20130717230110 CreateHighScores
  20130717230342 CreateGames
  20130717231041 AddGameTypeToGame
  20130717233707 AddGamePublisherToGame
  20130717234124 AddGameRatingToGame
  20130731210558 AddGameMechanicToGame

最後の移行のみを保留にする必要があります。したがって、おそらくこれは Capistrano ではまったく問題ではありません (それを反映するために、この質問のタイトルを更新しました)。では、以前の移行がまだ保留中としてフラグ付けされているのはなぜですか? 私はそれらが過去に実行されたことを知っています。これは、出力でそれらを確認し、実行後に db スキーマを確認したためです。

更新#2: 別の移行をセットアップし、サーバーにsshして、「現在の」ディレクトリに移動します。これは、カピストラーノをまったく理解していれば(大きなチャンス)、現在のファイルがある場所です。ランニング

bundle exec rake db:migrate:status

私を得た:

 Status   Migration ID    Migration Name
--------------------------------------------------
  down    20130717230110  Create high scores
  down    20130717230342  Create games
  down    20130717231041  Add game type to game
  down    20130717233707  Add game publisher to game
  down    20130717234124  Add game rating to game
  down    20130731210558  Add game mechanic to game
  down    20130731212454  Add publish year to game
  down    20130731214515  Add game rank to game
  down    20130731214928  Add game abbr to game
  down    20130731215749  Add crazy field to game

自分がやろうとしていることは何か根本的に間違っていると感じずにはいられない.

4

3 に答える 3

9

OK、それを理解しました... ただし、スタックスフィアの他の誰かが、私の最初の質問の赤いニシンに基づいて同じことをするはずだった方法は、私を超えています.

問題は、本番データベースが

db/production.sqlite3

メイン プロジェクト ディレクトリにある sqlite データベースだったので、実行するたびに axed されていました。

cap deploy

それから、私が走るとき

cap deploy:migrate

空のデータベースを見つけて、すべての移行を実行する必要があると判断します。データベースパスをに変更することでこれを解決しました

/my_absolute_path/shared/db/production.sqlite3

@TheMahvin と私の言葉遣いの悪い質問に答えるという絶望的な仕事を引き受けようとした他の人に感謝します!

この質問に対する H/T は、私の目からうろこを落としました。

カピストラーノはワイプデータベースを展開しますか?

于 2013-07-31T23:24:58.367 に答える