Es ist nicht so einfach, die Bereitstellung in capistrano serialisieren, die alle ihre Operationen zwischen Servern parallelisiert. Um das Problem zu beheben, scheint es so, als hätten Sie eine Handvoll Server und möchten diese nacheinander offline schalten, um die Bereitstellung zu aktualisieren.
Der Trick ist, die deploy:create_symlink
Aufgabe in der Bereitstellung Konfiguration außer Kraft zu setzen:
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
In diesem Fall perform_task_offline
Befehle, die in options
angegeben auf dem Server ausführen enthält, die es aus dem Load-Balancer entfernen, während es yield
s der Block einschließlich create_symlink_task
, der den Bereitstellungs-Symlink erstellt.
Sie sollten dann in der Lage sein, den Standard-Befehl cap
zu implementieren, und Sie werden sehen, dass die Server nacheinander offline gehen, den "aktuellen" Symlink erstellen und dann wieder auftauchen.
Beachten Sie, dass der obige Code die Server protokolliert, auf denen erfolgreich deployed_servers
bereitgestellt wurde. Wenn Sie eine aktive fehlgeschlagene Bereitstellung (dh der Fehler tritt während der Bereitstellung selbst) nur auf den Servern wiederherstellen möchten, auf denen zuvor eine Bereitstellung bereitgestellt wurde, benötigen Sie eine ähnliche Schleife innerhalb eines Blocks on_rollback do
über nur die deployed_servers
.
Können Sie weitere Details im Hinweis "alle gleichzeitig neu starten" hinzufügen? Was genau hast du hier gemeint? –