Deploy automatizado con 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.