5

Wir haben 2 Instanzen hinter einem Load Balancer, der die gleiche Rails App mit Passagier betreibt. Bei der Bereitstellung führt die Startzeit des Servers zu Timeouts der Anforderungen. Als Ergebnis haben wir ein Skript, das jeden Webserver einzeln aktualisiert, indem er einen aus dem LB nimmt, mit cap entfaltet, einen dynamischen Seitenladevorgang testet und ihn wieder auf den LB setzt.Wie macht man eine rollende Deploy mit Capistrano?

Wie können wir Capistrano dazu bringen, dies mit einem Befehl für uns zu tun? Ich konnte es so einrichten, dass es gleichzeitig auf allen Instanzen bereitgestellt wird, aber alle gleichzeitig neu gestartet werden und die Site für 20 Sekunden nicht verfügbar ist.

Was fehlt mir hier? Scheint so, als sollte dies ein allgemeines Muster sein.

+0

Können Sie weitere Details im Hinweis "alle gleichzeitig neu starten" hinzufügen? Was genau hast du hier gemeint? –

Antwort

0

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.

Verwandte Themen