August 16th, 2012 Category: Ambiente de Desarrollo linux Programacion
14 Comments »

Entiendase deploy como el proceso de subir nuestro codigo/db/cambios en general a determinado ambiente. En este caso vamos a hablar del deploy en produccion.

Hoy estaba escuchando que el comando rsync es terriblemente avanzado para el uso comun y que seria una buena alternativa usar FTP, o Dropbox (WTF?).

Voy a tratar de desmitificar esto.

Primero quiero hacer una aclaracion, es importante entender que si bien es correcto que usemos control de versiones para desarrollar no es correcto usar el control de versiones en el servidor.

En el control de versiones que mas le guste o les toque trabajar, ya sea git, svn, mercurial, etc. nosotros necesitamos guardar todo lo que realmente requiera de un versionado, esto tiene que entenderse como codigo no binario. Cuando hablamos de una imagen por ejemplo, la imagen puede sufrir variaciones porque un desarrollador decidio cambiarle el tamaño a las imagenes en portadas que tenemos en el slider, estas imagenes pueden ir variando constantemente pero no tenemos que analizar su codigo para ver como va variando en las dferentes versiones, no necesitamos hacer un code review tampoco, no tiene ningun sentido guardar en un versionado las imagenes, ademas tenemos el costo extra que las imagenes (generalmente), ocupan mucho espacio y a ese espacio, ese espacio se le tiene que sumar el archivo que usa el control de versiones para chequear si sufrio cambios y que cambios fueron. Lo cual estamos duplicando espacio sobre algo que no nos interesa llevar un versionado. Lo mismo pasa con los PDF, zip, .doc, etc.

Entonces solo vamos a versionar codigo, ese codigo puede contener por ejemplo, nuestros tests, archivos para hacer pruebas locales, archivos de ambiente, etc. No hace falta que el codigo de los tests este en produccion, nosotros no vamos a correr test unitario en produccion, ya se supone que fue probado en los distintos ambientes, por lo cual su espacio en el servidor es inecesario, lo mismo con los archivos de ambiente, para que necesito la configuracion de mi ambiente de desarrollo si estoy en produccion?. Para que necesito ocupar espacio en disco de los archivos que necesita git para validar si hay cambios, si no voy a hacer commit desde el server?, o no deberia.

Que pasa si mis imagenes las tengo que subir a un servidor de CDN y no al servidor donde esta el codigo? de que me sirve que el server del codigo tambien contenga las imagenes?

Todo muy lindo pero esto es engorroso hacerlo a mano, como hago todo el deploy en una linea de bash?

Muy simple con rsync.

Que hace este comando magico? Basicamente lee un directorio, y lo compara con otro directorio y establece que archivos se modificaron y cuales tiene que pisar. Una vez que los identifico los actualiza.

Su funcionalidad en contra de la creencia “popular” es muy simple.

Supongamos que localmente tenemos dos directorios con copias exactas de su conteinido, pero en uno de ellos decido editar un archivo o agregar uno nuevo. Pero quiero sincronizarlos.

Entonces voy a ejecutar lo siguiente

 $ rsync -avz /home/pablo/directorioModificado/ /home/pablo/directorioSinModificar/

Simplemente escribimos el comando, tres simples parametros (letras), y el directorio modificado y el directorio a modificar.

Yo use rsync -avz, estas 3 letras significan diferentes opciones que yo quiero de rsync.

“a”, esta letra sirve para que rsync sincronice todo el arbol de directorios manteniendo las fechas de actualizacion, permisos, y link simbolicos (Gracias Rodrigo por la aclaracion)

“v”, verbose, muchos comandos en linux tienen la opcion verbose, que basicamente significa si va a mostrar el detalle en pantalla o no. Rsync sin esta opcion no nos va a mostrar el detalle de que archivos esta sincronizando.

“z”, esta opcion es muy importante cuando queremos hacer sincronizaciones remotas, como por ejemplo a nuestro servidor, esta opcion sirve para comprimir los datos que van a viajar por la red.

En el caso que quiseramos hacer lo mismo pero en una carpeta remota hacemos lo siguiente.

  $ rsync -avz /home/pablo/directorioModificado/ user@midominio.com:/home/pablo/directorioSinModificar/

Aca la conexion se va a dar a un servidor remoto, via ssh, por lo cual vamos a especificarle nuestro usuario de ssh (user), el dominio en el que nos vamos a conectar (dominio.com), y vamos agregar el dos puntos (:) y concatenarle la ruta a la carpeta correspondiente en el servidor.

En mi caso el codigo para deployar codigo en el servidor es el siquiente.

 $ rsync -avz ~/Workspace/paintball/ user@dondejugarpaintball.com:/var/www/paintball/

A esta linea yo voy a excluirle la carpeta imgs, .git, y tests. Entonces voy a usar el atributo exclude de rsync, este atributo va a sincronizar todos los archivos y carpetas, menos los que yo indique que se excluyan.

 $ rsync -avz ~/Workspace/paintball/ --exclude tests --exclude .git --exclude public/imgs user@dondejugarpaintball.com:/var/www/paintball/

Ahora recordar todo esto puede ser tedioso, y para eso tenemos los alias. vamos a nuestro archivo ~/.bashrc y agregamos un alias que reemplace toda la linea anterior por un simple sync-paintball

alias sync-paintball="rsync -avz ~/Workspace/paintball/ --exclude tests --exclude .git --exclude public/imgs user@dondejugarpaintball.com:/var/www/paintball/"

Cargamos el nuevo bashrc.

$ source ~/.bashrc

y ejecutamos

$ sync-paintball

Y listo, una vez que termina de sincronizar los archivos voy al sitio en produccion y ya tengo todo actualizado. Si falla algo, cosa que puede pasar, puedo solucionarlo desde mi ambiente local y volver a sincronizarlo, o en el caso que sea algo interno del servidor me conecto al mismo y lo resuelvo. Pero en el mayor de los caso no va a hacer falta.

Podriamos aplicar lo mismo para sincronizar las imagenes a nuestro servidor de CDN.

Recuerden que cada vez que abran una conexion ssh con rsync van a necesitar escribir el password de usuario en el servidor.

Subscribe to me on YouTube

Comentar


14 Responses

Gildus 2012-08-16 22:56:13
Buen detalle con el rsync, habia escuchado que hasta se pueden hacer replicas de BD.

Arnold Roa 2012-08-17 02:02:19
Interesante tu comentario sobre lo de que las imágenes no deberian ir en el control de versiones, yo, por sentido común pienso lo mismo, pero a la practica... siempre terminan estando en el repositorio,

De que manera trabajas tu entonces con las imágenes y demas archivos binarios?

Lo de rsync ya lo uso, una ventaja es que si tienes el .ssh/config puedes pasarle el username/host por alias, y olvidarte te autentificarte

vfmBOFH 2012-08-17 05:44:12
Arnold Roa: Rsync puede establecer diferencias en archivos binarios también. Así que puedes utilizarlo para sincronizar directorios que contengan este tipo de archivos.

Manolito 2012-08-17 05:55:46
Debes tener algún problema con la tecla de las tildes porque no has puesto ni una.

Por cierto, “deployar” se traduce literalmente del inglés como desplegar, palabra totalmente válida para el uso que le has dado en el artículo (desplegar una aplicación en producción).

Rodrigo 2012-08-17 07:36:17
La verdad es que rsync es una de las herramientas más potentes que conozco. La llevo años usando como mi sistema de copias de seguridad totales e incrementales, y no hay nada que se le acerque remotamente.

Una aclaración: La opción -a de rsync no sirve estrictamente para lo que especificas, ésa es la opción -r.
La opción -a se corresponde con archive (archivar) e incluye bastante más cosas a parte de buscar recursivamente en los directorios.
Exactamente activa todas estas opciones:
-r (busca recursivamente en el árbol);
-l ( copia enlaces simbólicos como tales);
-p (mantiene permisos de los archivos);
-t (conserva fechas de modificación);
-g (conserva intacto el grupo dueño);
-o (conserva intacto al usuario [solo si eres root]);
-D (conserva los archivos especiales de dispositivo [sólo si eres root])

Por lo tanto la opción -a no es adecuada si únicamente queremos sincronizar todo el subárbol recursivamente, para ello deberíamos usar -r.
Rogaría que aclarases este detalle en el post original, para no inducir a error a alguien que sea nuevo en el uso de rsync.

Y una última cosa, estoy totalmente de acuerdo con Manolito, ese nuevo verbo "deployar" suena fatal. En español se puede utilizar tanto desplegar como implantar para traducir deploy (según el contexto, aunque desplegar encaja en el 95% de las ocasiones), y no hace falta recurrir a anglicismos.

Un saludo!

Gabriel 2012-08-17 10:14:20
Otra opción útil para mantener el directorio de código de producción limpio es agregar el parámetro --delete.
Esta opción elimina los archivos que están en el destino y no en el origen.

Hay que tener cuidado de excluir los directorios donde se guarden datos (imágenes que suba el usuario, etc), pero es útil para evitar que el sitio de producción quede con código obsoleto que no debería estar ahí (podría ser un serio problema de seguridad en algunos casos).

Pablo Morales 2012-08-17 10:33:33
@manolito @rodrigo en España puede sonar bien desplegar, aca lo unico que se despliega es el mantel de la mesa y el ala de los aviones.

Gracias por la aclaracion @rodrigo ahora lo corrijo para que quede bien el porque la opcion a

Saludos.

Pablo Morales 2012-08-17 10:35:25
Buen dato Gabi

manolet@gmail.com 2012-08-17 10:40:58
@vfmBOFH Yo me refiero a como maneja Pablo sus imagenes y demás archivos binarios. Dice que no las tiene en el repositorio, Cómo las comparte con los otros desarrolladores?, cual es la estructura de directorio que maneja en sus proyectos para tenerlas separadas del repositorio? etc.

Respecto al comentario de Pablo, en México también suena bien desplegar, en Colombia, Venezuela y Perú tambien, en chile y argentina no estoy seguro, pero lo que si estoy seguro es que lo que si suena horrible es "deployar".

Más para un titulo.

Pablo Morales 2012-08-17 10:48:45
@manolet depende, por un lado podes tener un servidor que contenga las imagenes, y podes sincronizarlas y directamente usarlas desde ese servidor los unicos que deberian editar esas imagenes serian los disenadores. En el caso que las necesites tambien en tu ambiente local podrias descargarte esas imagenes con un rsync a tu carpeta local.

off topic: Nosotros (Argentina) tendemos a castellanizar los verbos, como deployar, codear, surfear, synquear etc. :)

Anibal 2012-08-17 12:45:57
Muy buen articulo. Lo que habria q agregarle es alguna opcion para guardar copias ...
Por cualquier error que pueda subirse y rompa todo para poder volver para atras.


Saludos !

Gildus 2012-08-17 13:13:49
En Perú suena bien deployar ...xD

Leonardo Vidarte 2012-08-22 10:55:03
Muy bueno el artículo, rsync es muy útil, y también se lo puede ejecutar como un servicio :)

Daniel 2012-09-06 12:54:57
Tambien se puede usar la b cuando antes de eliminar el o los archivos antes se hace un backup y luego se reemplaza o se elimina, por ejemplo:

rsync -avvb --delete --backup-dir=$PWD/rsync/backup_$(date +%y%m%d%H%M) /home/pablo/directorioModificado/ /home/pablo/directorioSinModificar/

Saludos desde Perú.