INTRODUCCIÓN

Capistrano es un proyecto open-source que permite ejecutar tareas en máquinas remotas vía SSH. Está desarrollada en Ruby y se utiliza de forma muy extendida para deployar aplicaciones en los entornos de preproducción y producción de forma sencilla (a partir de ahora llamaremos a estas máquinas frontales).

En este post veremos una breve introducción y una configuración standard y sencilla para realizar un simple deploy, pero capistrano ofrece una gran variedad de opciones avanzadas que no veremos hoy.

En nuestro caso utilizaremos capistrano 2.15.5, pero ya existe release de la versión 3 y podemos encontrar toda la información necesaria en http://capistranorb.com/. Para ello tendremos que tener instalado en nuestra máquina de deploy (a partir de ahora la llamaremos local) Ruby y RubyGems.

ESTRATEGIAS

Capistrano nos presenta dos escenarios a la hora de deployar una aplicación en los frontales, en uno de ellos es la máquina local quien realiza la subida del código hacia los frontales y en el otro son los frontales los encargados de obtener el código desde un SCM. Hablaremos de estas 2 estrategias como push y pull. Para la estrategia push Capistrano ofrece un único sistema llamado copy, mientras que para la segunda estrategia ofrece 3 variantes: export, checkout y remote_cache. En nuestro caso utilizaremos la estrategia push y por tanto el sistema copy debido a que la estrategia pull nos obliga a tener acceso al SCM desde todos los frontales y resolver las dependencias de nuestro proyecto en cada uno de ellos.

PUSH

strategy_b.png

PULL

strategy_a.png

Además, nuestro proyecto tiene una serie de dependencias de librerías de terceros que necesitamos resolver antes del deploy, y por tanto, tenemos otro motivo por el que utilizar la estrategia push. Estas dependencias las resolvemos mediante composer y bower en la máquina local y luego serán deployadas en los frontales.

FLUJO DE DEPLOYMENT

En la siguiente gráfica vemos marcado en azul el primer paso antes del deploy que es la preparación de los frontales, este paso solo se debe realizar una vez. Tras eso se pueden realizar tantos deploys como sean necesarios y seguirán los pasos indicados posteriormente.

Capistrano Execution Path.jpg

VAMOS A DEPLOYAR

Vamos a utilizar MAC OS (Maverich) como máquina local de deploy y CentOS como frontal.

Lo primero que necesitamos es tener Ruby instalado en nuestra máquina local, tal y como habíamos comentado antes. Para ello utilizaremos RVM:

Captura de pantalla 2014-11-08 a la(s) 23.46.05.png

y luego instalaremos la gema de capistrano:

Captura de pantalla 2014-11-07 a la(s) 09.21.47.png

En nuestro ejemplo utilizaremos Git como SCM y utilizaremos la estrategia Push. Pero antes de eso tenemos que preparar el frontal para deployar el código. Creamos el usuario con el que deployaremos (asumimos que entre la máquina local y el frontal se han cruzado claves para poder acceder vía SSH sin necesidad de password):

Captura de pantalla 2014-11-10 a la(s) 09.16.32.png

y añadimos el usuario al grupo www:

Captura de pantalla 2014-11-10 a la(s) 09.16.38.png

Ahora creamos el directorio donde subiremos el código:

Captura de pantalla 2014-11-10 a la(s) 09.20.13.png

Una vez tenemos nuestro frontal listo y en nuestra máquina local ya tenemos Capistrano instalado, vamos a preparar nuestro proyecto para deployar con Capistrano.

Captura de pantalla 2014-11-10 a la(s) 09.30.01.png

Esta última instrucción nos generará el archivo Capfile en la raíz de nuestro proyecto y el fichero config/deploy.rb con una plantilla de configuración:

Captura de pantalla 2014-11-10 a la(s) 09.35.11.png

Vamos a configurar nuestro fichero de deploy:

  • Setearemos la variable application con el nombre de nuestra aplicación

  • En repository pondremos los datos de nuestro repo git y descomentaremos la línea donde le indicamos que nuestro scm es git.

  • Definiremos únicamente un role que atacará nuestro frontal

  • Definiremos el usuario con el que capistrano debe lanzar las tareas en nuestro frontal mediante la variable user. Y para que no lance los comando con sudo definimos la variable use_sudo a false.

  • Además le indicaremos la carpeta donde capistrano debe deployar la aplicación en el servidor mediante la variable deploy_to

  • Y con la variable deploy_via le indicaremos la estrategia para deployar.

Por tanto nuestro fichero de deploy quedará de la siguiente manera:

Captura de pantalla 2014-11-10 a la(s) 10.13.04.png

Ahora que ya tenemos nuestro proyecto con Capistrano configurado para deployar, solo nos falta hacer el setup en nuestro frontal y podremos empezar a deployar. Para hacer el setup lanzamos el siguiente comando en nuestra máquina local en la raíz de nuestro workspace:

Captura de pantalla 2014-11-10 a la(s) 10.22.45.png

y con este comando veremos que Capistrano nos generará la siguiente estructura de carpetas en el frontal

[deploy_to]

[deploy_to]/releases

[deploy_to]/shared

[deploy_to]/shared/log

[deploy_to]/shared/pids

[deploy_to]/shared/system

Bien, pues ya lo tenemos todo listo para poder lanzar el primer deploy:

Captura de pantalla 2014-11-10 a la(s) 10.28.55.png

Y esto nos generará dentro de releases una carpeta donde tendremos la actual release y en deploy_to un softlink a esta release llamado current. Ahora solo nos quedaría configurar el apache o nginx para atacar a este path.

[deploy_to]

[deploy_to]/releases

[deploy_to]/releases/20141107001122

[deploy_to]/releases/…

[deploy_to]/shared

[deploy_to]/shared/log

[deploy_to]/shared/pids

[deploy_to]/shared/system

[deploy_to]/current -> [deploy_to]/releases/20141107001122

ENLACES DE INTERÉS

Wiki de la versión 2 de capistrano https://github.com/capistrano/capistrano/wiki

Documentación Capistrano versión 3 http://capistranorb.com/

Capifony: Proyecto para deployar aplicaciones Symfony basado en Capistrano http://capifony.org/

 

Leave a reply

 

Your email address will not be published.