PROYECTO DE TITULACION
TEMA:
INTEGRACION CONTINUA
SEMESTRE: 8vo-1
Quito – Ecuador
2019-2019
Contenido
INTEGRACION CONTINUA ........................................................................................................ 1
CAPITULO I ...................................................................................................................... 4
1. MARCO TEORICO ..................................................................................................... 4
1.1 ¿Qué es Integración Continua? .......................................................................................... 4
1.2 ¿Cómo funciona? ............................................................................................................... 5
1.3 ¿Por qué es necesaria la integración continua? ................................................................. 5
1.4 ¿En qué consiste la integración continua? ......................................................................... 5
1.5 ¿Como mejora la Integración Continua la calidad del software? ....................................... 6
1.6 Buenas prácticas que intervienen en la integración continua ........................................... 7
1.7 Componentes de la integración continúa .......................................................................... 9
Servidor de integración continúa ..................................................................................... 9
Servidor de control de versiones .................................................................................... 10
Pruebas de verificación.................................................................................................. 10
Análisis de código estático. ............................................................................................ 11
1.8 Beneficios de la integración continua .............................................................................. 12
1.9 Ventajas de integración continua .................................................................................... 13
1.9 Desventajas de la integración continua ........................................................................... 13
1.11 Costo de Distribución..................................................................................................... 15
CAPITULO II ................................................................................................................... 16
2. Las mejores herramientas utilizadas en Integración Continua.................................. 16
2.1 Jenkins ............................................................................................................................. 16
2.2 Travis CI ........................................................................................................................... 17
2.3 Bamboo ........................................................................................................................... 18
2.4 GitLab CI .......................................................................................................................... 19
2.6 CruiseControl ................................................................................................................... 20
2.7 Codeship .......................................................................................................................... 21
2.8 TeamCity .......................................................................................................................... 22
2.9 Tabla comparativa de herramientas de integración continua ......................................... 23
CAPITULO III ................................................................................................................. 24
3. Como construir un entorno de Integración Continua con Jenkins y Docker………………..24
3.1 Un master para dominarlos a todos ............................................................................... 25
3.3 Para crear: «Hello World»…………………………………………………………………………………………….27
3.4 Agentes, esclavos y nodos ............................................................................................... 29
3.5 Inspeccionando el código……………………………………………………………………………………………..35
3.5 Apagando y encendiendo……………………………………………………………………………………………. 39
4. Conclusiones.......................................................................................................... 40
5. Bibliografía ............................................................................................................ 41
INTRODUCCIÓN
Todos estos pasos a menudo son tediosos e involucran una cierta cantidad de
tiempo, tiempo en el que regularmente el desarrollador no tiene mucho que
hacer. Para evitar estos problemas surge la integración, entrega y despligue
continuo.
Seguro que muchos han vivido esta situación, dos, tres días antes de
pasar a un entorno, desarrollo o preproducción (en el mejor de los casos), o
incluso a producción (en el peor de los casos), alguien va al control de código
fuente y obtiene la última versión, todos sabemos que esto debería hacerse a
diario, pero eso es tema de otro artículo. El caso es que se trae todo, y lanza la
compilación, y lo siguiente que se oye es “ups, no compila”, la cara se nos
desencaja, a todo el equipo, y pensamos ¿qué ha pasado? Y ahora ¿qué binarios
desplegamos?
Otra situación que puede ocurrir, igual de preocupante, una vez con la
última versión, lo compilamos en “cualquier máquina”, todo va bien, lo subimos
al entorno, y de repente algunas funcionalidades, dependientes de referencias
externas fallan, y oímos la frase “en mi máquina (la de compilación) funciona”.
Esto habitualmente es debido a que no hemos usado una máquina limpia (con
las referencias en la misma versión que tendremos en los entornos), para esa
compilación. Son situaciones, que por desgracia, veo más frecuentemente de lo
que me gustarían.
CAPITULO I
1. MARCO TEORICO
1.1 ¿Qué es Integración Continua?
La integración continua (continuous
integration en inglés) Es un
modelo informático propuesto inicialmente
por Martin Fowler que Consiste en
hacer integraciones automáticas de un proyecto
lo más a menudo posible para así poder
detectar fallos cuanto antes. Entendemos por
integración la compilación y ejecución de
pruebas de todo un proyecto.
El proceso suele ser: cada cierto tiempo (horas), descargarse las fuentes desde
el control de versiones (por ejemplo CVS, Git, Subversion, Mercurial o Microsoft Visual
SourceSafe) compilarlo, ejecutar pruebas y generar informes.
Para esto suelen utilizarse aplicaciones como Solano CI, Bamboo, Pipeline,
ApacheContinuum, Hudson, Jenkins, GoCD, CruiseControl o Anthi ll (para proyectos
Java) o CruiseControl.Net, Team Foundation Build para .Net, que se encargan de
controlar las ejecuciones, apoyadas en otras herramientas como Ant o Maven
(también para proyectos Java), o Nant o MSBUILD (para .Net) que se encargan de
realizar las compilaciones, ejecutar las pruebas y realizar los informes. A menudo la
integración continua está asociada con las metodologías de programación extrema y
desarrollo ágil.
Calidad de proceso
En primer lugar, con la integración continua se le da más visibilidad al proceso
de desarrollo en general, a todos los pasos que se siguen desde que se empieza a
programar un requisito del cliente hasta que está en producción.
Así, todo el mundo sabe las fases por las que va pasando el código, y el estado
del software en cada momento (si compila, si pasa las pruebas, en qué entorno está
cada versión, qué versión se está probando etc).
También le damos visibilidad a la estrategia de gestión de configuración,
política de ramas del control de versiones y tagueos, entre otras cosas.
Si todo el equipo no conocía esto bien, o las estrategias estaban poco definidas,
con la integración continua habrá que solucionarlo.
Y esto ya es un avance importante, porque en muchas empresas a las que
vamos, todas estas cosas imprescindibles no son conocidas por todo el equipo, ni
están claras ni bien definidas.
Calidad de producto
Por otro lado, también se mejora la calidad del producto software.
El principal objetivo de la integración continua es detectar los errores lo más pronto
posible, en fases tempranas del desarrollo, para poder solucionarlos rápidamente.
Así se introducen varios tipos de pruebas y comprobaciones, minimizando los
riesgos, y haciendo que el software tenga menos bugs que si no realizáramos
integración continua.
Por otra parte, en fases ya avanzadas de la integración continua se suelen
lanzar inspecciones continuas de código, análisis periódicos para detectar problemas
de calidad en él.
Los desarrolladores tendrán que mejorar esas deficiencias, e incluso en ciertas
ocasiones, se puede impedir que los desarrolladores suban el código al control de
versiones si no cumplen los estándares de calidad definidos por la empresa.
Esta es una de las primeras cosas que hay que definir, saber cómo es el
desarrollo, cuál es el criterio para que el código promocione de un entorno a otro, y
qué se hace en cada entorno.
Y si el código no pasa algún punto hay que establecer cuál es la estrategia para
resolver el error, quién se encarga de ello, cómo se gestiona.
Este sería un ejemplo de cómo se vería un pipeline implementado en Jenkins.
Esto es a lo que me refería con visibilidad del proceso. Podremos saber qué
revisión de código compila, cuál no y en qué punto del pipeline se encuentra cada
subida del código.
Pruebas de verificación.
Para hacer que esto sea posible y fácil, no esperaremos a que el código esté
finalizado, como se hacía en los métodos convencionales o de cascada, sino que
dividiremos el trabajo en pequeñas tareas, también denominadas sprints, que no
suponen un gran esfuerzo ni necesitan una gran inversión de tiempo, de forma que se
puedan ir comprobando dichas tareas frecuentemente.
Estas comprobaciones se deben llevar a cabo por lo menos una vez al día y suelen
ser realizadas al finalizar cada jornada laboral. En base a los resultados, podemos seguir
creando o entramos en la fase de modificación, donde una vez detectado el error, el
grupo decidirá cómo se puede superar y para ello, que deben modificar.
• Otra de las ventajas que tiene la CI es a nivel personal. Puesto que estas prácticas
se llevan a cabo en proyectos conjuntos, son los propios desarrolladores los que
van a ir analizando el código creado, apoyándose los unos en los otros. Ellos
mismos van a tener que aprender diferentes métodos de integración y verse
obligados a superar día tras día diferentes errores o fallos encontrados en el código
creado. Esto fomenta la comunicación entre el equipo, y hace que sea mucho más
enriquecedor tanto a nivel individual como a nivel de grupo o equipo.
• En todo momento se tendrá una versión para pruebas, o una primera fase para
poder contrastar la evolución del código de forma que haga posible detectar
los errores a tiempo y poder corregirlos.
• A su vez, en todo momento cada miembro del equipo tiene acceso a la versión
final.
2.1 Jenkins
• Escrito en Java
• Se ejecuta en un contenedor EJB
• Más de 1 000 plugins
• Asiste también en la entrega y el despliegue continuo
• Compatible con muchos sistemas de control de versiones
• Controles mediante GUI (basados en web), API REST o línea de comandos
• Alojamiento opcional en la nube
• Gratuita
• De código abierto (licencia MIT)
2.2 Travis CI
A los usuarios de GitHub les encantará Travis CI, puesto que esta herramienta de
integración continua trabaja en estrecha relación con el popular software de control de
versiones. Esta herramienta puede configurarse con un sencillo archivo YAML que se
guarda en el directorio raíz del proyecto. GitHub informa a Travis CI de todos los
cambios efectuados en el repositorio y mantiene el proyecto actualizado.
• Programado en Ruby
• Multiplataforma
• Funciona con GitHub
• Se configura con un archivo YAML
• Gratuita para proyectos de código abierto
• Precio para proyectos comerciales: entre 69 y 489 dólares/mes
• De código abierto (licencia MIT)
2.3 Bamboo
• Escrito en Java
• Multiplataforma
• Fácil integración de otros productos Atlassian
• Gran cantidad de addons
• Realización de varias pruebas al mismo tiempo
• Interfaz web y API REST
• Gratuita para proyectos de código libre, ONG y centros escolares
• De lo contrario, pago único de entre 10 y 126 500 dólares, dependiendo del
número de servidores utilizados
2.4 GitLab CI
GitLab CI forma parte del conocido sistema de control de versiones GitLab. Además
de integración continua, GitLab ofrece despliegue y entrega continua. Al igual que con
Travis CI, la configuración de GitLab CI se lleva a cabo con un archivo YAML. Por lo
demás, su utilización es sencilla.
2.5 CircleCI
La herramienta de integración continua CircleCI funciona tanto con GitHub como
con Bitbucket.
En las fases de prueba, pueden emplearse tanto contenedores como máquinas
virtuales. CircleCI confiere mucha importancia a la ejecución de procesos de desarrollo
sin interferencias, por lo que arroja de forma automática builds compatibles con otros
entornos.
2.6 CruiseControl
• Escrito en Java
• Multiplataforma
• Cuadro de mandos basado en web
• Versiones para Ruby (CruiseControl.rb) y .NET (CruiseControl.NET)
• De código abierto (licencia BSD)
• Gratuita
2.7 Codeship
Codeship ofrece a los desarrolladores opciones sencillas en la nube que ayudan a acelerar el trabajo (fuente:
https://codeship.com/)
El software TeamCity destaca sobre todo por sus “gated commits”. Con ellos, la
herramienta comprueba los cambios en el código antes de integrarlos a la línea
principal. Únicamente cuando el código está libre de errores, pasa a formar parte del
código base para todo el equipo. TeamCity lleva a cabo las pruebas automáticamente
en un segundo plano, de modo que el desarrollador puede continuar trabajando.
• Escrito en Java
• Multiplataforma
• Gated Commits
• Gratuito para 100 builds con 3 agentes de compilación
• Pago único de entre 299 euros y 21 999 euros
• Con 50 % de descuento para startups y gratuita para proyectos de código abierto
Esto descargará la imagen con la última versión de Jenkins LTS (Long Time Support)
Arrancamos el contenedor:
Para hacer una prueba rápida del funcionamiento de Jenkins, ve a «New item»para
crear un nuevo job:
En la sección «Build«, haz click en «Add build step» y selecciona «Execute Shell»
Escribe:
Es habitual encontrar la palabra esclavos (slaves) o nodos (nodes) para referirse a los
agentes. En Jenkins estos conceptos son sinónimos, yo me referiré a ellos como agentes,
puedes consultar las últimas versiones de la documentación para más información.
• Launch method: Launch agent via Java Web Start. Hay otros métodos para
Y «Save»
Con estos pasos le estás diciendo a Jenkins que vas a conectar un nuevo agente. Necesitas
un dato importante, un token secreto para conectarte que está indicado después del
parámetro -secret:
Arranca el contenedor:
Hasta ahora no hemos construido nada útil, pero ya tenemos un master y un agente
listo para empezar a trabajar, así que vamos a construir un proyecto real. Para este tutorial
he elegido el proyecto FitNesse, que es una herramienta de colaboración tipo wiki y un
framework de test de aceptación open source escrito en Java y se construye con gradle.
El código fuente original de está en https://github.com/unclebob/fitnesse.
Vamos al apartado «Build Triggers«. Aquí se determina qué evento «dispara» la build.
• Selecciona «Poll SCM» y escribe H/5 * * * *
• Esto le indica a Jenkins que «pregunte» tu repositorio cada 5 minutos si hay
cambios. Si los hay, dispara el job.
Y arranca con:
En el enlace de arriba a la derecha haz click en «Log In«, el usuario y contraseña por defecto
son admin / admin. Ahora ve a «Administration» -> «System» -> «Update Center«->
«Available» y busca «Java» . Instalas el plugin y se reiniciará el servicio,
Ya tenemos el contenedor con SonarQube levantado y configurado con el plugin de Java.
Ahora hay que decirle a Jenkins dónde está. Por defecto Jenkins no viene con el plugin de
SonarQube instalado, así que vamos a instalarlo.
Con el plugin de SonarQube ya instalado, toca decirle donde está tu servidor Sonar y que
Scanner vas a usar. Así que ve a «Manage Jenkins» y «Configure System«. Busca el apartado
SonarQube Servers y haz click en «Add SonarQube«. Basta con rellenar los
campos Name (dale un nombre descriptivo) y Server URLque será http://HOST_IP:9000. Te
adjunto una captura de mi configuración:
Sólo falta decirle qué Scanner vas a usar. Esto se hace vía «Manage Jenkins» y «Global tool
configuration«. busca el apartado «SonarQube Scanner» y haz click en «SonarQube
Scanner installations» y «Add SonarQube Scanner» . Escribe un nombre descriptivo, y para
que Jenkins se encargue de instalar el software necesario marca «Install automatically» .
Esta es una de las cosas que más me gustan de Jenkins, la posibilidad de dejar que se
encargue de instalar las herramientas cuando las necesita, ya que descarga mucho trabajo
del mantenimiento de los nodos agente.
Con esto Jenkins ya sabe dónde tenemos SonarQube y que Scanner vamos a usar,
pero nuestro job todavía no.
Vamos a continuar con el ejemplo del apartado anterior de FitNesse. Para poder
hacer el análisis del código y obtener la cobertura de los test unitarios tienes que hacer dos
cosas: preparar el archivo project-sonar.properties y activar el plugin JaCoCo
en build.gradle para tener la información de cobertura de código.
En el archivo build.gradle añade esta línea después del bloque plugins:
apply plugin: "jacoco"
Esto prepara el proyecto para guardar la información de cobertura al ejecutar los tests.
Guarda la configuración y dale a «Build Now» para probar que todo está bien. En unos
minutos deberías ver:
En los resultados del job de FitNesse verás un nuevo enlace a los resultados del análisis de
código y cobertura de SonarQube. Siguiendo el enlace te llevará a la página con los
resultados del proyecto:
no has trabajado antes con Docker estos son los que necesitas para este tutorial:
pasas el id, puedes indicarle sólo los 3 o 4 primeros carácteres en lugar de todo el «churro».
docker stop identificador o nombre
Por ejemplo:
docker stop sonarqube
docker stop ab12
4. Conclusiones
• La Integración Continua nos permite detectar de manera temprana, errores que
son generados por algún integrante del equipo de desarrollo, cada cambio que un
desarrollador realice en un repositorio compartido será descargado, compilado,
testeado (en base a pruebas unitarias y pruebas de aceptación) por el servidor de
integración continua.