Que es Jenkins? Jenkis es un sistema de integracion continua (CI(). Basicamente lo que hace es automatizar tareas como testing, compilacion y distribucion de nuestros proyectos; pasado a limpio, compila automaticamente por nosotros
Que ventajas tiene esto?
- Incrementar la productividad: Automatizar tareas siempre es bueno para incrementar la productividad. Cuando uno tiene mas y mas proyectos se vuelve algo tedioso el tener que compilar todo y ponerlo "en linea"; ademas, con los modelos de software de hoy en dia y el auge de los repositorios en la nube (git, subversion, etc) los cambios en los proyectos son permanentes. La "ultima version" ya es vieja
Se pueden hacer infinitas cosas con Jenkins: enviar mails, subir archivos por FTP, ejecutar comandos bat, ejecutar shell script, etc
- Facilita el testing: Los tester no siempre tienen que tener acceso al codigo fuente para poder compilar. Los testers no siempre tienen que saber como se hace "todo eso" para poder testear. Ellos necesitan la ultima version para probarla
- Facilita el soporte/mesa de ayuda: Llaman por telefono o mandan un mail a soporte: "Hola, como hago para xxx". Este tipo de cosas, requiere que en soporte siempre tengan instalado nuestros programas y que sea siempre la ultima version (en realidad lo mejor es tener TODAS las versiones para asi poder usar la de nuestro usuario). Para los desarrolladores, es muy engorroso tener que dejar una computadora actualizada siempre "a lo ultimo"
- Disponibilidad: No hace falta alguien capacitado para poder obtener la ultima version; asi, la gente que se encarga de vender, de marketing y de mantener la web o las redes sociales bien "chulas" con lo ultimo de lo ultimo, siempre tienen acceso a "lo ultimo de lo ultimo". No hace falta llamar al licenciado para que le de F9 desde el IDE .
- Los errores se encuentran antes: Debido a que continuamente se esta actualizando el software, continuamente se esta testeando; mas testeo = mas errores encontrados antes de liberar una nueva version
- Posiblidad de ofrecer versiones "release-candidate" de forma automatica. Basicamente le podemos decir a Jenkis que ejecute un pull de Git, compile el proyecto y luego lo suba a un FTP/Dropbox/haga lo que sea que haga falta
En fin..
Hace unos años se decia que, incluso aunque seamos una sola persona, es una muy buena idea usar un SCM (gestion de codigo fuente, como Mercurial, entre otros)
Hoy se dice lo mismo pero de CI. En esta ocasion voy a presentar a Jenkins que se integra perfectamente bien con Delphi
----
Primero, descargamos el paquete para Windows en la pagina oficial de Jenkins
La instalación basicamente nos preguntará en que directorio queremos instalar Jenkins, nada más. Increiblemente sencillo
Apenas terminada la instalacion, se nos abrira un browser apuntando a localhost:8080; Jenkins se administra en su totalidad desde un browser, lo cual lo hace bastante practico, podríamos acceder desde "afuera" sin tener que andar instalando nada
El punto fuerte de Jenkins es que esta preparado para ser extendido facilmente utilizando un sistema de plugins. Para administrar plugins simplemente debemos irnos a < Administrar Jenkins > / < Administrar Plugins >.
Tambien es posible acceder mediante URL, http://localhost:8080/pluginManager/
En esta ventana podremos actualizar, eliminar o agregar nuevos plugins. Es realmente sencillo.
Lo primero que hago yo es actualizar lo que sea necesario (es una costumbre que tengo, me gusta tener todo al dia)
A nosotros nos interesa un plugin que se va a encargar de compilar los proyectos Delphi: RAD Studio Plugin. Para instalarlo simplemente hay que dirijirse a la pestaña < Todos los plugins >, y en el edit que nos sale arriba podemos filtrar y buscar el plugin que querramos
Luego marcamos el checkbox, y le damos al boton < Descargar ahora e instalar despues de reiniciar >
Para reiniciar Jenkins, hay que ingresar esta URL en el browser: http://localhost:8080/restart
Notar que esto es un reinicio "forzoso", si Jenkins en ese momento estaba ejecutando alguna tarea sera interrumpido/
Para un reinicio seguro (esperar a que terminen todas las tareas, y luego reiniciar) se usa:
http://localhost:8080/safeRestart
Ahora debemos configurar el plugin para que detecte nuestras instalaciones de Delphi; asi que desde Home (http://localhost:8080/), vamos a < Administrar Jenkins > / < Configurar sistema >.
Siguiendo, buscamos la seccion RAD Studio y hacemos click en < Añadir RAD Studio >
Esta es una de las partes que tiene "truco", ya que este plugin lamentablemente no cuenta con documentacion de ningun tipo
El el edit "Name", ingresamos un nombre para identificar una instalacion de Delphi. Por ejemplo, yo como voy a usar Delphi 2010, simplemente le puse de nombre "Delphi 2010".
En el edit "Home (BDS)" debemos ingresar la ruta donde esta instalado el Delphi en cuestion. En mi caso:
C:\Program Files (x86)\Embarcadero\RAD Studio\7.0\
En este momento ya estamos en condiciones de poder crear una nueva tarea para compilar nuestros proyectos Delphi. Asi que nos dirijimos a Home
En el menu de la izquierda tendremos la opcion < Nueva tarea >. Pulsamos y se nos solicitara un nombre y tipo de tarea. En el tipo seleccionamos la primer opcion "Crear un proyecto de estilo libre"
Algo muy bueno Jenkins es la ayuda que tiene incorporada. En esta ventana casi todos los puntos que se nos solicita, tiene a su derecha un icono de ayuda (con el signo ?). Al hacer click se expande la ayuda para ese objeto, la cual es muy precisa y en muchos casos hasta provee ejemplos
Es interesante ver que Jenkins se integra perfectamente con los sistemas de gestion de codigo fuente, como Git, Subversion, etc. Volveremos mas adelante sobre esto/
Para este ejemplo sencillo que vamos a crear, a nosotros nos interesan dos puntos:
a. Disparadores de ejecuciones: Cuando se va a ejecutar esta tarea?
En este caso voy a hacer algo bastante inutil, que es compilar cada 15 minutos. Para ello debemos ingresar:
[code=auto:0]
H/15 * * * *
[\code]
Para este caso en particular la ayuda lo es todo
Veremos mas adelante que se pueden hacer cosas mas interesantes, por ejemplo, cuando se pushea a nuestro repositorio Git, Mercurial, etc, Jenkins recibe la notificacion y compila. Muy poderoso
b. Ejecutar: Al dispararse esta tarea, que debe hacerse?]/i]
Clickeamos en el combo < Añadir un nuevo paso >
Seleccionamos < Build a RAD Studio project or project group >
En el combo "RAD Studio" elegimos que Delphi queremos usar. Aca nos van a aparecer todos los que vayamos cargando. Podemos tener distintas instalaciones de Delphi sin ningun problema
En el edit "Project file" ingresamos la ruta de nuestro projecto. Puede ser un grupo (.groupproj), un .dpr (Delphi < 2007) o .dproj (Delphi >= 2007)
En Switches yo nunca pongo nada; supongo que son argumentos para el compilador (dcc32)
Listo! Damos en guardar y ya esta.
Ahora nos devuelve a la pantalla principal del proyecto que acabamos de crear. Desde aca podemos ver el Changelog, la historia de builds, el workspace (espacio de trabajo). Para probar que todo este correcto damos, en el menu de la izquierda, click en "Construir ahora".
En este punto quiza sea interesante activar la opcion, arriba a la derecha, de auto-refrescado
Entonces veremos como se encola un nuevo trabajo y Jenkis ejecuta lo que programamos. Si todo va bien, deberiamos tener un punto azul. Si hubo algun problema, el punto sera de color rojo. Podemos ver en tiempo real, o cuando querramos, la salida a consola; de esta manera podemos ver que hizo Jenkins, y si hubo algun problema, poder ver cual es el fallo para poder solucionarlo
Lo normal es que en este punto nos de error, y si revisamos la salida a consola, veamos que no encuentra las unidades basicas de Delphi; por ejemplo, la "System.pas" o el .DCU equivalente
Esto es porque Jenkins por defecto se instala como un servicio de Windows que corre en la cuenta del sistema local. Y parece ser que algunos plugins (el de Delphi, el de Git) necesitan que los ejecute un usuario "comun" de Windows. Solucionarlo es, por suerte, muy sencillo.
Vamos a inicio -> ejecutar (o usamos la combinacion de teclas, CTRL + R) y escribimos services.msc
En Windows 7 o superior, podemos ir al administrador de tareas, pestaña servicios, y luego hacer click en el boton "Servicios"
En la lista de servicios, buscamos Jenkins. hacemos doble click y en el cuadro de propiedades, vamos a la pestaña de inicio de sesion.
Veremos que esta seleccionada la opcion "Cuenta del sistema local". Debemos seleccionar la otra opcion, "Esta cuenta"
Si no queremos problemas, lo que hacemos es asignarle nuestra cuenta de usuario
Si queremos asignarle una cuenta que solamente va a usar Jenkins (lo cual es buena idea), debemos tomar una medida adicional:
Si la cuenta en cuestion la creamos despues de instalar Delphi, o bien, cuando instalamos Delphi no seleccionamos la opcion "All users" o "Todos los usuarios", nos faltaran algunos archivos que el compilador busca en el espacio de usuario y no podra compilar. Asi que abrimos el explorador de Windows y nos vamos a:
- En Windows XP: C:\Documents and Settings\<Usuario>\Datos de programa
- En Windows 7 o superior: C:\Users\<Usuario>\AppData\Roaming
[i]Sepan disculpar que en este caso haya puesto una ruta en español y la otra en ingles,
lamentablemente nuestro server Win 2003 viene en español, en tanto mi Windows 10 esta en ingles
Quien es "<Usuario>"?.
<Usuario> debe ser la cuenta que seleccionamos para instalarle Delphi. Dicho de otra forma, si iniciamos sesion con esa cuenta, y desde la linea de comandos ejecutamos dcc32 deberia salirnos la ayuda del compilador de Delphi.
Si nos indica que no reconoce el comando dcc32 entonces Jenkins no podrá compilar, al menos no si se ejecuta desde esa cuenta
Una ves estemos dentro de ese directorio, debemos copiar las carpetas de Delphi. Ahora esta parte tambien tiene truco ya que depende de nuestra version de Delphi, son distintas carpetas. Por ejemplo, para Delphi 2010 la carpeta es "CodeGear"; supongo que para las versiones mas antiguas debe haber una "Borland", y las mas nuevas una "Embarcadero". De todos modos, si algo que sobra no pasa nada.
Y donde lo copiamos? En la misma ruta pero de la cuenta que asignamos a Jenkins. Ahora si, se deberia poder ejecutar la tarea sin ningun problema
Ahora veremos como podemos agregar un SCM a la formula y que se ejecute el build cuando se pushea