Академический Документы
Профессиональный Документы
Культура Документы
“INTEGRACION CONTINUA”
Cochabamba - Bolivia
2019
Dedicatoria
i
Agradecimientos
Durante la etapa de mi estudio, hasta finalizar mis estudios, existen un grupo de
personas a las que no puedo dejar de reconocer y hacer mension debido a que
durante todo este tiempo estuvieron presentes de una u otra forma evitando que me
perdiera en el proceso.
A Dios….por brindarme la vida y darme las bendiciones de mi vida.
A mí familia… sin duda uno de los principales precursores de este logro, hicieron todo
lo posible por ayudarme siempre, nunca se rindieron con mi aprendizaje y me
impulsaban para que yo pudiera seguir con mis estudios.
A mi hijo y mi señora que por brindarme la motivación de continuar y impulsarme a
seguir, por ser el motor que sin saberlo mi hijo ayudo a culminar este logro.
A Jose Maria Zambrana y Diego A. Zambrana por apoyarme y alentarme a seguir,
porque nunca dudaron de mí capacidad y siempre me incentivaron a seguir adelante.
ii
RESUMEN
Esta secuencia de pasos a menudo son tediosos e involucran una cierta cantidad
de tiempo, tiempo en el que regularmente como desarrollador se demora demaciado.
Por lo tanto para evitar esto problemas es que surge la integración continua, ya que
esta es una serie de buenas prácticas con la finalidad principal de realizar comproba-
ciones automáticas y periódicas de la evolución de un proyecto de manera que sirva
para agilizar la producción de las aplicaciones.
iii
ÍNDICE GENERAL
DEDICATORIA I
AGRADECIMIENTOS II
RESUMEN III
1. Introducción 1
2. Antecedentes 4
2.1. Antecedentes generales . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2. Antecedentes específicos . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3. Metodología 8
4. Integración continua 9
4.1. Definición . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
4.2. Características . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
4.3. Importancia de la integración continua . . . . . . . . . . . . . . . . . . . . 11
4.4. Sistema de integración continua . . . . . . . . . . . . . . . . . . . . . . . 12
4.5. ¿Qué es la entrega continua? . . . . . . . . . . . . . . . . . . . . . . . . . 12
4.6. Control de versiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
4.7. GitFlow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
4.7.1. Ramas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4.7.2. Merge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4.8. Ventajas de la integración continua . . . . . . . . . . . . . . . . . . . . . . 17
4.9. Desventajas de la integración continua . . . . . . . . . . . . . . . . . . . . 18
iv
5.9. Accesibilidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
5.10.Buena comunicación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
5.11. Despliegue automatizado . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
7. Conclución 36
v
ÍNDICE DE FIGURAS
vi
1 INTRODUCCIÓN
1
esta inmerso: entrega continua y despliegue continuo. La integración continua se re-
fiere en su mayoría a la fase de creación o integración del proceso de publicación de
software y conlleva un componente de automatización por ejemplo un servicio de ver-
siones y un componente cultural aprender a integrar con frecuencia.
2
Figura 1.3: Flujo automatización de herramientas recuperado de
https://blog.callr.tech/gitlab-ansible-docker-ci-cd/
2
Confirmar un conjunto de cambios provisionales de forma permanente
3
fusionar código
3
2 ANTECEDENTES
Por tanto con el concepto anterior la integración continua es una serie de pasos de
buenas prácticas con el fin de realizar comprobaciones automáticas y periódicas de
código con el objetivo de detectar errores lo mas antes posible y analizar la calidad de
software es decir el control constante del desarrollo de software.
Tener un repositorio maestro donde esté disponible todo el código fuente y del
que cualquier integrante del equipo pueda obtenerlo.
Automatizar las pruebas para que sea posible ejecutar la matriz (suite) de pruebas
en cualquier momento con un solo comando.
Asegurar que cualquiera puede obtener el ejecutable más reciente y tener la con-
fianza de que es la mejor versión hasta el momento.
Todo esto requiere bastante disciplina y requiere un esfuerzo significativo para intro-
ducirlo a un proyecto, pero una vez habilitado es sencillo mantenerlo y brinda grandes
4
beneficios.
Para alcanzar el objetivo principal existen herramientas muy potentes que facilitan
la realización de cada una de estas tareas.
5
Figura 2.2: Interacción de las herramientas
Fuente: https://www.autentia.com/2018/08/17/entendiendo-devops-en-
5-minutos/
6
Figura 2.3: Construyendo una tubería de entrega continua
Fuente: https://dzone.com/articles/building-a-continuous-delivery-
pipeline-using-jenk
7
3 METODOLOGÍA
8
4 INTEGRACIÓN CONTINUA
4.1. Definición
9
La integración continua es una práctica de desarrollo que requiere que los desa-
rrolladores integren el código en un repositorio compartido varias veces al día. Cada
registro se verifica luego mediante una compilación automatizada, lo que permite a los
equipos detectar problemas en una etapa temprana. Al integrarse regularmente, puede
detectar errores rápidamente y localizarlos más fácilmente.
debe tomar Nota: a lo largo de este artículo se menciona frecuentemente el con-
cepto de “integrar”software. Esto se refiere al proceso específico de generar una versión
ejecutable de un software, que puede involucrar compilar el código fuente, empaquetar,
incluir archivos de configuración, etc.
4.2. Características
10
llega a dividir el trabajo en pequeñas tareas,también denominadas sprints 2 , que no
suponen un gran esfuerzo ni se necesita 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, se puede seguir creando o entrando 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.
Ágil 3 implica trabajar de forma rápida e intentar reducir el rango de errores al mínimo
posible. Una forma de poder conseguirlo es fomentando el trabajo en equipo, de forma
que se ayuden para superar las trabas y aprendan los unos de los otros.
Otra característica es desglosar los grandes proyectos en pequeñas tareas, de forma
que el trabajo se mucho más llevadero, la presión menor y los tiempos de entrega /
validación, más frecuentes.
Por lo tanto, un flujo contínuo de revisiones, opiniones, pruebas, retro alimentación
entre el cliente y entre los miembros del equipo, superación de errores, cuidar el código
y trabajar cómodo hace que este tipo de prácticas sean tan frecuente hoy en día. Ahora
es posible que un trabajo sea más eficiente y rentable.
Beck realizó una publicación donde puso énfasis en la importancia que implica bá-
sicamente con el cumplimiento del objetivo del desarrollo de las aplicaciones modernas
que es contar con múltiples desarrolladores que trabajen de forma simultánea en dis-
tintas funciones de la misma aplicación. Sin embargo, si una organización fusiona todo
el código fuente diversificado en un solo día (conocido como el ”día de la fusión”), las
tareas resultantes pueden ser tediosas y manuales, y pueden tomar mucho tiempo.
Esto sucede porque, cuando un desarrollador trabaja de forma aislada para imple-
mentar un cambio en una aplicación, existe la posibilidad de que este cambio entre en
conflicto con otros cambios implementados simultáneamente por otros desarrolladores.
La integración continua ayuda a que los desarrolladores fusionen los cambios que in-
troducen en el código para incorporarlos a una división compartida (o rama”) con más
frecuencia, incluso diariamente. Una vez que se fusionan los cambios implementados
2
Intervalo prefijado durante el cual se crea un incremento de producto
3
Metodología para desarrollo de software
11
por un desarrollador en una aplicación, se validan con el desarrollo automático de la
aplicación y la ejecución de distintos niveles de pruebas automatizadas (generalmente,
pruebas de unidad e integración) para verificar que los cambios no hayan dañado la
aplicación.
Esto significa probar todo, desde las clases y el funcionamiento hasta los distintos
módulos que conforman toda la aplicación. Si una prueba automática detecta un con-
flicto entre el código nuevo y el existente, la CI facilita la resolución de esos errores con
frecuencia y rapidez.
Para que un sistema de integración continua sea eficiente, hay ciertas prácticas que
debemos llevar a cabo:
Todos los miembros del proyecto hacen commit a una principal todos los dias.
Despliegue continuo
La entrega continua (CD) lleva el principio de CI un paso más allá según Wallgren, A.
(2016): Es el proceso automatizado de compilación y prueba que extiende a todos los
12
Figura 4.2: Ciclo de vida de devOps
Fuente: https://www.edureka.co/blog/devops-tools
13
4.6. Control de versiones
4.7. GitFlow
14
Figura 4.5: git workshop
Fuente: https://fpy.cz/pub/slides/gitworkshop/step1
4.7.1. Ramas
Ramas principales
El repositorio central tiene dos ramas principales con una vida infinita:
15
master
develop
Ramas de apoyo
A diferencia de las ramas principales, estas ramas siempre tienen un tiempo de vida
limitado, ya que eventualmente se eliminarán.
4.7.2. Merge
Es el término fusionar en la sección anterior a una sola rama, por lo general la rama
nueva se integra al master.
16
4.8. Ventajas de la integración continua
aptitud a nivel personal. Puesto que estas prácticas se llevan a cabo en proyec-
tos conjuntos, son los propios desarrolladores los que van analizando el código
creado, apoyándose los unos en los otros. Los mismos aprenderan diferentes mé-
todos de integración y se ven obligados a superar día tras día diferentes errores
o fallos encontrados en el código creado. Esto implica fomentar 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.
A su vez, en todo momento cada miembro del equipo tiene acceso a la versión
final.
17
En resumen, los beneficios de la integración continua consisten en “resolver pro-
blemas rápidamente”. Dado que el software es integrado frecuentemente, cuando se
encuentra un error típicamente no es necesario retroceder mucho para descubrir don-
de se introdujo la falla. En comparación, cuando un equipo no sigue una estrategia de
integración continua los periodos entre integración son largos y la base de código es
muy distinta entre cada integración por lo que cuando se encuentran errores hay que
revisar mucho más código, lo cual requiere un mayor tiempo y esfuerzo. En palabras
de Fowler, “la integración continua no elimina los defectos, pero si hace que sea mucho
más fácil encontrarlos y corregirlos”.
18
5 PASOS A REALIZAR PARA INTEGRACIÓN
CONTINUA
Existen elementos indispensables según Adanza, F. (2016) los implicados son parte
de la integración continua y es como parte de los requerimientos que se necesita para
la CI.
Según Fowler (2006) trata de uno de los factores más importantes, ya que todos
los integrantes del equipo deberán utilizar la misma herramienta, es decir, el mismo
repositorio, cuando trabajen en el código. Y esto no solo se aplica al código fuente.
Para que funcionen las aplicaciones, se necesitan otros elementos como, por ejemplo,
bases de datos, que también deberán estar contenidos en el mismo lugar. Por ello, Mar-
tin Fowler recomienda construir un repositorio de tal forma que cualquier ingeniero que
se incorpore al proyecto con un equipo nuevo encuentre todos los archivos necesarios
en un único lugar.
19
5.3. Sistemas que realizan sus propias pruebas
1
Construir
2
Integración Continua
20
5.6. Reparación inmediata
Las pruebas deberán realizarse en un entorno seguro y con una configuración exac-
tamente igual que la del entorno de producción. Bajo determinadas circunstancias, esto
podría resultar muy costoso, pero la virtualización de los equipos hará que el factor de
los costes se reduzca.
3
Metodología de programación
21
5.9. Accesibilidad
No solo resulta importante que todos los implicados tengan acceso al código fuente
y puedan ejecutar el archivo, sino que, además, debe quedar constancia de quién ha
realizado qué modificación. Asimismo, los desarrolladores deben informar cuando se
encuentren en un proceso de compilación, para lo que algunos equipos utilizan ele-
mentos visuales que indican que se está trabajando en la integración.
Por último, ha de automatizar el despliegue del software. Para llevar a cabo la in-
tegración continua se deben mover ejecutables entre múltiples entornos, lo que puede
requerir una gran cantidad de tiempo. Por ello, será mejor hacerlo de forma automática
utilizando scripts 4 que faciliten el despliegue de aplicaciones entre entornos.
4
Texto que consta de una serie de instrucciones que deben ejecutarse
22
6 HERRAMIENTAS PARA CREAR UN ENTORNO
DE INTEGRACIÓN CONTINUA
Las herramientas de integración continua se pueden integrar unas con otras para
generar un flujo de trabajo.
6.1. Jenkins
23
Suele ser usado para proyectos escritos en Java, pero también puede trabajar con
otros lenguajes como C, Python, Ruby, etc., además permite usar un gran número de
herramientas de construcción, tales como Ant, Maven, Kundo, Gradle, etc. El servi-
dor de Jenkins obtiene la información derivada de los fallos de construcción y permite
enviar, a traves de su sistema de notificaciones, esta información a los miembros en-
cargados del proyecto.
Ademas permite usar una gran cantidad de SCMs, algunos de ellos son CVS, Git,
Bazaar, Integrity, Mercurial, Perforce, Subversion, Vault, etc. Para extender su funciona-
lidad tiene un gran numero de plugins. Estos plugins permiten integrar este servidor con
otras herramientas como IceScrum, más herramientas de construcción y una gran can-
tidad de herramientas de pruebas como Selenium, JMeter, xUnit, MSTest TRX, JSUnit,
etc. Por otro lado una de las extensiones de Jenkins mas llamativas para el presente
trabajo, es el plugin delivery-pipeline-plugin.
Se puede notar que Jenkins constituye uno de los servidores de integración continua
mas completos, que destaca debido a su alta funcionalidad, integración con muchos
entornos y herramientas, una importante extensibilidad, que como se ha descrito en
el documento se lleva a cabo mediante plugins y por la cantidad de documentación
que existe de esta herramienta. A su vez este servidor se ve avalado por una gran
comunidad.
El comando introducido lo que realizara es construir una imagen desde del archivo
“Dockerfile”.
docker run -d -p 80:8080 -p 50000:50000 jenkis - elvikito
24
servirá para crear la cuenta de usuario de Jenkins.
Para acceder al contenedor jenkis-elvikito, simplemente hay que abrir un navegador
web y navegar localmente o haciendo uso de su aplicación web (Kunja, 2017):
http :// localhost :80 o http ://127.0.0.1:80
La primera vez que se accede mediante la url, debe crear la cuenta de administrador,
para poder acceder a la gestión de tareas dentro del propio Jenkins.
25
Figura 6.4: Ventana de dashboard de jenkins
Fuente: elaboración propia
1. General
En este paso se establecen el nombre y se define el tipo de tarea. Una vez in-
troducido en nombre y se selecciona el tipo de tarea se presiona ok y la tarea se
genera para poder configurar posteriormente.
26
2. Source Code Management
3. Build Triggers
27
En este paso se establece que la ejecución de la build empezará cada dia a las
8 am obteniendo el código desde GitLab de la rama master. Aquí es donde se
programa la ejecución de la tarea y que sea periódica, debe definirse el periodo
de ejecución de lo contrario no se ejecutará de manera periodica
4. Build Environment
En este paso se establece que la ejecución contenga variables que puedan utili-
zar, por ejemplo alguna ruta de un archivo.
5. Build
28
Figura 6.9: Paso Build de la tarea
Fuente: elaboración propia
6. Build Settings
7. Logs
29
Figura 6.11: Los Logs generados por la tarea
Fuente: elaboración propia
Este paso es la que una vez ejecutado se puede visualizar los mensajes de la
ejecución, son los comandos, instrucciones que recibio la tarea.
6.2. GitLab
30
Figura 6.12: GitLab y jenkins
Fuente https://www.edureka.co/blog/devops-tools
6.3. SonarQube
31
del software analizando las dependencias entre las clases del proyecto. Esto nos per-
mite actuar a tiempo frente a crear un enmarañado de clases totalmente acopladas y
difícilmente reutilizables.
Duplicidad de Código: Sonarqube nos proporciona métricas de código duplicado, pu-
diendo detectar partes de nuestro software se asemejan, pudiendo así tomar decisiones
como desacoplar componentes o aplicar técnicas de refactoring utilizando el poliformis-
mo, la herencia y la reutilización de componentes.
Detección de Vulnerabilidades: Sonarqube cuenta con una base de datos de codes-
mells y errores típicos de programación que detectan si alguna línea de código puede
estar cometiendo algún problema que pueda vulnerar la seguridad. Por ejemplo, a la
hora de cómo recoger los parámetros o cómo usarlos en nuestras consultas para evitar
SQL Injection. Standard de codificación: Avisándonos de partes del código que no cum-
plan con el PSR o incluyan malas prácticas a la hora de definir constantes, variables,
llamadas a métodos estáticos.
Monitorización de Cobertura: En nuestro caso también lo usamos para poder moni-
torizar si la cobertura de los tests es aceptable y de esta manera tener una visión global
del estado de la cobertura de todos los proyectos e invertir en incrementar el volumen
de tests del proyecto.
32
6.4. Nexus
Apache Maven (2019) es una de las herramientas más usadas en la gestión y cons-
trucción de proyectos software Java creado en 2002 por Jason van Zyl, y cuya mayoría
de ellos se encuentra en Apache Ant, make, PEAR, CPAN, etc. Esta herramienta se ba-
sa fundamentalmente en la estructura del proyecto, el software que se va a gestionar y
un archivo que describe todas las propiedades del proyecto denominado POM (Project
Object Model). Este último archivo está escrito en formato XML y contiene información
como un identificador único del proyecto, licencia, miembros del proyecto, dependen-
cias del proyecto, repositorios remotos de artefactos Maven (los que se pueden obtener
las dependencias requeridas por el proyecto), plugins que aplicar añadir al proyecto y
muchos otros. Se puede definir un ciclo de vida estricto para una aplicación de ma-
nera que la ejecución de una fase de este ciclo implica la ejecución de todas las fases
anteriores. De manera ordenada las fases que definen el ciclo de vida del proyecto son:
33
Implementar: Copia el paquete generado en un servidor remoto para que pueda
ser usado de nuevo por cualquier otro proyecto.
6.6. Docker
34
6.6.1. Comandos básicos
docker pull jenkins Descarga la imagen oficial de Jenkins que se encuentra en Doc-
kerHub. ventana acoplable ejecutar un nuevo contenedor. Este comando tiene diferen-
tes parámetros de entrada:
-v /dev: /code Monta el directorio /dev como el directorio /code dentro del conte-
nedor.
jenkins:1.2 Instancia la versión 1.2 de Jenkins (si ponemos latest como versión,
descarga la más reciente).
35
7 CONCLUCIÓN
36
Referencias Bibliográficas
Martin Fowler (2006, 1 de Mayo). Continuous Integration. Disponible en
https://martinfowler.com/articles/continuousIntegration.html
Gómez-Luna, E., & Fernando-Navas, D., & Aponte-Mayor, G., & Betancourt-Buitrago,
L. (2014). Metodología para la revisión bibliográfica y la gestión de información de
temas científicos, atraves de su estructuración y sistematización. Dyna, 81 (184),
158-163.
37
P. M. Duvall, S. Matyas, and A. Glover (2007) Continuous integration: improving
software quality
and reducing risk. Pearson Education.
Fowler, M., Beck, K., Brant, and J. (2009) Refactoring: Improving the Design of
Existing Code.
Jenkins 1.396 released, The first release of Jenkins is posted, Kohsuke Kawagu-
chi.
38
8 ANEXO I: DOCKERFILE JENKINS
MAINTAINER elvikito
USER root
RUN apk update
RUN apk add wget curl openssh - server nano sudo
RUN echo " alias nano =' export TERM = xterm && nano '" >> / root /. bashrc
RUN echo " jenkins ALL = NOPASSWD : ALL " >> / etc / sudoers
ARG maven_filename =" apache - maven -${ maven_version }- bin . tar .gz"
ARG maven_filemd5 =" 516923 b3955b6035ba6b0a5b031fbd8b "
ARG maven_url =" http :// archive . apache . org / dist / maven /\
maven -3/ ${ maven_version }/ binaries /${ maven_filename }"
ARG maven_tmp ="/ tmp /${ maven_filename }"
39
RUN wget --no - verbose -O ${ maven_tmp } ${ maven_url }
RUN echo "${ maven_filemd5 } ${ maven_tmp }" | md5sum -c
# install maven
RUN tar xzf ${ maven_tmp } -C / opt / \
&& ln -s / opt / apache - maven -${ maven_version } ${ MAVEN_HOME } \
&& ln -s ${ MAVEN_HOME }/ bin / mvn / usr / local / bin
USER jenkins
RUN echo " alias nano =' export TERM = xterm && nano '" \
>> ${ JENKINS_HOME }/. bash_aliases
40
8.2. Micro servicios
41
Figura 8.2: Arquitectura implementada Fuente http://oa.upm.es/37313/
42