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/'

[codesyntax lang=»bash»]

DIR_BASE_PROJECTS='/var/www/'
DIR_SOURCES="${DIR_BASE_PROJECTS}dev/php_sources/"
DIR_WORDPRESS="${DIR_SOURCES}wordpress-dev/"
DIR_DRUPAL="${DIR_SOURCES}drupal-dev/"
DIR_SYMFONY2="${DIR_SOURCES}symfony2-dev/"

[/codesyntax]

 

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:

[codesyntax lang=»bash»]

	#Dependiendo del tipo de repositorio elegido creamos las variables correspondientes 
	#a la url y la ruta en el sistema de archivos
	if [ "$TIPO_REPOSITORIO" == 'git' ]
	then
		URI_REPO="${DIR_BASE_REPOS}${NOMBRE_REPOSITORIO}.git/"
		URL_REPO="${NOMBRE_REPOSITORIO}.git"
	elif [ "$TIPO_REPOSITORIO" == 'svn' ]
	then
		URI_REPO="${DIR_BASE_REPOS}$NOMBRE_REPOSITORIO"
		URL_REPO="$NOMBRE_REPOSITORIO"
	fi

[/codesyntax]

 

Justo debajo añade el siguiente código:

[codesyntax lang=»bash»]

	#Preguntamos por el código base a usar. CMS, framework o vacío
	echo '¿Qué cms o framework se utilizará?'
	echo '(drupal, wordpress, symfony2, custom)'
	read BASE_PROG

	#Comprobamos que se ha elegido algo
	if [ -z $BASE_PROG ]
	then
		echo "Debe elegir un cms o framework. Adios."
		exit 0
	elif [ "$BASE_PROG" != 'drupal' ] && [ "$BASE_PROG" != 'wordpress' ] && [ "$BASE_PROG" != 'symfony2' ] && [ "$BASE_PROG" != 'custom' ]
	then
		echo "CMS erroneo. Adios."
		exit 0
	fi

	if [ "$BASE_PROG" != 'custom' ]
	then
		echo 'Inicio la Máquina Virtual Ubuntu para configurar el cms y obtener una copia de la BD a usar si fuese necesario.'
		$(VBoxManage startvm Ubuntu --type headless)
	fi

[/codesyntax]

 

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:

[codesyntax lang=»bash»]

	if [ $TIPO_REPOSITORIO == 'git' ]
	then
		cp /var/www/dev/utils/gitignore-void ${TEMP_DIR_TRUNK}/metrics/phpcs/.gitignore
		cp /var/www/dev/utils/gitignore-void ${TEMP_DIR_TRUNK}/metrics/pdepend/.gitignore
		cp /var/www/dev/utils/gitignore-void ${TEMP_DIR_TRUNK}/metrics/phpcpd/.gitignore
		cp /var/www/dev/utils/gitignore-void ${TEMP_DIR_TRUNK}/metrics/phpmd/.gitignore

		# Añado el archivo .gitignore a la raiz
		echo "Añado el archivo .gitignore a la raiz de la copia de trabajo"
		cp /var/www/dev/utils/gitignore-default ${TEMP_DIR_TRUNK}/.gitignore
	fi

	if [ $BASE_PROG != 'custom' ]
	then
		#Copiamos el código base desde elcmsquesea-dev al archivo temporal
		echo "Copio los archivos de ${BASE_PROG} al directorio temporal"

		COPY_FILES=$( cp -r "${DIR_SOURCES}${BASE_PROG}-dev/core/"* "${TEMP_DIR_TRUNK}/src" )

		if [ $COPY_FILES ]
		then
			echo 'Algo falló.'
			echo $COPY_FILES
			exit 0
		fi
	fi

[/codesyntax]

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:

[codesyntax lang=»bash»]

echo "Ahora se procederá con los plugins/add-ons/módulos y temas que corresponda para ${BASE_PROG}"
	if [ $BASE_PROG == 'wordpress' ]
	then
		/var/www/dev/utils/./content-wordpress.sh $TIPO_REPOSITORIO $URL_REPO $URI_REPO $TEMP_DIR_TRUNK $DIR_WORDPRESS $NOMBRE_REPOSITORIO
	fi

	if [ $BASE_PROG == 'drupal' ]
	then
		/var/www/dev/utils/./content-drupal.sh $TIPO_REPOSITORIO $URL_REPO $URI_REPO $TEMP_DIR_TRUNK $DIR_DRUPAL $NOMBRE_RESPOSITORIO
	fi
	
	if [ $BASE_PROG == 'symfony2' ]
	then
		/var/www/dev/utils/./content-symofny2.sh $TIPO_REPOSITORIO $URL_REPO $URI_REPO $TEMP_DIR_TRUNK $DIR_DRUPAL $NOMBRE_RESPOSITORIO
	fi

[/codesyntax]

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.