SlideShare una empresa de Scribd logo
1 de 41
DevOps Práctico para
Plataformas Java y Web
16 de marzo de 2016
Jorge Hidalgo
@_deors
Sobre nosotros
Copyright © 2016 Accenture All rights reserved. 2
Vicente González
@viarellano
Julio Palma
@restalion
Trabajamos en Coritel, empresa del grupo Accenture
oficina de Málaga – Accenture Delivery Center in Spain
formamos parte de los grupos global y local de Java y DevOps en Accenture
Workshop (primera parte)
3Copyright © 2016 Accenture All rights reserved.
4
Guía para el taller – Descarga desde GitHub
• Buscar en Google GitHub Accenture o entrar directamente a https://github.com/Accenture.
• En la página de GitHub buscar el proyecto adop-docker-compose
• Copiar la URL del clonado desde la página de GitHub.
Copyright © 2016 Accenture All rights reserved.
5
Guía para el taller – Descarga desde GitHub
• Buscar en Google GitHub Accenture o entrar directamente a https://github.com/Accenture.
• En la página de GitHub buscar el proyecto adop-docker-compose
• Copiar la URL del clonado desde la página de GitHub.
• Desde un interfaz de comandos ejecutar la instrucción git-bash
Copyright © 2016 Accenture All rights reserved.
6
Guía para el taller – Descarga desde GitHub
• Buscar en Google GitHub Accenture o entrar directamente a https://github.com/Accenture.
• En la página de GitHub buscar el proyecto adop-docker-compose
• Copiar la URL del clonado desde la página de GitHub.
• Desde un interfaz de comandos ejecutar la instrucción git-bash
• En el bash clonar el proyecto:
– Ir a la ruta C:HackersWeekdevops
– Teclear git clone <URL>
Copyright © 2016 Accenture All rights reserved.
7
Guía para el taller – Descarga desde GitHub
• Buscar en Google GitHub Accenture o entrar directamente a https://github.com/Accenture.
• En la página de GitHub buscar el proyecto adop-docker-compose
• Copiar la URL del clonado desde la página de GitHub.
• Desde un interfaz de comandos ejecutar la instrucción git-bash
• En el bash clonar el proyecto:
– Ir a la ruta C:HackersWeekdevops
– Teclear git clone <URL>
• Si todo ha ido bien en el directorio existe un subdirectorio llamado adop-docker-compose.
• Dentro de ese directorio copiamos el script que está en la ruta C:HackersWeekdevops:
– La mitad de las máquinas: hw3-setup-zona1.sh
– La otra mitad: hw3-setup-zona2.sh
• Ejecutamos el script, pasándole como parámetro el número del PC (mirad la etiqueta sobre la torre), el script creará
una VM en Amazon Web Services para cada uno, y empezará a descargarse todo el contenido de ADOP.
Copyright © 2016 Accenture All rights reserved.
¿Qué es DevOps?
8Copyright © 2016 Accenture All rights reserved.
9
¿Qué es DevOps?
DevOps es una estrategia dedicada a promover la colaboración,
eliminando las fricciones entre los equipos de Desarrollo y Operaciones
Copyright © 2016 Accenture All rights reserved.
Desarrollo Operaciones
DevOps
Dev quiere cambios Ops quiere estabilidad
Todos quieren...
Software estable y operable
Procesos de entregas optimizados y consistentes
Cumplimiento de estándares (infraestructura, plataforma)
Bajo riesgo y gran cantidad de cambios
Código confiable e integridad del software
Alta disponibilidad y entornos predecibles
10
Principios de DevOps
Copyright © 2016 Accenture All rights reserved.
Prácticas de gestión de
la configuración sólidas
Despliegue continuo de
valor de negocio (Lean IT)
Automatización de pruebas
Prueba continua
Flujos de trabajo
Entrega continua
Arquitectura de grano fino
Micro-servicios
Colaboración y empatía
Sin silos o juegos de la culpa
Construcción y
despliegue automático
Recursos elásticos
Cloud
Diseño robusto y resiliencia
Degradación gradual
Experimentación oportunista
Mejora continua
Accenture DevOps Platform
11Copyright © 2016 Accenture All rights reserved.
12
Accenture DevOps Platform
Copyright © 2016 Accenture All rights reserved.
Hosting en cloud y accesso a los servicios de aplicación usando una plataforma cloud aprobada por Accenture
Release
Dev.
Source
Control
Code
Review
Build
Code
Quality
Deploy Testing
A-B
Test
ADOP es una plataforma de desarrollo basado en la nube, une una colección integrada de herramientas Open
Source para el desarrollo, despliegue y control de aplicaciones usando las mejores prácticas de DevOps. ADOP
puede provisionarse en menos de 10 minutos, permite a los proyectos una configuración rápida de pipelines y
entornos, reduciendo el coste de desarrollo, prueba y entrega de código.
Los recursos y herramientas soportan el proceso y las entregas de calidad
Beneficios
Entrega con ConfianzaTiempo a mercado Riesgo de los Cambios
• Nuevas características
entregadas en días o semanas
no meses
• La experimentación continua
permite que los servicios se
mejoren continuamente
• Las métricas permiten mejorar
la productividad
• Los cambios se introducen en
tiempo real y son fáciles de
revertir
• Las pruebas se ejecutan en
entornos representativos
configurados automáticamente
• Eliminación de los fallos de
regresión
• Gestión de la liberación de
nuevas características
• Métricas centradas en el negocio
que permiten un control en
tiempo real del servicio
• Vulnerabilidades de seguridad
identificadas en tiempo de
construcción
13
Accenture DevOps Platform es un Proyecto OpenSource
Copyright © 2016 Accenture All rights reserved.
Se trata de un proyecto Open Source, contribuido por Accenture, bajo licencia de Apache.
Disponible en GitHub se puede descargar, modificar, contribuir… Pull Requests are welcomed!!
14
Herramientas de ADOP
Copyright © 2016 Accenture All rights reserved.
15
Gerrit
• Gerrit proporciona una herramienta web de revisión de código y gestión del repositorio para el sistema de control de
versiones Git.
Copyright © 2016 Accenture All rights reserved.
16
Gerrit
• Gerrit proporciona una herramienta web de revisión de código y gestión del repositorio para el sistema de control de
versiones Git.
• Permite discutir las modificaciones en el código.
– Revisa las versiones antiguas y nuevas del código con marcas de colores. Permite discutir secciones específicas
con otros desarrolladores para hacer los cambios correctos.
Copyright © 2016 Accenture All rights reserved.
17
Gerrit
• Gerrit proporciona una herramienta web de revisión de código y gestión del repositorio para el sistema de control de
versiones Git.
• Permite discutir las modificaciones en el código.
– Revisa las versiones antiguas y nuevas del código con marcas de colores. Permite discutir secciones específicas
con otros desarrolladores para hacer los cambios correctos.
• Gestionar y servir repositorios Git
– Gerrit incluye servidores Git compatibles con todos los clientes Git accesibles vía SSH o HTTPS.
– Simplifica la gestión alojando varios repositorios Git juntos.
Copyright © 2016 Accenture All rights reserved.
18
Jenkins
• La integración continua consiste en tener todo el trabajo de desarrollo integrado de forma que en base a una
planificación o evento el trabajo se construye y prueba automáticamente. La idea es que los errores de desarrollo se
detecten lo antes posible en el proceso.
• Los siguientes pasos explican a alto nivel cómo es el ciclo de vida del desarrollo con integración continua:
Copyright © 2016 Accenture All rights reserved.
19
Selenium Grid
• Selenium automatiza los navegadores. Principalmente se utiliza para automatizar
aplicaciones web para realizar pruebas, pero no está limitado a eso. Tareas de
administración repetitivas basadas en herramientas web pueden (y deben)
automatizarse.
• El principal cambio reciente en Selenium ha sido la inclusión del API Web Driver.
Esto nos permite manejar nativamente el navegador de forma local o remota usando
Selenium Server, es un gran paso adelante en términos de automatización.
• WebDriver se diseñó como un interfaz de programación más simple y concisa que
permite evitar algunas limitaciones del API Selenium-RC.
• Se trata de una API Orientada a Objetos.
• Maneja el navegador de forma mucho más efectiva y supera las limitaciones de
Selenium 1.x que afectan a al cobertura de nuestros test funcionales, como por
ejemplo la descarga o subida de ficheros, pop-ups y diálogos.
Copyright © 2016 Accenture All rights reserved.
20
SonarQube
• SonarQube nos permite realizar un control continuo de la
calidad técnica del código fuente y ejecutar pruebas unitarias
automáticas.
• Soporta más de 20 lenguajes de programación diferentes,
incluyendo Java, C#, C/C++, Objective-C, PL/SQL…
Copyright © 2016 Accenture All rights reserved.
21
Docker
• Docker nos permite empaquetar nuestra aplicación con todas sus dependencias en
unidades estandarizadas.
– Los contenedores Docker “envuelven” un trozo de software dentro de un sistema de
ficheros completo que contiene todo lo necesario para su ejecución: código, runtime,
herramientas y librerías de sistema (cualquier cosa que puedas instalar en un servidor)
– Esto garantiza que siempre ejecutas lo mismo, sin importar el entorno en el que lo
ejecutas.
Copyright © 2016 Accenture All rights reserved.
22
Docker
• Docker nos permite empaquetar nuestra aplicación con todas sus dependencias en
unidades estandarizadas.
• Características:
– Ligero
• Los contenedores que se ejecutan en la misma máquina comparten el mismo kernel
del sistema operativo de forma que arrancan instantáneamente y realizan un uso más
eficiente de la RAM.
• Las imágenes se construyen como sistema de ficheros por capas de forma que
compartan ficheros comunes, así se logra un uso más eficiente de la capacidad del
disco y las descargas.
– Abierto
• Los contenedores se basan en estándares abiertos permitiendo a los contenedores
ejecutarse en la mayoría de distribuciones Linux y sistemas operativos de Microsoft.
– Seguro
• Los contenedores aíslan las aplicaciones unas de otras y de la infraestructura mientras
proveen a la aplicación de una nueva capa de protección.
Copyright © 2016 Accenture All rights reserved.
Workshop (segunda parte)
23Copyright © 2016 Accenture All rights reserved.
24
Guía para el taller
• Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta.
Copyright © 2016 Accenture All rights reserved.
25
Guía para el taller
• Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta.
• Ejecutamos las dos instrucciones que nos indica el script.
– Así añadimos la información de la máquina al entorno, para que sea utilizada por docker.
Copyright © 2016 Accenture All rights reserved.
26
Guía para el taller
• Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta.
• Ejecutamos las dos instrucciones que nos indica el script.
• Comprobamos que la imagen se ha montado correctamente con docker-machine ls.
Copyright © 2016 Accenture All rights reserved.
27
Guía para el taller
• Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta.
• Ejecutamos las dos instrucciones que nos indica el script.
• Comprobamos que la imagen se ha montado correctamente con docker-machine ls.
• Accedemos a la URL de nuestra máquina tal y como nos indica el script.
– Debemos ver la página de inicio de ADOP con todas las herramientas disponibles.
Copyright © 2016 Accenture All rights reserved.
28
Guía para el taller
• Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta.
• Ejecutamos las dos instrucciones que nos indica el script.
• Comprobamos que la imagen se ha montado correctamente con docker-machine ls.
• Accedemos a la URL de nuestra máquina tal y como nos indica el script.
• Desde Jenkins creamos un nuevo job de despliegue en CI.
Copyright © 2016 Accenture All rights reserved.
29
Guía para el taller
• Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta.
• Ejecutamos las dos instrucciones que nos indica el script.
• Comprobamos que la imagen se ha montado correctamente con docker-machine ls.
• Accedemos a la URL de nuestra máquina tal y como nos indica el script.
• Desde Jenkins creamos un nuevo job de despliegue en CI.
• Lanzamos el pipeline y comprobamos la información del build y la aplicación.
Copyright © 2016 Accenture All rights reserved.
30
Guía para el taller
• Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta.
• Ejecutamos las dos instrucciones que nos indica el script.
• Comprobamos que la imagen se ha montado correctamente con docker-machine ls.
• Accedemos a la URL de nuestra máquina tal y como nos indica el script.
• Desde Jenkins creamos un nuevo job de despliegue en CI.
• Lanzamos el pipeline y comprobamos la información del build y la aplicación.
• Clonamos el repositorio en Gerrit.
Copyright © 2016 Accenture All rights reserved.
31
Guía para el taller
• Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta.
• Ejecutamos las dos instrucciones que nos indica el script.
• Comprobamos que la imagen se ha montado correctamente con docker-machine ls.
• Accedemos a la URL de nuestra máquina tal y como nos indica el script.
• Desde Jenkins creamos un nuevo job de despliegue en CI.
• Lanzamos el pipeline y comprobamos la información del build y la aplicación.
• Clonamos el repositorio en Gerrit.
• Realizamos una modificación (por ejemplo añadiendo un mensaje en el jsp de inicio) y lo subimos con commit/push
Copyright © 2016 Accenture All rights reserved.
32
Guía para el taller
• Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta.
• Ejecutamos las dos instrucciones que nos indica el script.
• Comprobamos que la imagen se ha montado correctamente con docker-machine ls.
• Accedemos a la URL de nuestra máquina tal y como nos indica el script.
• Desde Jenkins creamos un nuevo job de despliegue en CI.
• Lanzamos el pipeline y comprobamos la información del build y la aplicación.
• Clonamos el repositorio en Gerrit.
• Realizamos una modificación (por ejemplo añadiendo un mensaje en el jsp de inicio) y lo subimos con commit/push
• Lanzamos el pipeline y comprobamos que el cambio se ha subido a CI
Copyright © 2016 Accenture All rights reserved.
33
Guía para el taller
• Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta.
• Ejecutamos las dos instrucciones que nos indica el script.
• Comprobamos que la imagen se ha montado correctamente con docker-machine ls.
• Accedemos a la URL de nuestra máquina tal y como nos indica el script.
• Desde Jenkins creamos un nuevo job de despliegue en CI.
• Lanzamos el pipeline y comprobamos la información del build y la aplicación.
• Clonamos el repositorio en Gerrit.
• Realizamos una modificación (por ejemplo añadiendo un mensaje en el jsp de inicio) y lo subimos con commit/push
• Lanzamos el pipeline y comprobamos que el cambio se ha subido a CI
• Creamos un nuevo entorno de preproducción, añadimos un job de despliegue en preproducción y ejecutamos el job.
Copyright © 2016 Accenture All rights reserved.
34
Guía para el taller
• Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta.
• Ejecutamos las dos instrucciones que nos indica el script.
• Comprobamos que la imagen se ha montado correctamente con docker-machine ls.
• Accedemos a la URL de nuestra máquina tal y como nos indica el script.
• Desde Jenkins creamos un nuevo job de despliegue en CI.
• Lanzamos el pipeline y comprobamos la información del build y la aplicación.
• Clonamos el repositorio en Gerrit.
• Realizamos una modificación (por ejemplo añadiendo un mensaje en el jsp de inicio) y lo subimos con commit/push
• Lanzamos el pipeline y comprobamos que el cambio se ha subido a CI
• Creamos un nuevo entorno de preproducción, añadimos un job de despliegue en preproducción y ejecutamos el job.
• Comprobamos que en preproducción se han subido los cambios.
Copyright © 2016 Accenture All rights reserved.
35
Guía para el taller
• Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta.
• Ejecutamos las dos instrucciones que nos indica el script.
• Comprobamos que la imagen se ha montado correctamente con docker-machine ls.
• Accedemos a la URL de nuestra máquina tal y como nos indica el script.
• Desde Jenkins creamos un nuevo job de despliegue en CI.
• Lanzamos el pipeline y comprobamos la información del build y la aplicación.
• Clonamos el repositorio en Gerrit.
• Realizamos una modificación (por ejemplo añadiendo un mensaje en el jsp de inicio) y lo subimos con commit/push
• Lanzamos el pipeline y comprobamos que el cambio se ha subido a CI
• Creamos un nuevo entorno de preproducción, añadimos un job de despliegue en preproducción y ejecutamos el job.
• Comprobamos que en preproducción se han subido los cambios.
• Creamos un nuevo entorno de producción, añadimos un job de despliegue en producción y ejecutamos el job.
Copyright © 2016 Accenture All rights reserved.
36
Guía para el taller
• Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta.
• Ejecutamos las dos instrucciones que nos indica el script.
• Comprobamos que la imagen se ha montado correctamente con docker-machine ls.
• Accedemos a la URL de nuestra máquina tal y como nos indica el script.
• Desde Jenkins creamos un nuevo job de despliegue en CI.
• Lanzamos el pipeline y comprobamos la información del build y la aplicación.
• Clonamos el repositorio en Gerrit.
• Realizamos una modificación (por ejemplo añadiendo un mensaje en el jsp de inicio) y lo subimos con commit/push
• Lanzamos el pipeline y comprobamos que el cambio se ha subido a CI
• Creamos un nuevo entorno de preproducción, añadimos un job de despliegue en preproducción y ejecutamos el job.
• Comprobamos que en preproducción se han subido los cambios.
• Creamos un nuevo entorno de producción, añadimos un job de despliegue en producción y ejecutamos el job.
• Comprobamos que en producción se han subido los cambios.
Copyright © 2016 Accenture All rights reserved.
37
Guía para el taller
• Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta.
• Ejecutamos las dos instrucciones que nos indica el script.
• Comprobamos que la imagen se ha montado correctamente con docker-machine ls.
• Accedemos a la URL de nuestra máquina tal y como nos indica el script.
• Desde Jenkins creamos un nuevo job de despliegue en CI.
• Lanzamos el pipeline y comprobamos la información del build y la aplicación.
• Clonamos el repositorio en Gerrit.
• Realizamos una modificación (por ejemplo añadiendo un mensaje en el jsp de inicio) y lo subimos con commit/push
• Lanzamos el pipeline y comprobamos que el cambio se ha subido a CI
• Creamos un nuevo entorno de preproducción, añadimos un job de despliegue en preproducción y ejecutamos el job.
• Comprobamos que en preproducción se han subido los cambios.
• Creamos un nuevo entorno de producción, añadimos un job de despliegue en producción y ejecutamos el job.
• Comprobamos que en producción se han subido los cambios.
• Realizamos un cambio “con error” en el código y lo subimos al repositorio con commit/push
Copyright © 2016 Accenture All rights reserved.
38
Guía para el taller
• Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta.
• Ejecutamos las dos instrucciones que nos indica el script.
• Comprobamos que la imagen se ha montado correctamente con docker-machine ls.
• Accedemos a la URL de nuestra máquina tal y como nos indica el script.
• Desde Jenkins creamos un nuevo job de despliegue en CI.
• Lanzamos el pipeline y comprobamos la información del build y la aplicación.
• Clonamos el repositorio en Gerrit.
• Realizamos una modificación (por ejemplo añadiendo un mensaje en el jsp de inicio) y lo subimos con commit/push
• Lanzamos el pipeline y comprobamos que el cambio se ha subido a CI
• Creamos un nuevo entorno de preproducción, añadimos un job de despliegue en preproducción y ejecutamos el job.
• Comprobamos que en preproducción se han subido los cambios.
• Creamos un nuevo entorno de producción, añadimos un job de despliegue en producción y ejecutamos el job.
• Comprobamos que en producción se han subido los cambios.
• Realizamos un cambio “con error” en el código y lo subimos al repositorio con commit/push
• Ejecutamos el pipeline y subimos hasta producción, vemos el error.
Copyright © 2016 Accenture All rights reserved.
39
Guía para el taller
• Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta.
• Ejecutamos las dos instrucciones que nos indica el script.
• Comprobamos que la imagen se ha montado correctamente con docker-machine ls.
• Accedemos a la URL de nuestra máquina tal y como nos indica el script.
• Desde Jenkins creamos un nuevo job de despliegue en CI.
• Lanzamos el pipeline y comprobamos la información del build y la aplicación.
• Clonamos el repositorio en Gerrit.
• Realizamos una modificación (por ejemplo añadiendo un mensaje en el jsp de inicio) y lo subimos con commit/push
• Lanzamos el pipeline y comprobamos que el cambio se ha subido a CI
• Creamos un nuevo entorno de preproducción, añadimos un job de despliegue en preproducción y ejecutamos el job.
• Comprobamos que en preproducción se han subido los cambios.
• Creamos un nuevo entorno de producción, añadimos un job de despliegue en producción y ejecutamos el job.
• Comprobamos que en producción se han subido los cambios.
• Realizamos un cambio “con error” en el código y lo subimos al repositorio con commit/push
• Ejecutamos el pipeline y subimos hasta producción, vemos el error.
• Realizamos un rollback del cambio y desplegamos en producción la versión anterior.
Copyright © 2016 Accenture All rights reserved.
Preguntas
40Copyright © 2016 Accenture All rights reserved.
¡Muchas gracias por asistir!
41Copyright © 2016 Accenture All rights reserved.
https://www.coritel.es
https://github.com/Accenture
https://twitter.com/_deors
https://twitter.com/viarellano
https://twitter.com/restalion

Más contenido relacionado

Más de Jorge Hidalgo

Más de Jorge Hidalgo (20)

GraalVM - MadridJUG 2019-10-22
GraalVM - MadridJUG 2019-10-22GraalVM - MadridJUG 2019-10-22
GraalVM - MadridJUG 2019-10-22
 
GraalVM - OpenSlava 2019-10-18
GraalVM - OpenSlava 2019-10-18GraalVM - OpenSlava 2019-10-18
GraalVM - OpenSlava 2019-10-18
 
Architecture 2020 - eComputing 2019-07-01
Architecture 2020 - eComputing 2019-07-01Architecture 2020 - eComputing 2019-07-01
Architecture 2020 - eComputing 2019-07-01
 
GraalVM - JBCNConf 2019-05-28
GraalVM - JBCNConf 2019-05-28GraalVM - JBCNConf 2019-05-28
GraalVM - JBCNConf 2019-05-28
 
GraalVM - MálagaJUG 2018-11-29
GraalVM - MálagaJUG 2018-11-29GraalVM - MálagaJUG 2018-11-29
GraalVM - MálagaJUG 2018-11-29
 
Multilanguage Pipelines with Jenkins, Docker and Kubernetes (Commit Conf 2018)
Multilanguage Pipelines with Jenkins, Docker and Kubernetes (Commit Conf 2018)Multilanguage Pipelines with Jenkins, Docker and Kubernetes (Commit Conf 2018)
Multilanguage Pipelines with Jenkins, Docker and Kubernetes (Commit Conf 2018)
 
Multilanguage Pipelines with Jenkins, Docker and Kubernetes (Oracle Code One ...
Multilanguage Pipelines with Jenkins, Docker and Kubernetes (Oracle Code One ...Multilanguage Pipelines with Jenkins, Docker and Kubernetes (Oracle Code One ...
Multilanguage Pipelines with Jenkins, Docker and Kubernetes (Oracle Code One ...
 
Multilanguage pipelines with Jenkins, Docker and Kubernetes (DevOpsDays Riga ...
Multilanguage pipelines with Jenkins, Docker and Kubernetes (DevOpsDays Riga ...Multilanguage pipelines with Jenkins, Docker and Kubernetes (DevOpsDays Riga ...
Multilanguage pipelines with Jenkins, Docker and Kubernetes (DevOpsDays Riga ...
 
DevOps Te Cambia la Vida - eComputing 2018-07-03
DevOps Te Cambia la Vida - eComputing 2018-07-03DevOps Te Cambia la Vida - eComputing 2018-07-03
DevOps Te Cambia la Vida - eComputing 2018-07-03
 
Open Source Power Tools - Opensouthcode 2018-06-02
Open Source Power Tools - Opensouthcode 2018-06-02Open Source Power Tools - Opensouthcode 2018-06-02
Open Source Power Tools - Opensouthcode 2018-06-02
 
JavaOne 2017 CON3282 - Code Generation with Annotation Processors: State of t...
JavaOne 2017 CON3282 - Code Generation with Annotation Processors: State of t...JavaOne 2017 CON3282 - Code Generation with Annotation Processors: State of t...
JavaOne 2017 CON3282 - Code Generation with Annotation Processors: State of t...
 
JavaOne 2017 CON3276 - Selenium Testing Patterns Reloaded
JavaOne 2017 CON3276 - Selenium Testing Patterns ReloadedJavaOne 2017 CON3276 - Selenium Testing Patterns Reloaded
JavaOne 2017 CON3276 - Selenium Testing Patterns Reloaded
 
JavaOne 2017 CON2902 - Java Code Inspection and Testing Power Tools
JavaOne 2017 CON2902 - Java Code Inspection and Testing Power ToolsJavaOne 2017 CON2902 - Java Code Inspection and Testing Power Tools
JavaOne 2017 CON2902 - Java Code Inspection and Testing Power Tools
 
All Your Faces Belong to Us - Opensouthcode 2017-05-06
All Your Faces Belong to Us - Opensouthcode 2017-05-06All Your Faces Belong to Us - Opensouthcode 2017-05-06
All Your Faces Belong to Us - Opensouthcode 2017-05-06
 
Por qué DevOps, por qué ahora @ CHAPI 2017
Por qué DevOps, por qué ahora @ CHAPI 2017Por qué DevOps, por qué ahora @ CHAPI 2017
Por qué DevOps, por qué ahora @ CHAPI 2017
 
Accenture Liquid Architectures (for Master EMSE UPM-FI - April 2017)
Accenture Liquid Architectures (for Master EMSE UPM-FI - April 2017)Accenture Liquid Architectures (for Master EMSE UPM-FI - April 2017)
Accenture Liquid Architectures (for Master EMSE UPM-FI - April 2017)
 
La JVM y el Internet de las Cosas @ MálagaJUG 2016-11-17
La JVM y el Internet de las Cosas @ MálagaJUG 2016-11-17La JVM y el Internet de las Cosas @ MálagaJUG 2016-11-17
La JVM y el Internet de las Cosas @ MálagaJUG 2016-11-17
 
OpenSlava 2016 - Lightweight Java Architectures
OpenSlava 2016 - Lightweight Java ArchitecturesOpenSlava 2016 - Lightweight Java Architectures
OpenSlava 2016 - Lightweight Java Architectures
 
JavaOne 2016 - CON3080 - Testing Java Web Applications with Selenium: A Cookbook
JavaOne 2016 - CON3080 - Testing Java Web Applications with Selenium: A CookbookJavaOne 2016 - CON3080 - Testing Java Web Applications with Selenium: A Cookbook
JavaOne 2016 - CON3080 - Testing Java Web Applications with Selenium: A Cookbook
 
OpenSouthCode 2016 - Accenture DevOps Platform 2016-05-07
OpenSouthCode 2016  - Accenture DevOps Platform 2016-05-07OpenSouthCode 2016  - Accenture DevOps Platform 2016-05-07
OpenSouthCode 2016 - Accenture DevOps Platform 2016-05-07
 

Hackers Week 3.0 - DevOps Práctico Java-Web 2016-03-16

  • 1. DevOps Práctico para Plataformas Java y Web 16 de marzo de 2016
  • 2. Jorge Hidalgo @_deors Sobre nosotros Copyright © 2016 Accenture All rights reserved. 2 Vicente González @viarellano Julio Palma @restalion Trabajamos en Coritel, empresa del grupo Accenture oficina de Málaga – Accenture Delivery Center in Spain formamos parte de los grupos global y local de Java y DevOps en Accenture
  • 3. Workshop (primera parte) 3Copyright © 2016 Accenture All rights reserved.
  • 4. 4 Guía para el taller – Descarga desde GitHub • Buscar en Google GitHub Accenture o entrar directamente a https://github.com/Accenture. • En la página de GitHub buscar el proyecto adop-docker-compose • Copiar la URL del clonado desde la página de GitHub. Copyright © 2016 Accenture All rights reserved.
  • 5. 5 Guía para el taller – Descarga desde GitHub • Buscar en Google GitHub Accenture o entrar directamente a https://github.com/Accenture. • En la página de GitHub buscar el proyecto adop-docker-compose • Copiar la URL del clonado desde la página de GitHub. • Desde un interfaz de comandos ejecutar la instrucción git-bash Copyright © 2016 Accenture All rights reserved.
  • 6. 6 Guía para el taller – Descarga desde GitHub • Buscar en Google GitHub Accenture o entrar directamente a https://github.com/Accenture. • En la página de GitHub buscar el proyecto adop-docker-compose • Copiar la URL del clonado desde la página de GitHub. • Desde un interfaz de comandos ejecutar la instrucción git-bash • En el bash clonar el proyecto: – Ir a la ruta C:HackersWeekdevops – Teclear git clone <URL> Copyright © 2016 Accenture All rights reserved.
  • 7. 7 Guía para el taller – Descarga desde GitHub • Buscar en Google GitHub Accenture o entrar directamente a https://github.com/Accenture. • En la página de GitHub buscar el proyecto adop-docker-compose • Copiar la URL del clonado desde la página de GitHub. • Desde un interfaz de comandos ejecutar la instrucción git-bash • En el bash clonar el proyecto: – Ir a la ruta C:HackersWeekdevops – Teclear git clone <URL> • Si todo ha ido bien en el directorio existe un subdirectorio llamado adop-docker-compose. • Dentro de ese directorio copiamos el script que está en la ruta C:HackersWeekdevops: – La mitad de las máquinas: hw3-setup-zona1.sh – La otra mitad: hw3-setup-zona2.sh • Ejecutamos el script, pasándole como parámetro el número del PC (mirad la etiqueta sobre la torre), el script creará una VM en Amazon Web Services para cada uno, y empezará a descargarse todo el contenido de ADOP. Copyright © 2016 Accenture All rights reserved.
  • 8. ¿Qué es DevOps? 8Copyright © 2016 Accenture All rights reserved.
  • 9. 9 ¿Qué es DevOps? DevOps es una estrategia dedicada a promover la colaboración, eliminando las fricciones entre los equipos de Desarrollo y Operaciones Copyright © 2016 Accenture All rights reserved. Desarrollo Operaciones DevOps Dev quiere cambios Ops quiere estabilidad Todos quieren... Software estable y operable Procesos de entregas optimizados y consistentes Cumplimiento de estándares (infraestructura, plataforma) Bajo riesgo y gran cantidad de cambios Código confiable e integridad del software Alta disponibilidad y entornos predecibles
  • 10. 10 Principios de DevOps Copyright © 2016 Accenture All rights reserved. Prácticas de gestión de la configuración sólidas Despliegue continuo de valor de negocio (Lean IT) Automatización de pruebas Prueba continua Flujos de trabajo Entrega continua Arquitectura de grano fino Micro-servicios Colaboración y empatía Sin silos o juegos de la culpa Construcción y despliegue automático Recursos elásticos Cloud Diseño robusto y resiliencia Degradación gradual Experimentación oportunista Mejora continua
  • 11. Accenture DevOps Platform 11Copyright © 2016 Accenture All rights reserved.
  • 12. 12 Accenture DevOps Platform Copyright © 2016 Accenture All rights reserved. Hosting en cloud y accesso a los servicios de aplicación usando una plataforma cloud aprobada por Accenture Release Dev. Source Control Code Review Build Code Quality Deploy Testing A-B Test ADOP es una plataforma de desarrollo basado en la nube, une una colección integrada de herramientas Open Source para el desarrollo, despliegue y control de aplicaciones usando las mejores prácticas de DevOps. ADOP puede provisionarse en menos de 10 minutos, permite a los proyectos una configuración rápida de pipelines y entornos, reduciendo el coste de desarrollo, prueba y entrega de código. Los recursos y herramientas soportan el proceso y las entregas de calidad Beneficios Entrega con ConfianzaTiempo a mercado Riesgo de los Cambios • Nuevas características entregadas en días o semanas no meses • La experimentación continua permite que los servicios se mejoren continuamente • Las métricas permiten mejorar la productividad • Los cambios se introducen en tiempo real y son fáciles de revertir • Las pruebas se ejecutan en entornos representativos configurados automáticamente • Eliminación de los fallos de regresión • Gestión de la liberación de nuevas características • Métricas centradas en el negocio que permiten un control en tiempo real del servicio • Vulnerabilidades de seguridad identificadas en tiempo de construcción
  • 13. 13 Accenture DevOps Platform es un Proyecto OpenSource Copyright © 2016 Accenture All rights reserved. Se trata de un proyecto Open Source, contribuido por Accenture, bajo licencia de Apache. Disponible en GitHub se puede descargar, modificar, contribuir… Pull Requests are welcomed!!
  • 14. 14 Herramientas de ADOP Copyright © 2016 Accenture All rights reserved.
  • 15. 15 Gerrit • Gerrit proporciona una herramienta web de revisión de código y gestión del repositorio para el sistema de control de versiones Git. Copyright © 2016 Accenture All rights reserved.
  • 16. 16 Gerrit • Gerrit proporciona una herramienta web de revisión de código y gestión del repositorio para el sistema de control de versiones Git. • Permite discutir las modificaciones en el código. – Revisa las versiones antiguas y nuevas del código con marcas de colores. Permite discutir secciones específicas con otros desarrolladores para hacer los cambios correctos. Copyright © 2016 Accenture All rights reserved.
  • 17. 17 Gerrit • Gerrit proporciona una herramienta web de revisión de código y gestión del repositorio para el sistema de control de versiones Git. • Permite discutir las modificaciones en el código. – Revisa las versiones antiguas y nuevas del código con marcas de colores. Permite discutir secciones específicas con otros desarrolladores para hacer los cambios correctos. • Gestionar y servir repositorios Git – Gerrit incluye servidores Git compatibles con todos los clientes Git accesibles vía SSH o HTTPS. – Simplifica la gestión alojando varios repositorios Git juntos. Copyright © 2016 Accenture All rights reserved.
  • 18. 18 Jenkins • La integración continua consiste en tener todo el trabajo de desarrollo integrado de forma que en base a una planificación o evento el trabajo se construye y prueba automáticamente. La idea es que los errores de desarrollo se detecten lo antes posible en el proceso. • Los siguientes pasos explican a alto nivel cómo es el ciclo de vida del desarrollo con integración continua: Copyright © 2016 Accenture All rights reserved.
  • 19. 19 Selenium Grid • Selenium automatiza los navegadores. Principalmente se utiliza para automatizar aplicaciones web para realizar pruebas, pero no está limitado a eso. Tareas de administración repetitivas basadas en herramientas web pueden (y deben) automatizarse. • El principal cambio reciente en Selenium ha sido la inclusión del API Web Driver. Esto nos permite manejar nativamente el navegador de forma local o remota usando Selenium Server, es un gran paso adelante en términos de automatización. • WebDriver se diseñó como un interfaz de programación más simple y concisa que permite evitar algunas limitaciones del API Selenium-RC. • Se trata de una API Orientada a Objetos. • Maneja el navegador de forma mucho más efectiva y supera las limitaciones de Selenium 1.x que afectan a al cobertura de nuestros test funcionales, como por ejemplo la descarga o subida de ficheros, pop-ups y diálogos. Copyright © 2016 Accenture All rights reserved.
  • 20. 20 SonarQube • SonarQube nos permite realizar un control continuo de la calidad técnica del código fuente y ejecutar pruebas unitarias automáticas. • Soporta más de 20 lenguajes de programación diferentes, incluyendo Java, C#, C/C++, Objective-C, PL/SQL… Copyright © 2016 Accenture All rights reserved.
  • 21. 21 Docker • Docker nos permite empaquetar nuestra aplicación con todas sus dependencias en unidades estandarizadas. – Los contenedores Docker “envuelven” un trozo de software dentro de un sistema de ficheros completo que contiene todo lo necesario para su ejecución: código, runtime, herramientas y librerías de sistema (cualquier cosa que puedas instalar en un servidor) – Esto garantiza que siempre ejecutas lo mismo, sin importar el entorno en el que lo ejecutas. Copyright © 2016 Accenture All rights reserved.
  • 22. 22 Docker • Docker nos permite empaquetar nuestra aplicación con todas sus dependencias en unidades estandarizadas. • Características: – Ligero • Los contenedores que se ejecutan en la misma máquina comparten el mismo kernel del sistema operativo de forma que arrancan instantáneamente y realizan un uso más eficiente de la RAM. • Las imágenes se construyen como sistema de ficheros por capas de forma que compartan ficheros comunes, así se logra un uso más eficiente de la capacidad del disco y las descargas. – Abierto • Los contenedores se basan en estándares abiertos permitiendo a los contenedores ejecutarse en la mayoría de distribuciones Linux y sistemas operativos de Microsoft. – Seguro • Los contenedores aíslan las aplicaciones unas de otras y de la infraestructura mientras proveen a la aplicación de una nueva capa de protección. Copyright © 2016 Accenture All rights reserved.
  • 23. Workshop (segunda parte) 23Copyright © 2016 Accenture All rights reserved.
  • 24. 24 Guía para el taller • Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta. Copyright © 2016 Accenture All rights reserved.
  • 25. 25 Guía para el taller • Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta. • Ejecutamos las dos instrucciones que nos indica el script. – Así añadimos la información de la máquina al entorno, para que sea utilizada por docker. Copyright © 2016 Accenture All rights reserved.
  • 26. 26 Guía para el taller • Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta. • Ejecutamos las dos instrucciones que nos indica el script. • Comprobamos que la imagen se ha montado correctamente con docker-machine ls. Copyright © 2016 Accenture All rights reserved.
  • 27. 27 Guía para el taller • Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta. • Ejecutamos las dos instrucciones que nos indica el script. • Comprobamos que la imagen se ha montado correctamente con docker-machine ls. • Accedemos a la URL de nuestra máquina tal y como nos indica el script. – Debemos ver la página de inicio de ADOP con todas las herramientas disponibles. Copyright © 2016 Accenture All rights reserved.
  • 28. 28 Guía para el taller • Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta. • Ejecutamos las dos instrucciones que nos indica el script. • Comprobamos que la imagen se ha montado correctamente con docker-machine ls. • Accedemos a la URL de nuestra máquina tal y como nos indica el script. • Desde Jenkins creamos un nuevo job de despliegue en CI. Copyright © 2016 Accenture All rights reserved.
  • 29. 29 Guía para el taller • Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta. • Ejecutamos las dos instrucciones que nos indica el script. • Comprobamos que la imagen se ha montado correctamente con docker-machine ls. • Accedemos a la URL de nuestra máquina tal y como nos indica el script. • Desde Jenkins creamos un nuevo job de despliegue en CI. • Lanzamos el pipeline y comprobamos la información del build y la aplicación. Copyright © 2016 Accenture All rights reserved.
  • 30. 30 Guía para el taller • Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta. • Ejecutamos las dos instrucciones que nos indica el script. • Comprobamos que la imagen se ha montado correctamente con docker-machine ls. • Accedemos a la URL de nuestra máquina tal y como nos indica el script. • Desde Jenkins creamos un nuevo job de despliegue en CI. • Lanzamos el pipeline y comprobamos la información del build y la aplicación. • Clonamos el repositorio en Gerrit. Copyright © 2016 Accenture All rights reserved.
  • 31. 31 Guía para el taller • Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta. • Ejecutamos las dos instrucciones que nos indica el script. • Comprobamos que la imagen se ha montado correctamente con docker-machine ls. • Accedemos a la URL de nuestra máquina tal y como nos indica el script. • Desde Jenkins creamos un nuevo job de despliegue en CI. • Lanzamos el pipeline y comprobamos la información del build y la aplicación. • Clonamos el repositorio en Gerrit. • Realizamos una modificación (por ejemplo añadiendo un mensaje en el jsp de inicio) y lo subimos con commit/push Copyright © 2016 Accenture All rights reserved.
  • 32. 32 Guía para el taller • Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta. • Ejecutamos las dos instrucciones que nos indica el script. • Comprobamos que la imagen se ha montado correctamente con docker-machine ls. • Accedemos a la URL de nuestra máquina tal y como nos indica el script. • Desde Jenkins creamos un nuevo job de despliegue en CI. • Lanzamos el pipeline y comprobamos la información del build y la aplicación. • Clonamos el repositorio en Gerrit. • Realizamos una modificación (por ejemplo añadiendo un mensaje en el jsp de inicio) y lo subimos con commit/push • Lanzamos el pipeline y comprobamos que el cambio se ha subido a CI Copyright © 2016 Accenture All rights reserved.
  • 33. 33 Guía para el taller • Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta. • Ejecutamos las dos instrucciones que nos indica el script. • Comprobamos que la imagen se ha montado correctamente con docker-machine ls. • Accedemos a la URL de nuestra máquina tal y como nos indica el script. • Desde Jenkins creamos un nuevo job de despliegue en CI. • Lanzamos el pipeline y comprobamos la información del build y la aplicación. • Clonamos el repositorio en Gerrit. • Realizamos una modificación (por ejemplo añadiendo un mensaje en el jsp de inicio) y lo subimos con commit/push • Lanzamos el pipeline y comprobamos que el cambio se ha subido a CI • Creamos un nuevo entorno de preproducción, añadimos un job de despliegue en preproducción y ejecutamos el job. Copyright © 2016 Accenture All rights reserved.
  • 34. 34 Guía para el taller • Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta. • Ejecutamos las dos instrucciones que nos indica el script. • Comprobamos que la imagen se ha montado correctamente con docker-machine ls. • Accedemos a la URL de nuestra máquina tal y como nos indica el script. • Desde Jenkins creamos un nuevo job de despliegue en CI. • Lanzamos el pipeline y comprobamos la información del build y la aplicación. • Clonamos el repositorio en Gerrit. • Realizamos una modificación (por ejemplo añadiendo un mensaje en el jsp de inicio) y lo subimos con commit/push • Lanzamos el pipeline y comprobamos que el cambio se ha subido a CI • Creamos un nuevo entorno de preproducción, añadimos un job de despliegue en preproducción y ejecutamos el job. • Comprobamos que en preproducción se han subido los cambios. Copyright © 2016 Accenture All rights reserved.
  • 35. 35 Guía para el taller • Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta. • Ejecutamos las dos instrucciones que nos indica el script. • Comprobamos que la imagen se ha montado correctamente con docker-machine ls. • Accedemos a la URL de nuestra máquina tal y como nos indica el script. • Desde Jenkins creamos un nuevo job de despliegue en CI. • Lanzamos el pipeline y comprobamos la información del build y la aplicación. • Clonamos el repositorio en Gerrit. • Realizamos una modificación (por ejemplo añadiendo un mensaje en el jsp de inicio) y lo subimos con commit/push • Lanzamos el pipeline y comprobamos que el cambio se ha subido a CI • Creamos un nuevo entorno de preproducción, añadimos un job de despliegue en preproducción y ejecutamos el job. • Comprobamos que en preproducción se han subido los cambios. • Creamos un nuevo entorno de producción, añadimos un job de despliegue en producción y ejecutamos el job. Copyright © 2016 Accenture All rights reserved.
  • 36. 36 Guía para el taller • Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta. • Ejecutamos las dos instrucciones que nos indica el script. • Comprobamos que la imagen se ha montado correctamente con docker-machine ls. • Accedemos a la URL de nuestra máquina tal y como nos indica el script. • Desde Jenkins creamos un nuevo job de despliegue en CI. • Lanzamos el pipeline y comprobamos la información del build y la aplicación. • Clonamos el repositorio en Gerrit. • Realizamos una modificación (por ejemplo añadiendo un mensaje en el jsp de inicio) y lo subimos con commit/push • Lanzamos el pipeline y comprobamos que el cambio se ha subido a CI • Creamos un nuevo entorno de preproducción, añadimos un job de despliegue en preproducción y ejecutamos el job. • Comprobamos que en preproducción se han subido los cambios. • Creamos un nuevo entorno de producción, añadimos un job de despliegue en producción y ejecutamos el job. • Comprobamos que en producción se han subido los cambios. Copyright © 2016 Accenture All rights reserved.
  • 37. 37 Guía para el taller • Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta. • Ejecutamos las dos instrucciones que nos indica el script. • Comprobamos que la imagen se ha montado correctamente con docker-machine ls. • Accedemos a la URL de nuestra máquina tal y como nos indica el script. • Desde Jenkins creamos un nuevo job de despliegue en CI. • Lanzamos el pipeline y comprobamos la información del build y la aplicación. • Clonamos el repositorio en Gerrit. • Realizamos una modificación (por ejemplo añadiendo un mensaje en el jsp de inicio) y lo subimos con commit/push • Lanzamos el pipeline y comprobamos que el cambio se ha subido a CI • Creamos un nuevo entorno de preproducción, añadimos un job de despliegue en preproducción y ejecutamos el job. • Comprobamos que en preproducción se han subido los cambios. • Creamos un nuevo entorno de producción, añadimos un job de despliegue en producción y ejecutamos el job. • Comprobamos que en producción se han subido los cambios. • Realizamos un cambio “con error” en el código y lo subimos al repositorio con commit/push Copyright © 2016 Accenture All rights reserved.
  • 38. 38 Guía para el taller • Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta. • Ejecutamos las dos instrucciones que nos indica el script. • Comprobamos que la imagen se ha montado correctamente con docker-machine ls. • Accedemos a la URL de nuestra máquina tal y como nos indica el script. • Desde Jenkins creamos un nuevo job de despliegue en CI. • Lanzamos el pipeline y comprobamos la información del build y la aplicación. • Clonamos el repositorio en Gerrit. • Realizamos una modificación (por ejemplo añadiendo un mensaje en el jsp de inicio) y lo subimos con commit/push • Lanzamos el pipeline y comprobamos que el cambio se ha subido a CI • Creamos un nuevo entorno de preproducción, añadimos un job de despliegue en preproducción y ejecutamos el job. • Comprobamos que en preproducción se han subido los cambios. • Creamos un nuevo entorno de producción, añadimos un job de despliegue en producción y ejecutamos el job. • Comprobamos que en producción se han subido los cambios. • Realizamos un cambio “con error” en el código y lo subimos al repositorio con commit/push • Ejecutamos el pipeline y subimos hasta producción, vemos el error. Copyright © 2016 Accenture All rights reserved.
  • 39. 39 Guía para el taller • Al finalizar la ejecución del script ha mostrar un mensaje indicando que ha sido correcta. • Ejecutamos las dos instrucciones que nos indica el script. • Comprobamos que la imagen se ha montado correctamente con docker-machine ls. • Accedemos a la URL de nuestra máquina tal y como nos indica el script. • Desde Jenkins creamos un nuevo job de despliegue en CI. • Lanzamos el pipeline y comprobamos la información del build y la aplicación. • Clonamos el repositorio en Gerrit. • Realizamos una modificación (por ejemplo añadiendo un mensaje en el jsp de inicio) y lo subimos con commit/push • Lanzamos el pipeline y comprobamos que el cambio se ha subido a CI • Creamos un nuevo entorno de preproducción, añadimos un job de despliegue en preproducción y ejecutamos el job. • Comprobamos que en preproducción se han subido los cambios. • Creamos un nuevo entorno de producción, añadimos un job de despliegue en producción y ejecutamos el job. • Comprobamos que en producción se han subido los cambios. • Realizamos un cambio “con error” en el código y lo subimos al repositorio con commit/push • Ejecutamos el pipeline y subimos hasta producción, vemos el error. • Realizamos un rollback del cambio y desplegamos en producción la versión anterior. Copyright © 2016 Accenture All rights reserved.
  • 40. Preguntas 40Copyright © 2016 Accenture All rights reserved.
  • 41. ¡Muchas gracias por asistir! 41Copyright © 2016 Accenture All rights reserved. https://www.coritel.es https://github.com/Accenture https://twitter.com/_deors https://twitter.com/viarellano https://twitter.com/restalion