Continuous Integration System – Jenkins y Symfony 2.1 ! [2ª parte – práctica]

Seguimos con esta segunda parte práctica de como aprovechar Jenkins con nuestros proyectos Symfony 2.1. Existen varios tutoriales por internet que explican como realizar este proceso, pero no encontré ninguno que lo hiciera desde cero, así a partir del “A week of symfony #298” de Javier Eguiluz decidí documentar todo el proceso.

Ingredientes

  • Un ordenador (Pentium4 o superior con 1Gb de RAM, a más potencia menos tiempo haciendo testing).
  • Distribución linux basada en Ubuntu.
  • Acceso SSH y lógicamente privilegios de root.
  • Un proyecto Symfony2.1. con pruebas unitarias.

Prerequisitos

La gracia de todo esto, es que el servidor realice la instalación automatizada de nuestro código PHP desde un repositorio (git o subversion) y lance las pruebas unitarias, pero para ello ha de tener toda la paquetería y configuraciones necesarias para ejecutar proyectos Symfony2.1 así como las específicas de nuestro proyecto: composer, git/subversion, imagemagicjk, less, nodeJS, java, phpunit, etc…

sudo apt-get install php-pear php5-mysql php5-memcache php5-imagick php5-curl php-apc php5-sqlite php5-xsl php5-xdebug git-core

Recordar también que la versión de Phpunit que trae por defecto los repositorios de Ubuntu es vieja, y es necesario actualizar (como root) a la versión 3.6.4 o superior además de phpDox:

pear upgrade PEAR
pear config-set auto_discover 1
pear install pear.phpunit.de/PHPUnit
pear install pear.phpqatools.org/phpqatools pear.netpirates.net/phpDox
pear install theseer/Autoload
pear install channel://pear.netpirates.net/phpdox-0.4.0

Antes de continuar, comprobar que vuestra web se visualiza correctamente y que las pruebas unitarias también se ejecutan correctamente.

Instalando Jenkins

Primero instalamos Jenkins:

wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -

Editamos el fichero /etc/apt/sources.list y añadimos al final:

# fichero /etc/apt/sources.list
deb http://pkg.jenkins-ci.org/debian binary/

Continuamos en el terminal:

apt-get update
apt-get install jenkins

El servidor se ejecutará en el puerto 8080, por lo que si abrimos el navegador hasta la dirección http://IP_SERVIDOR:8080 veremos la pantalla de proyectos. Ahora deberemos configurar los plugins para nuestras pruebas, podemos hacerlo por el interfaz gráfico (Administrar Jenkins) con toda la lista disponible, pero es bastante tedioso buscar paquete a paquete, así que lo más práctico es aprovechar el interfaz de consola:

wget http://localhost:8080/jnlpJars/jenkins-cli.jar
java -jar jenkins-cli.jar -s http://localhost:8080 install-plugin \
checkstyle cloverphp dry htmlpublisher jdepend plot pmd violations xunit clover
java -jar jenkins-cli.jar -s http://localhost:8080 safe-restart

Si versionais vuestro código con GIT o con Subversion, recordar también instalar estos complementos correspondientes en jenkins.

Por último, hay que añadir los estándares de código de Symfony2, según se explica aquí.

pear install PHP_CodeSniffer
pear config-show | grep php_dir
# mira cual es el directorio y sustituye en la siguiente linea:
cd /path/to/pear/PHP/CodeSniffer/Standards
git clone git://github.com/opensky/Symfony2-coding-standard.git Symfony2
phpcs --config-set default_standard Symfony2

Instalando la plantilla de ejecución

Este paso consiste en diponer de una plantilla base con la configuración del proyecto, y cuando queremos añadir un nuevo proyecto a Jenkins (recordar que no sólo sirve para proyectos PHP), crearlo a partir de una copia de esta base.

En mi repositorio de Github tengo disponibles todos las plantillas adaptadas

# normalmente $JENKINS_HOME corresponde a /var/lib/jenkins/
cd $JENKINS_HOME/jobs
mkdir php-template
cd php-template
wget https://raw.github.com/xmontana/Jenkins-Symfony2.1/master/php-jenkins-template/config.xml
cd ..
chown -R jenkins:jenkins php-template/

Recargamos la configuración de Jenkins mediante su interfaz gráfico o igual que antes, desde la consola:

java -jar jenkins-cli.jar -s http://localhost:8080 reload-configuration

Ahora ya podemos crear nuestro nuevo proyecto en el interfaz gráfico:

1. Nueva Tarea
2. Ponemos un nombre de proyecto
3. Seleccionamos copiar de una tarea existen y escribimos el “php-template”
4. Le damos a OK.

5. Debemos quitar el checkbox de “Desactivar la ejecución”, sino, no se ejecutará.
6. Seleccionamos la dirección de nuestro repositorio de código
7. Opcionalmente podemos seleccionar “Disparadores de ejecuciones”, como por ejemplo “Consultar repositorio (SCM)”, el cual es la configuración al estilo CRON de cuando se ejecuta el proyecto, por ejemplo: 50 * * * * (cada 50 minutos)

Recordad que si utilizáis git, debéis configurado para el usuario jenkins:

su - jenkins
git config --global user.name "Jenkins"
git config --global user.email "jenkins@yourdomain.com"

Bueno, si teneis algún problema hasta aquí, podeis consultar la página oficial de Jenkins-PHP.

Configurando nuestro proyecto Symfony2.1

Procedemos a configurar nuestro proyecto para el entorno Jenkins. En la carpeta jenkins-symfony2.1 de Githubtambién están los ficheros de configuración necesarios, así que procedemos a clonarlos y copiarlos a nuestro proyecto:

git clone https://github.com/xmontana/Jenkins-Symfony2.1.git

Entramos en de la carpeta clonada, y copiamos carpeta “jenkins” que está dentro “jenkins-symfony2.1” a la carpeta “app/Resources” de nuestro proyecto Symfony2.1:

Copiamos el fichero “build.xml” a la raiz de nuestro proyecto:

Y el fichero “phpunit.xml” a la carpeta “app”:

Si tenéis alguna duda, también podeis visitar la referencia de alex88, quien modificó originalmente el template.

Notas importantes

1. Las pruebas unitarias las tengo configuradas sobre SQLITE con el bundle liip/functional-test-bundle lo que evita problemas de configuración de la base de datos MYSQL, ya que se inicializa desde cero cada vez que se ejecuta el text.

2. Definir las fitxures para las pruebas unitarias, ya que como he comentado, la base de datos se reinicializa en cada test.

3. Como buena práctica, y tal como se explica en el libro Desarrollo web ágil con Symfony2  los parámetros de configuración (parameters.yml) no están versionados, y en su lugar está disponible un fichero “parameters.yml.dist”. En el fichero build.xml se copia automáticamente el fichero “parameters.yml.dist” a “parameters.yml”. Si lo tenéis nombrado de otra forma, actualizar el script o eliminar su ejecución.

4. El “build” se realiza en la carpeta “app/build”, así que recordar añadirla a vuestro fichero .gitignore o en el subversion.

Enlaces de interés:

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s