No es tan fácil serializar la implementación en capistrano, a la que le gusta paralelizar todas sus operaciones entre servidores. Para volver a plantear el problema, parece que tiene un puñado de servidores y desea desconectarlos en secuencia para actualizar la implementación.
El truco es para anular la tarea deploy:create_symlink
en su configuración de implementación:
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
En este caso perform_task_offline
incluye comandos que se ejecutan en el servidor especificado en options
que eliminan desde el equilibrador de carga, mientras que yield
s del bloque incluido create_symlink_task
, que crea el enlace simbólico de implementación.
Debería poder ejecutar el comando estándar cap
para implementar, y verá que los servidores se desconectan secuencialmente, crean el enlace simbólico "actual" y vuelven a aparecer.
Tenga en cuenta que el código anterior realiza un seguimiento de los servidores que se han implementado con éxito con deployed_servers
. Si desea poder retrotraer una implementación fallada activa (es decir, la falla ocurre durante el despliegue mismo) en solo los servidores que se habían desplegado anteriormente, necesitará un bucle similar dentro de un bloque on_rollback do
, pero solo en el deployed_servers
.
¿Puede agregar más detalles en la nota "todos se reinician al mismo tiempo"? ¿Qué quieres decir exactamente aquí? –