test rails jamon golondrinas deploy ruby capistrano

ruby - rails - Creación de una tarea de Capistrano que realiza diferentes tareas según el rol



capistrano vs jenkins (6)

Estoy buscando una manera de llamar a una sola tarea de Capistrano para realizar diferentes tareas en diferentes roles. ¿Capistrano puede hacer esto o tengo que escribir una tarea específica para cada rol?


En realidad no:

% cat capfile server ''localhost'', :role2 task :task1, :roles=>:role1 do puts ''task1'' end task :task2 do task1 end % cap task2 * executing `task2'' * executing `task1'' task1

El: roles param se pasa más allá para ejecutar el comando, etc., pero no parece afectar la ejecución de la tarea.

Lo sentimos, no encontré la forma de poner un comentario en un comentario, así que lo he escrito aquí.


Hay una manera, una especie de Consulte: http://weblog.rubyonrails.org/2006/8/30/capistrano-1-1-9-beta/ y verá que puede anular los roles predeterminados usando la variable de entorno ROLES.

Tengo una tarea definida como:

desc "A simple test to show we can ssh into all servers" task :echo_hello, :roles => :test do run "echo ''hello, world!''" end

El rol de :test se asigna a un servidor.

En la línea de comandos, puedo ejecutar:

[james@fluffyninja bin]$ cap echo_hello ROLES=lots_of_servers

Y la tarea ahora se ejecutará en el rol lots_of_servers.

No he verificado que esto funcione dentro de un script ruby ​​actualizando el hash ENV , pero este es un buen comienzo.


La forma estándar de hacer esto en Capistrano:

task :whatever, :roles => [:x, :y, :z] do x_tasks y_tasks z_tasks end task :x_tasks, :roles => :x do #... end task :y_tasks, :roles => :y do #... end task :z_tasks, :roles => :z do #... end

Entonces sí, necesita escribir tareas separadas, pero puede llamarlas desde una tarea principal y se filtrarán adecuadamente.


Solo para el registro, esta podría ser una solución usando Capistrano 3:

desc "Do something specific for 3 different servers with 3 different roles" task :do_something do on roles(:api_role), in: :sequence do # do something in api server end on roles(:app_role), in: :sequence do # do something in application server end on roles(:another_role), in: :sequence do # do something in another server end end

La definición del servidor para realizar la tarea "do_something" en un servidor de aplicaciones sería algo como:

server ''application.your.domain'', user: ''deploy'', roles: %w{app_role}

Luego puede llamar a la tarea (hay varias formas de hacerlo) y la tarea ejecutará instrucciones específicas de acuerdo con el "app_role".


Tambien puedes hacer

task :foo do run "command", :roles => :some_role upload "source", "destination", :roles => :another_role end