Published: Mar 17, 2015 by Noe Nieto
Intro
Este post es para dar seguimiento a uno anterior: Programa, compila e instala tu propia extension de PHP con PHP-CPP.
El siguiente paso es reconstruir el plugin cada vez que se hace comit al
repositorio (SVN, pero puede ser git o mercurial). El repositorio tiene una
carpeta donde se encuentra el plugin y otra carpeta donde se encuentra la
aplicacion PHP. Después de varias pruebas, la manera más adecuada de integrar
el svn con Jenkins fue mediante un “gancho” (post-commit
hook) que le notifica
a jenkins, mediante una URL, que hay novedades en repositorio.
Instalando Jenkins en Ubuntu 14.04
La documentación de Jenkins es bastante buena. De ahí saqué las siguientes instrucciones:
wget -q -O - https://jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins
Por default, el paquete de Jenkins lo configurará como un servicio o daemon y creará el usuario jenkins.
Configurando el proyecto de Jenkins
Estos son los settings que use para el proyecto
- Project Name: Build PHP module
- Description:
- Discard old builds: desactivado
- This build is parametrized: desactivado
- Disable build …: desactivado
- Execute concurrent builds if necessary: desactivado
- Advanced project options
- Quiet period: desactivado
- Retry count: desactivado
- Block build when upstream …: desactivado
- Bloick build when downstream …: desactivado
- Use custom workspace: activado
- Directory: build_php_module
- Display name:
- Keep the build lofs of dependencies: desactivado
- Source code management: None
- Build triggers:
- Trigger builds remotely: Activado
- Authentication Token: df0596e175d43a406ec7c229090bb51e
- Build after other projects are built: desactivado
- Build periodically: desactivado
- Poll SCM: desactivado
- Build: Agregué un comando de shell. Mas detalles a continuación.
Configurando gancho de SVN
Justo despues de agregar el primer proyecto la url para disparar la ejecucion del proyecto sera algo parecido a esto:
http://misitio:8080/job/Build%20PHP%20Project/build?token=a406ec7d75d43c229090bb51ef0596e1&cause=Revision+$2
Esto se puede hacer desde el gancho post-commit de svn. Por ejemplo:
#!/bin/sh
# Checa post-commit.tpl para ver los comentarios.
REPOS="$1"
REV="$2"
TXN_NAME="$3"
curl http://misitio:8080/job/Build%20PHP%20Project/build?token=a406ec7d75d43c229090bb51ef0596e1&cause=Revision+$2
Con eso nos aseguramos que el proyecto de jenkins se ejecute solamente cada vez que se haga un commit en el svn.
Configuracion de directorios y permisos
Cuando Jenkins ejecuta un script de shell lo hace con los permisos del usuario Jenkins. Es por esta razón que deberemos ajustar algunos permisos en el servidor para que Jenkins pueda compilar la extensión y actualizar la aplicacion PHP.
Antes de escribir el script de shell hice un checkout del repo de la extensión
en /opt/extension-php/
. Tambien hice chechout de la aplicacion en que usa la
extensión en el directorio /var/www/php_app
. Omito la configuración de la
extensión ya que he comentado cómo configurarla en Programa, compila e instala
tu propia extensión de PHP con PHP-CPP.
Finalmente cambie el usuario de ambas carpetas al usuario jenkins.
chown -R jenkins /opt/extension-php/
chown -R jenkins /var/www/php_app
Por ultimo, un requerimiento algo inusual. Despues de recompilar la extensión de PHP es necesario reinicar apache. El usuario jenkins debe de tener permisos para reinicar el servidor apache. Esto se logra configurando sudo.
En Ubuntu/Debian sudo se puede configurar agregando archivos a /etc/sudoers.d
en lugar de usar visudo
. El contenido del archivo
/etc/sudoers.d/90-jenkins_apache2
sera:
Cmnd_Alias AP2RESTART=/etc/init.d/apache2
jenkins ALL=NOPASSWD: AP2RESTART
Para comprobarlo podemos arrancar una sesion con el usuario jenkins e intentar reiniciar apache2:
root@rtbcore01:~# su jenkins
jenkins@rtbcore01:/root$ cd
jenkins@rtbcore01:~$ sudo /etc/init.d/apache2 restart
* Restarting web server apache2
...done.
Script para construir la extension y actualizar la aplicación PHP
Ya esta todo configurado. Es script que debera correr Jenkins es el siguiente:
#!/bin/bash
echo "###### Building extension"
cd /var/www/rtb_build/RTB_c++
/usr/bin/svn cleanup --username 'ebarradas' --password 'ederbarradas' --non-interactive .
/usr/bin/svn update --username 'ebarradas' --password 'ederbarradas' --non-interactive .
/usr/bin/make clean
PATH=/usr/local/bin:/usr/bin:/bin /usr/bin/make
echo "###### Deploy app"
cd /var/www/vhosts/rtb.srax.com/srax_app
/usr/bin/svn cleanup --username 'ebarradas' --password 'ederbarradas' --non-interactive .
/usr/bin/svn update --username 'ebarradas' --password 'ederbarradas' --non-interactive .
echo "###### restarting apache"
sudo /etc/init.d/apache2 restart
Y eso es todo.
Imagen tomada de: Wikimedia