Deploy automatizado con Capistrano

Capistrano

Además picar código, últimamente también me estoy dedicando a labores de devOp en stat4you. Prefiero pasar mi tiempo programando y estaba pasando mucho tiempo haciendo despliegues en servidores. Por eso busqué cómo automatizar el proceso y lo que encontré fue Capistrano, una herramienta de automatización multiservidor.

Capistrano es una gema ruby que está preparada para hacer despliegues de aplicaciones rails. Con algo de personalización permite hacer despliegues de cualquier tipo de aplicación. En resumen es una herramienta que permite ejecutar comandos bash en servidores remotos.

Configuracion básica

Lo primero es instalar Capistrano

gem install capistrano

Luego con el comando capify se genera la configuración básica

capify .

Esto genera una serie de ficheros de configuración

.
├── Capfile
└── config
    └── deploy.rb

En mi caso como no utilizo rails en el fichero Capfile comenté la primera linea para no cargar las tareas por defecto de rails

# load 'deploy'

En las primeras lineas del fichero config/deploy.rb está la configuración del servidor

role :web, "root@you-server"

Definir nuevas tareas

Por ejemplo, una tarea para ver los logs del servidor se podría definir como

task :logs, :roles => :app do
    # task code...
end

Para ejecutar esta tarea

cap logs

Las tareas se pueden agrupar en namespaces

namespace :solr do
    task :start, :roles => :app do
        # task code...
    end
end
cap solr:start

Documentación completa del módulo de configuración

Acciones

Capistrano viene con algunos métodos que podemos utilizar dentro de las tareas

get "remotePath", "localPath"
put "localPath", "remotePath"
run "ls -l"
returnValue = capture "ls -l"
stream "tail -f file"

Documentación completa del módulo de acciones

¿Cómo uso Capistrano?

En stat4you utilizamos un servidor de integración continua que se encarga de hacer las compilaciones que se van a desplegar. Mi proceso de deploy consiste en bajar la última versión compilada del servidor de integración continua, subirla al servidor y hacer el despliegue. Es algo parecido a esto

task :deploy, :roles => :app do
    `wget -O /tmp/stat4you.war http://ciserver/stat4you-last-build.war`
    upload "/tmp/stat4you.war", "/deploy/stat4you.war"
    run "service server stop"
    run "mv /deploy/stat4you.war /tomcat/webapps/stat4you.war"
    run "service server start"
end

Otra tarea muy útil es esta que permite ver los logs del servidor

task :logs, :roles => :app do
    stream "tail -f /tomcat/logs/catalina.out"
end

Conclusion

Automatiza todo lo que puedas, ya sea con Capistrano o con alguna otra herramienta del estilo. Ahorra mucho tiempo y reduce los errores que puedes cometer en el proceso.

Comments