0

Capistrano を使用して、複数の Rails アプリを単一の EC2 インスタンスにデプロイしてきました。アプリはすべて Apache + Passenger で提供されます。それらのほとんどを形成する展開フェーズは次のとおりです。

-- コードを取得し、メイン アプリ ディレクトリの「releases/[timestamp]」サブディレクトリにステージングします。

-- 段階的なリリースのためにバンドラーを実行します

-- 段階的リリースの移行を実行します

-- ステージ リリース用のアセット コンパイル ("assets:precompile") rake タスクを実行します。

--delayed_job タスク キュー処理デーモンとその他のバックグラウンド プロセスを再起動します。

-- ステージングされたリリースを "current" (パッセンジャー Web ルート) にシンボリック リンクします。

-- パッセンジャーを再起動します (アプリ ディレクトリの「tmp/restart」をタッチして)

これは非常に標準的な Rails のデプロイ手順です。その大きなボトルネックが、それを必要とする各タスクのレール環境のロードであることに気付きました。私の大きなアプリの 1 つで、環境の読み込みに 40 秒以上かかり、それが Rails 環境を必要とする n 個のタスク (バンドラー、マイグレーション、アセットのコンパイル、delayed_job デーモンの実行) に対して n 回繰り返されます。これが素朴な質問である場合は申し訳ありませんが、これらすべてのタスクに対して一度だけ環境をロードする簡単な方法があるかどうか疑問に思っていました (できれば、これらすべてのタスク/ジョブの実装をロードする単一の rake タスクに統合するよりも簡単です)環境)。

4

2 に答える 2

0

更新:私は最終的に、これがうまく機能する独自のソリューションを作成しました。Rails 環境に依存する各コマンドをシェルから (Capistrano の "run" メソッドを使用して) 個別に実行する代わりに、それらを Rails 環境に依存する単一の rake タスクにまとめました。以前は "rake db:migrate" を実行してから "rake assets:precompile" などを実行していましたが、"Rake::Task['db:migrate'].invoke" と "Rake ::Task['assets:precompile'].invoke". 環境は一度だけロードされるようになりました。

于 2012-07-19T13:14:43.303 に答える
0

これについてはvagrantを調べることをお勧めします。これは、展開するための迅速かつ簡単な方法です。vagrant ボックスのカスタマイズには、 chefを使用します。リストしたアイテムのほとんどをヒットするために、独自のレシピ (シェフのこと..) を作成したいと思うと思います。それが終わったら、あなたは行っていいです。

于 2012-06-30T23:02:54.597 に答える