実際にサーバー間ですべての操作を並列化することが大好きなカピストラーノでの展開をシリアライズするのは簡単ではありません。この問題を解決するには、少数のサーバーがあり、展開を更新するために各サーバーを順番にオフラインにする必要があるようです。
トリックはあなたの展開構成でdeploy:create_symlink
タスクをオーバーライドすることである。この場合、
def perform_task_offline options
sudo "take_this_server_offline", options
yield
sudo "put_this_server_online", options
end
def create_symlink_task options
# does what your existing deploy:create_symlink did, something like:
run "rm -f /web/current && ln -s #{release_path} /web/current", options
end
namespace :deploy do
task :create_symlink, {once: true, except: {no_release: true}} do
deployed_servers = Array.new
roles[:app].servers.each do |current_server|
options = {hosts: current_server}
deployed_servers.push current_server
perform_task_offline(options) { create_symlink_task options }
end
end
end
perform_task_offline
はしばらくそれyield
のロードバランサから削除options
で指定されたサーバー上で実行するコマンドが含まれてブロックにはcreate_symlink_task
が含まれており、展開シンボリックリンクが作成されます。
標準のcap
コマンドを実行すると、サーバーは順次オフラインになり、「現在の」シンボリックリンクが作成され、次に復帰します。
上記のコードは、正常に展開されたサーバーをdeployed_servers
で追跡することに注意してください。以前にデプロイされていたサーバー上で、アクティブな失敗したデプロイメントをロールバックできるようにする(つまり、デプロイ中にが発生する)場合は、on_rollback do
ブロック内で同様のループが必要ですが、 deployed_servers
のみ
「すべて同時に再起動する」というメモに詳細を追加できますか?あなたはここで何を意味したのですか? –