18 Mayo 2012 ~ 7 Comments

Despliegue del servidor de desarrollo a producción usando git

Desde hace algunos días teníamos la inquietud de como mejorar el proceso de paso de nuestras aplicaciones del servidor de desarrollo a producción sin tener que hacerlo manualmente usando el viejo y fastidioso método de copia manual de archivos, y lo admito esto muchas veces incluía copiar en una hoja los archivos que habías modificado para luego pasarlos.

Ahora bien, como el proyecto ya esta un poco más maduro y las necesidades de controlar el codigo fuente se han hecho imperativas empece con uno de los proyectos que por el momento es mas popular, git. Y es que si detallas los últimos desarrollos open-source especialmente los desarrollados para web todos están haciendo uso de github. Así pues me coloque en la tarea de instalar servidores con copias de git propias y realizar el proceso como debería hacerse!

Entonces, si tienes un servidor de desarrollo y quieres usar un método mas seguro de controlar las versiones y el proceso de despliegue a producción de la aplicación este tutorial es para ti.

Partamos de que en este tutorial no tocaremos de forma profunda todas las posibilidades de git, solo veremos como copiar y mantener el código de nuestra aplicación que se encuentra en el servidor de prueba al de desarrollo.

 En el servidor de producción

Para empezar si estamos trabajando sobre una aplicación web lo que haremos será dirigirnos al directorio raíz del servidor web  y allí crearemos los directorios de la aplicación, algo así:

cd /var/www/  mkdir -p mi_aplicacion/public_html
mkdir -p mi_aplicacion_dev/public_html
chgrp -R users mi_aplicacion
chgrp -R users mi_aplicacion_dev
chmod 777 mi_aplicacion/public_html
chmod 777 mi_aplicacion_dev/public_html

 

Configuración del servidor remoto git

Una vez creados los directorios debemos crear un usuario que será el encargado de subir de forma remota las actualizaciones hasta este servidor. En mi caso he creado el usuario git. Así que nos logeamos como el usuario git ( su -git) y creamos en el home de este usuario (o donde lo prefieras) el directorio del proyecto

mkdir proyecto.git && cd proyecto.git git init --bare

 

Configurar la publicación

Aun dentro del usuario git ejecutamos

vim hooks/post-update

Y copiamos el siguiente código que es un script en bin/bash que aparte de actualizar el repositorio te permite sobre la carpeta que creamos en la raíz del servidor web, copiar el código fuente sin necesidad de ejecutar nada desde el servidor recordando cambiar las rutas por las rutas que estés utilizando en tu servidor

#!/bin/sh  echo $1
echo "*UPDATE*"
case " $1 " in *'refs/heads/develop'*)
      GIT_WORK_TREE=/var/www/mi_aplicacion_develop/public_html git checkout develop
      echo 
      echo "Dev was pulled"
      echo
      ;;
esac
case " $1 " in *'refs/heads/master'*)
      GIT_WORK_TREE=/var/www/mi_aplicacion/public_html git checkout master
      echo
      echo "Master was pulled"
      echo
      ;;
esac

Finalmente nos aseguramos de que el archivo tenga permisos de ejecución con:

chmod +x hooks/post-update

 

Configuración del proyecto local

En el servidor de desarrollo vamos entonces a crear una nueva carpeta

mkdir appjudavi.com && cd appjudavi.com

 

Configuración local del servidor git

Ahora vamos al directorio donde tenemos nuestro desarrollo donde vamos a inicializar el proyecto de git

git init git add . 

En el caso que existan directorios que no quieres agregar al repositorio puesto que no quieres que estos se copien al servidor de producción utilizamos. Generalmente los directorios que no queremos que se desplacen a producción son los relacionados con logs o configuraciones especiales del servidor de desarrollo.

git rm -rf --cached app/logs git rm -rf --cached app/logs

Y luego enviamos este repositorio a nuestro servidor de producción

git commit -q -m 'Primera versión del código fuente' 
git remote add web git@[numero de ip]:proyecto.git 
git push web +master:refs/heads/master 

Esto en otras palabras lo que indica es que hemos enviado a producción el código fuente que teníamos en este directorio haciendo uso de git, que ademas cuando fue recibido por el servidor de producción lo que hace es llevar un control de versiones de los archivos subidos y copiar al directorio web una copia de trabajo de este código.

Para revisar si se realizaron o no los cambios ahora deberías visitar el directorio raíz del servidor web, sobre ese directorio se debería ver una copia de los archivos de desarrollo y claramente se debieron haber obviado los directorios que indicaste.

 

Versión de desarrollo, versión maestra

 

Eventualmente cuando avances en el proyecto tendrás una versión maestra de la aplicación y una versión de desarrollo y es que en ultimas este es uno de los verdaderos propósitos de git, poder tener un estricto control de versiones que le permita a varios desarrolladores trabajar sobre proyectos colaborativos sin que la gestión del código fuente se convierta en un lio.

 

Para las diferentes versiones de nuestra aplicación debemos tener en cuenta que en git podemos tener “ramas” o branch de esta misma, para ver en que branch te encuentras usaremos:

git branch

Para crear un nuevo branch podemos usar:

git branch develop

Para pasar a esta rama y quedarnos trabajando sobre ella:

git checkout develop

Ahora prueba realizar un cambio a un archivo del proyecto, y aceptemos los cambios como lo hariamos normalmente  para luego usar commit para enviar las modificaciones:

git commit -am 'Cambio en la versión de desarrollo del proyecto'

Estas modificaciones quedaron en git pero en la rama “desarrollo” de nuestro proyecto, si ademas queremos subir estos cambios al servidor de producción a una sección de prueba podemos usar:


git push web +develop:refs/heads/develop


Como quizás ya lo has notado estos cambios van al servidor de producción, pero toman un camino distinto, se reflejaran en el directorio develop que creamos.

Finalmente es de notar que git tiene muchísimas funcionalidades pero si necesitas empezar rápido esta puede ser una buena solución inicial. Los recursos adicionales que están a continuación seguramente te ayudaran más en el proceso de aprendizaje ademas de que git es solo una de las opciones que hay disponibles en el mercado, así que ¿Que formas utilizas tu para pasar tu aplicaciones del servidor de desarrollo a producción?

Recursos adicionales

Newtricks: Tutorial base que utilice para construir este

Modelo de ramas de Git 

El libro de Git en español

Share and Enjoy:
  • Print
  • Digg
  • StumbleUpon
  • del.icio.us
  • Facebook
  • Yahoo! Buzz
  • Twitter
  • Google Bookmarks
  • Add to favorites
  • Live

7 Responses to “Despliegue del servidor de desarrollo a producción usando git”

  1. jona 22 Agosto 2012 at 4:34 pm Permalink

    Hola! He realizado un proceso muy similar al que publicas, y logro exitosamente realizar el primer push al server, y los cambios se efectuan en la carpeta destinada del mismo.

    Sin embargo, no consigo realizar más cambios al hacer push. Supongamos que localmente edito/agrego un archivo realizo:
    git add .
    git commit -m “..”
    git push master

    Obtengo la siguiente respuesta del servidor
    Counting objects … done
    Compressing … done
    Writing … done
    Total …
    remote: refs/heads/master
    remote: *UPDATE*
    remote: Already in master
    remote: M
    remote:
    remote: Master was pulled
    to [user]@[domain]:/dir/.git
    ….. master -> master

    El push si parece realizarse, pero no se ve reflejado la modificación del archivo y se marca con M a la salida del remoto. Rechaza la petición de escritura?

    No encuentro más información sobre esto tan específico que me ocurre. Espero me puedas dar una idea de qué sucede.

    Muchas Gracias.

  2. jona 22 Agosto 2012 at 4:37 pm Permalink

    encerré el nombre del archivo entre menor y mayor y se interpretó como html.

    ilustraba el uso de un archivo index.html por ejemplo

    y la respuesta del remoto, ante una modificación del mismo y al hacer push es

    remote: M index.html

  3. johan 7 Septiembre 2012 at 3:29 am Permalink

    Hola Jona, tenía el mismo problema que tú lo he solucionado añadiendo esto en el script:

    GIT_WORK_TREE=/var/www/mi_aplicacion/public_html git checkout -f master

    Con checkout -f obligamos a sobreescribir los cambios, de la otra forma es como si solo nos avisara del fichero que se ha modificado.

    Si se le ocurre a alguien una solución más elegante que lo comunique.

    Buen post Judavi me ha sido muy útil. Saludos!

  4. Hernando Bocanegra 12 Diciembre 2012 at 3:29 pm Permalink

    Hola judavi estoy siguiendo tu tutorial pero tengo muchas duas en este punto “Configuración del servidor remoto git” podrias especificar un poco mas. Ya que me surgen muchas dudas si debo crear este usuario git en el servidor de producción y si los directorio q alli voy a crear son los que contendran la app en producción?

  5. Hernando Bocanegra 12 Diciembre 2012 at 3:30 pm Permalink

    Hola judavi estoy siguiendo tu tutorial pero tengo muchas duas en este punto “Configuración del servidor remoto git” podrias especificar un poco mas. Ya que me surgen muchas dudas si debo crear este usuario git en el servidor de producción y si los directorio q alli voy a crear son los que contendran la app en producción?

    Muchas gracias por tu ayuda y de antemano excelente tuto!!!

  6. judavi 12 Diciembre 2012 at 4:29 pm Permalink

    Hola Hernando…
    Respecto a tu pregunta, si si debes crear un usuario en el servidor de producción, pues es a través de el será que podrás enviar tus cambios de desarrollo a producción. Y los directorios que van a quedar si quedan en producción, pero al final tu pones a apuntar tu Apache al directorio que quieras …
    Igual si quieres deberias hacer primero una prueba local, prueba con un archivo, y haces el “envio” de desarrollo a producción, si las cosas te salen bien siguiendo los pasos pues ya procedes a ir con tu aplicación en serio.
    Cualquier cosa escribe. Gracias por tu comentario 😉

  7. Hernando Bocanegra 12 Diciembre 2012 at 4:59 pm Permalink

    Gracias judavi por atender con prontitud a mis inquietudes y paso a comentarte que ya logre pasar archivos de desarrollo a mi servidor de producción y creo que estoy listo para iniciar el despliegue de cambios en mi aplicación con esta herramienta.

    Muchas gracias y excelente aporte!!!

    Feliz navidad


Vamos! Deja un comentario :)