En el post anterior de esta guía: Integración continua: Automatizando la creación de repositorios con Git y Subversion desarrollamos un script en Bash para poder, como indica el título del post, automatizar la creación de repositorios. A continuación automatizamos la descarga del código fuente del cms, framework, plugins, módulos, temas, etc. que usará nuestro proyecto. Después realizamos una pequeña pausa para crear una máquina virtual por consola usando VirtualBox, y configurar e instalar Selenium para poder realizar test funcionales. Ahora vamos a realizar la creación de los proyectos, automatizando la instalación de los plugins, modulos y temas necesarios usando nuestra máquina virtual y Selenium.

Como es una de las partes que más código requiere, lo dividiré en dos post. En este primer post añadiremos algunas líneas a nuestro script en bash que nos permitirá automatizar la creación de nuestro proyecto usando Drupal, WordPress o Symfony 2.

¿Estás listo? Empezemos.

Preparando nuestro script en bash

En primer lugar vamos a mejorar el script en bash que crea los repositorios para que también realice todo el proceso de copia de archivos de todo el proyecto.

Empezamos añadiendo las siguientes variables a nuestro script después de la variables:

DIR_BASE_REPOS='/var/repos/'
  1. DIR_BASE_PROJECTS='/var/www/'
  2. DIR_SOURCES="${DIR_BASE_PROJECTS}dev/php_sources/"
  3. DIR_WORDPRESS="${DIR_SOURCES}wordpress-dev/"
  4. DIR_DRUPAL="${DIR_SOURCES}drupal-dev/"
  5. DIR_SYMFONY2="${DIR_SOURCES}symfony2-dev/"

 

Estas variables nos darán las rutas a los repositorios de los cms y frameworks descargados en el servidor de integración continua.

Localiza el siguiente código en tu script:

  1. #Dependiendo del tipo de repositorio elegido creamos las variables correspondientes
  2. #a la url y la ruta en el sistema de archivos
  3. if [ "$TIPO_REPOSITORIO" == 'git' ]
  4. then
  5. URI_REPO="${DIR_BASE_REPOS}${NOMBRE_REPOSITORIO}.git/"
  6. URL_REPO="${NOMBRE_REPOSITORIO}.git"
  7. elif [ "$TIPO_REPOSITORIO" == 'svn' ]
  8. then
  9. URI_REPO="${DIR_BASE_REPOS}$NOMBRE_REPOSITORIO"
  10. URL_REPO="$NOMBRE_REPOSITORIO"
  11. fi

 

Justo debajo añade el siguiente código:

  1. #Preguntamos por el código base a usar. CMS, framework o vacío
  2. echo '¿Qué cms o framework se utilizará?'
  3. echo '(drupal, wordpress, symfony2, custom)'
  4. read BASE_PROG
  5.  
  6. #Comprobamos que se ha elegido algo
  7. if [ -z $BASE_PROG ]
  8. then
  9. echo "Debe elegir un cms o framework. Adios."
  10. exit 0
  11. elif [ "$BASE_PROG" != 'drupal' ] && [ "$BASE_PROG" != 'wordpress' ] && [ "$BASE_PROG" != 'symfony2' ] && [ "$BASE_PROG" != 'custom' ]
  12. then
  13. echo "CMS erroneo. Adios."
  14. exit 0
  15. fi
  16.  
  17. if [ "$BASE_PROG" != 'custom' ]
  18. then
  19. echo 'Inicio la Máquina Virtual Ubuntu para configurar el cms y obtener una copia de la BD a usar si fuese necesario.'
  20. $(VBoxManage startvm Ubuntu --type headless)
  21. fi

 

Vamos por partes.

En primer lugar preguntamos al usuario que cms o framework va a utilizar. En nuestro caso solo disponemos de Drupal, WordPress y Symfony 2. Además he añadido la posibilidad de crear proyectos personalizados, que no tienen porqué tener un cms o framework; para este caso habría que indicar «custom«.

A continuación se comprueba que el usuario a introducido algún dato, y que este coincide con alguno de los cms o frameworks con los que podemos trabajar.

Por último, si el proyecto no es «custom» (personalizado), se inicia la máquina virtual, para poder tenerla lista en cuanto la necesitemos.

Localiza la siguiente línea:

mkdir ${TEMP_DIR_TRUNK}/sh

Justo debajo añade el siguiente código:

  1. if [ $TIPO_REPOSITORIO == 'git' ]
  2. then
  3. cp /var/www/dev/utils/gitignore-void ${TEMP_DIR_TRUNK}/metrics/phpcs/.gitignore
  4. cp /var/www/dev/utils/gitignore-void ${TEMP_DIR_TRUNK}/metrics/pdepend/.gitignore
  5. cp /var/www/dev/utils/gitignore-void ${TEMP_DIR_TRUNK}/metrics/phpcpd/.gitignore
  6. cp /var/www/dev/utils/gitignore-void ${TEMP_DIR_TRUNK}/metrics/phpmd/.gitignore
  7.  
  8. # Añado el archivo .gitignore a la raiz
  9. echo "Añado el archivo .gitignore a la raiz de la copia de trabajo"
  10. cp /var/www/dev/utils/gitignore-default ${TEMP_DIR_TRUNK}/.gitignore
  11. fi
  12.  
  13. if [ $BASE_PROG != 'custom' ]
  14. then
  15. #Copiamos el código base desde elcmsquesea-dev al archivo temporal
  16. echo "Copio los archivos de ${BASE_PROG} al directorio temporal"
  17.  
  18. COPY_FILES=$( cp -r "${DIR_SOURCES}${BASE_PROG}-dev/core/"* "${TEMP_DIR_TRUNK}/src" )
  19.  
  20. if [ $COPY_FILES ]
  21. then
  22. echo 'Algo falló.'
  23. echo $COPY_FILES
  24. exit 0
  25. fi
  26. fi

En el primer condicional, si el repositorio es Git, se añade un archivo llamado .gitignore a los directorios de las métricas, y a la raíz de la copia de trabajo. Una vez finalizados los cambios en el script explicaré el contenido de este archivo.

En el segundo condicional copiamos los archivos del cms o framework elegido al directorio src de la copia de trabajo del proyecto.

Busca el siguiente condicional:

 #Se hace un primer commit con el código base
 if [ "$TIPO_REPOSITORIO" == 'git' ]
 then
 git init
 $(git update-server-info)
 git remote add origin "ssh://nombre_usuario@repos.ic.net/${DIR_BASE_REPOS}${URL_REPO}"
 $(git add *)
 git commit -m "Commit inicial"
 $(git push origin master)
 elif [ "$TIPO_REPOSITORIO" == 'svn' ]
 then
 $(svn checkout http://repos.ic.net/$NOMBRE_REPOSITORIO $URI_REPO)
 $(svn commit -m "Commit inicial" http://repos.ic.net/$NOMBRE_REPOSITORIO)
 
 fi

Justo al finalizar el condicional añade las siguientes líneas:

  1. echo "Ahora se procederá con los plugins/add-ons/módulos y temas que corresponda para ${BASE_PROG}"
  2. if [ $BASE_PROG == 'wordpress' ]
  3. then
  4. /var/www/dev/utils/./content-wordpress.sh $TIPO_REPOSITORIO $URL_REPO $URI_REPO $TEMP_DIR_TRUNK $DIR_WORDPRESS $NOMBRE_REPOSITORIO
  5. fi
  6.  
  7. if [ $BASE_PROG == 'drupal' ]
  8. then
  9. /var/www/dev/utils/./content-drupal.sh $TIPO_REPOSITORIO $URL_REPO $URI_REPO $TEMP_DIR_TRUNK $DIR_DRUPAL $NOMBRE_RESPOSITORIO
  10. fi
  11.  
  12. if [ $BASE_PROG == 'symfony2' ]
  13. then
  14. /var/www/dev/utils/./content-symofny2.sh $TIPO_REPOSITORIO $URL_REPO $URI_REPO $TEMP_DIR_TRUNK $DIR_DRUPAL $NOMBRE_RESPOSITORIO
  15. fi

Estos últimos condicionales nos permitirán finalizar el script (para este post), y ejecutarán otro script en bash, mucho más específico, donde podremos indicarle qué temas, módulos y plugins queremos añadir al proyecto.

Creando el archivo .gitignore

En cada proyecto hay algunos directorios y archivos que no deseamos que se copien al repositorio. Para indicarle al sistema de control de versiones elegido qué directorios y archivos queremos que se ignoren utilizamos el archivo .gitignore (solo para Git. Para Subversion se haría de otra manera).

En el código del script tenemos dos lugares donde añadir el archivo .gitignore: los directorios de cada una de las métricas y la raíz de la copia de trabajo. Ambos archivos son diferentes, y por tanto tendremos que crear dos archivos genéricos diferentes para poder copiarlos en los proyectos.

Creamos un archivo llamado gitignore-void dentro de /var/www/dev/utils, con las siguientes líneas:

# Ignore everything in this directory
*
# Except this file
!.gitignore

Esto indicará a Git que ignore todos los archivos en ese directorio, excepto el archivo .gitignore.

Guardamos.

Creamos otro archivo llamado gitignore-default en el mismo directorio que el anterior. Añadimos las siguientes líneas:

/nbproject/
/nbproject/private/

Este archivo ignorará los directorios que genera NetBeans cuando crea un proyecto. Lo ideal es poner estos archivos fuera del proyecto en el que trabajamos, pero puede darse el error de que los pongamos en el mismo. Como estos directorios, y los archivos que contiene, no nos son de utilidad para el proyecto (excepto para el IDE), los ignoramos.

Guardamos el archivo.