Entorno de integración continua (IV): Jenkins

Para instalar Jenkins existen varias maneras, yo en este caso, voy a hacerlo a través de un repositorio de paquetes que voy a agregar a continuación, pero otra forma de hacerlo, por ejemplo, es descargarse el .war del proyecto y desplegarlo con normalidad en nuestro servidor Tomcat. ¿Por qué si hay un .war me voy a complicar añadiendo un nuevo repositorio? Pues simplemente es para tener una cómoda y fácil forma de actualizar (yo soy un despistado, así que cuando más centralizado esté todo mejor), ya que al ser un paquete, cuando actualicemos nuestra distribución este paquete se actualizará con ella, lo malo, que no tendremos la última versión, aquí a vuestra elección, como siempre no se puede tener todo a la vez y hay que ponderar según nuestras necesidades y las de nuestro proyecto. Para instalar Jenkins como paquete ejecutaremos las siguientes instrucciones:
wget -q -O – http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add –
sudo echo ‘deb http://pkg.jenkins-ci.org/debian binary/’ >> /etc/apt/sources.list
sudo apt-get update
sudo apt-get install jenkins
Tras esto podremos comprobar si se ha instalado correctamente y está funcionando accediendo a:
localhost:8080 (En caso de haber desplegado el .war, probablemente sea algo como localhost:8080/jenkins)
A la hora de configurar Jenkins, el plugin de Maven viene instalado por defecto, por lo menos en la instalación que yo he hecho (desde repositorio), si no solo tenéis que seguir unos pasos similares a los que voy a describir para realizar la instalación del plugin de Git.
Los pasos para instalar el plugin de Git son los siguientes:

  1. En el dashboard de Jenkins ir a “Manage Jenkins -> Manage Plugins -> Available
  2. Buscar Git e instalar. (En el caso de Maven, no lo he mirado supongo que será algo similar)

Con esto ya tendremos los plugins necesarios para nuestro propósito instalados y estaremos listos para configurar la tarea de Jenkins que hará que todo esto funcione.
Como ya he dicho, el último paso de todo esto, es crear una tarea de Jenkins para que construya nuestro sistema, para ello desde el dashboard iremos a “New Job”, allí asignaremos un nombre y seleccionaremos “Build a Maven 2/3 project”, existe la posibilidad de crear una tarea con todo desde cero, que os recomiendo probar cuando ya hayáis jugado un poco con Jenkins ya que se puede hacer con ella casi de todo. Pero volvamos a lo que estábamos. Una vez dentro de la tarea, tendremos que prestarle especial atención a la sección “Source Code Management”, en ella, seleccionaremos Git y añadiremos nuestro repositorio. La otra sección importante es la de “Build” en ella definimos los datos sobre Maven, nuestro fichero pom.xml y las tareas que queremos ejecutar. El resto de secciones, os recomiendo que las vayáis probando, activando y desactivando, para ver como cambia y todo lo que Jenkins nos ofrece.
Un enlace que explica bastante bien las tareas de Jenkins es este.
Bueno, hasta aquí hemos llegado. Espero que os sirva y que os ayude para montar vuestros primeros entornos de integración continua. Nos vemos.
[update] Como la vida está llena de casualidades, esta mañana, leyendo mis fuentes RSS, he visto en el de javaHispano la publicación de una noticia sobre un blog acerca de Integración continua que está empezando, y aunque no he tenido tiempo de echarle un ojo no de juzgar su contenido, os dejo aquí el enlace por si os queréis dar una vuelta por allí y juzgar vosotros mismos. [/update]

Entorno de integración continua (IV): Jenkins

Entorno de integración continua (III): Eclipse + Plugins (Git y Maven)

La idea de todo esto es hacer que el desarrollo de nuestros proyectos sea más fluido y más controlado, para esto, no solo debemos contar con los servidores adecuados, sino que también los desarrolladores deben contar con las herramientas adecuadas para utilizarlos. Por eso, y dado que Eclipse es uno de los IDEs más utilizados a nivel empresarial, vamos a montar nuestras herramientas sobre él. En Netbeans y otros IDEs imagino será algo parecido.
Yo voy a instalar los plugins de una forma más manual, por así decirlo, la otra forma de hacer es a través del MarketPlace que incorporan las últimas versiones de Eclipse. Podéis hacerlo de la forma que más os guste, el resultado debería ser el mismo. Los plugins que vamos a instalar son:

  • Maven: m2e
  • Git: EGit

Para la instalación de ambos plugins de la forma más manual, bastará ir a  “Ayuda -> Instalar nuevo software” y añadir las direcciones de cada uno de ellos.
m2e: http://download.eclipse.org/technology/m2e/releases
EGit: http://download.eclipse.org/egit/updates
Con esto deberíais tener instalados en vuestro IDE ambos plugins.
En el caso de m2e, te instala una versión de maven embebida en Eclipse, personalmente, a mi no me termina de convencer, más que porque no sea útil, porque no puedes acceder a ella desde la consola (a veces necesario según el entorno de trabajo) y porque trabajar sobre un mismo proyecto con la versión embebida y con la versión de consola a veces de algunos conflicto. Por todo esto, lo último que haremos para configurar nuestra herramienta de desarrollo es instalar Maven en nuestro sistema si no lo tenemos:
sudo aptitude install maven
Y configurarlo en Eclipse yendo a “Preferencias -> Maven”, configurando el ejecutable externo y asignándolo como default.

Entorno de integración continua (III): Eclipse + Plugins (Git y Maven)

Entorno de integración continua (II): Servidor Git

Lo primero que vamos a montar es el servidor de Git, el cual afortunadamente, forma parte de los paquetes de la distribución con lo cual su instalación será muy fácil y solo tendremos que centrarnos básicamente en su configuración. Los pasos a seguir para la instalación y configuración serían los siguientes:
1. Instalar un servidor apache (en caso de no tenerlo), instalar el servidor Git e instalar su front-end web. Para ello bastará con ejecutar la siguiente instrucción:
sudo aptitude install apache2 git gitweb
Nota: Creo que para versiones anteriores a la 12.04 el paquete correspondiente a Git se llama git-core.
2. Crear los directorios para el repositorio de Git y para el contenido del front-end web. En principio, los podréis crear donde queráis, simplemente acordaos de dar los permisos adecuados para su utilización. Yo como para casi todo, recomiendo la creación de un nuevo usuario para el servidor de Git y lo que tenga que ver con él. En caso de que hayáis creado un usuario para Git, o de que simplemente estéis probando esto en vuestro ordenador personal y lo hagáis todo con vuestro usuario, crearemos los siguientes directorios:
Para el repositorio: mkdir /home/user/git
Para el front-end web: mkdir /home/user/gitweb
3. Tendremos que decirle al servidor web, apache en nuestro caso, donde está este front-end web para poder acceder a él. Para esto, dentro de los ficheros de configuración del servidor, existe uno específico para git que vamos a proceder a editar.
vim /etc/apache2/conf.d/gitweb
En él reemplazaremos su contenido por algo similar a lo siguiente, por supuesto, teniendo en cuenta las rutas que vosotros estéis utilizando:
Alias /git /home/user/gitweb
<Directory /home/user/gitweb >
Allow from all
AllowOverride all
Order allow,deny
Options +ExecCGI
DirectoryIndex gitweb.cgi
<files gitweb.cgi >
SetHandler cgi-script
</files>
</directory>
SetEnv  GITWEB_CONFIG  /etc/gitweb.conf
4. Para que la parte del front-end funcione correctamente, recordemos que el directorio gitweb aún está vacío, tendremos que mover contenido a él:
mv /usr/share/gitweb/* /home/user/gitweb
mv /usr/lib/cgi-bin/gitweb.cgi /home/user/gitweb
5. Finalmente, haremos unos pequeños cambios en el fichero de configuración de gitweb. La mayoría de ellos consisten simplemente en cambiar las rutas a las utilizadas por nosotros y descomentar un par de cosas.
vim /etc/gitweb.conf
El resultado del fichero, sin tener en cuenta comentarios, debería ser más o menos este:
$projectroot = ‘/home/user/git/’;
$git_temp = “/tmp”;
$home_link = $my_uri || “/”;
$home_text = “indextext.html”;
$projects_list = $projectroot;
$stylesheet = “/git/gitweb.css”;
$logo = “/git/git-logo.png”;
$favicon = “/git/git-favicon.png”;
6. Finalmente, recargamos el servidor web para contemplar todos los cambios efectuados y con esto deberíamos tener nuestro servidor Git funcionando.
sudo /etc/init.d/apache2 reload
Ahora bien, quien se fíe de que algo vaya bien a la primera sin probarlo, que levante la mano… ¿Ninguna? Muy bien, yo opino igual, así que vamos a probarlo. Para ello, simplemente vamos a crear un pequeño proyecto vacío en nuestro y vamos a subirlo a ver si todo funciona correctamente.
1. Creamos el directorio de nuestro proyecto en el directorio de repositorios:
cd /home/user/git
mkdir testproject
cd testproject
2. Iniciamos un repositorio para el proyecto y realizamos el primer commit:
git init
echo “Primer commit de prueba” > .git/description
git config –global user.name “svoboda”
git config –global user.email “svoboda@example.org”
git commit -a
3. Hacer público el repositorio
git daemon –base-path=/home/user/git –detach –syslog –export-all
Con esto ya tendríamos todo funcionando y, además, un pequeño repositorio iniciado. Si hasta aquí no os ha dado ningún fallo, es que vamos bien. Por último, vamos a acceder a este repositorio y bajarlo. Podemos hacer esto desde consola situándonos en algún directorio de nuestra elección no dentro de nuestro repositorio:
git clone git://localhost/testproject cloneproject
O desde el front-end web localizado en:
localhost/git

Entorno de integración continua (II): Servidor Git

Entorno de integración continua (I): Introducción

Lo que al principio iba ser un post sobre como crear un entorno de integración continua desde cero, al final, se ha tenido que transformar en una pequeña serie (no se si de tres o cuatro posts) ya que todo en uno quedaba demasiado grande y quizás un poco inmanejable.
Imagino que a estas alturas, y sobre todo, después de leer la serie de posts sobre desarrollo ágil todo el mundo sabrá, o al menos, tendrá una pequeña noción de lo que es un entorno de integración continua, de su función y de sus componentes. En principio, la idea de este post (esta serie) no es explicar ninguno de estos puntos, si no montar un entorno de integración continua en nuestros servidores.
Aunque existen en internet múltiples servicios que ofrecen repositorios online, o sistemas de integración online, generalmente, estos son más útiles a nivel personal o a nivel de proyectos de software libre que para una empresa sobre todo, aquellas que desarrollan sus propios productos para la venta. Estos sistemas online quizás no les den la seguridad y la confidencialidad que necesitan. Además, la seguridad de estos servicios online depende de terceros, y esto es algo que tampoco suele gustar ya que, por un lado, no sabes quien puede tener acceso a tu código fuente y, por otro lado, cualquier intrusión que se produzca puede hacer que nuestro código, aquello de lo que vive nuestra empresa, pase a manos de “la nube”. Por todas estas razones, en muchas ocasiones, es mejor montar nuestro propio servidor interno de repositorio e integración.
Pero, sin más demora, vamos a ello.
¿Qué vamos a montar? La idea es montar lo siguiente:

  • Un servidor Git donde albergar nuestro código fuente.
  • Un servidor con Jenkins instalado y funcionando.
  • Una tarea en Jenkins que. utilizando Maven, compile nuestro código y lo despliegue.
  • Además, las herramientas necesarias para que el desarrollador trabaje con todo ello.

Todo esto lo vamos a montar sobre una distribución de Linux, para ser más concreto, en este caso lo vamos a montar sobre un Ubuntu 12.04. Aunque supongo que portar los pasos explicados a cualquier otra distribución no debe entrañar demasiada dificultad.

Entorno de integración continua (I): Introducción