Post on 24-Jun-2020
Maven e IC
Maven, SonarQube, Artifactory y Jenkins
Presentación
Retos del Desarrollo SW
➢ Proyectos SW grandes y complejos➢ Cada vez más interoperabilidad➢ Muchos equipos de trabajo
(remotos)➢ Planificaciones cortas➢ Cambios en necesidades y requisitos
Desarrollo Tradicional
➢ Construcción / lanzamiento “por petición”
➢ Estado de proyecto -> Compila➢ Bien documentado -> No es una
opción➢ Revisado -> Alguien ha testeado
Resultado: Falla en numerosas ocasiones
Desarrollo Ágil
¿Qué necesitamos?
➢ Construcción, pruebas y despliegue estandarizado
➢ Construcción, pruebas y despliegues continuos
➢ Asegurar pasos sólidos, reproducibles y analizables
Integración Continua
➢ Definición -> Práctica de integración temprana y frecuente para evitar los problemas de la integración
➢ Objetivo -> Reducir el tiempo de reconstrucción y por tanto reducir costes y tiempo
Integración Continua
➢ Trabajo humano➢ Trabajar en el código➢ Subir al SCM código y test
➢ Trabajo máquina➢ Consulta SCM en busca de cambios➢ Construye a partir del código➢ Ejecuta los test➢ Despliega librerías en el repositorio
Integración Continua
Integración Continua
BUILD
CÓDIGO
CÓDIGO
SCM SERVICIO IC
Integración Continua
¿Qué es Maven? - Definición
✓ "Software project management and comprehension tool"
✓ "An attempt to apply patterns to a project's build infrastructure in order to promote comprehension and productivity."
- maven.apache.org
¿Qué es Maven?
➢ Herramienta de construcción➢ Enfocada a la simplicidad
➢ Creación (arquetipos) y gestión (valores por defecto)
➢ Cubre fases de construcción➢ Build Management➢ Testing➢ Release Versioning➢ Deployment
¿Qué es Maven? - Proyecto
➢ Proyecto Open Source de Apache➢ Desarrollo iniciado en 2001➢ Surgió a partir de ficheros Ant de otros
proyectos Apache➢ Ha pasado por muchas iteraciones➢ La versión actual es Maven 3
http://maven.apache.org
Principios de Maven
➢ Orientado a proyecto➢ Convención sobre configuración➢ Gestión de dependencias
➢ Internas y externas➢ Reutilización a través de repositorios
➢ Internos y externos➢ Extensible a través de plugins
Orientado a Proyecto
➢ Maven modela las construcciones
como un Project Object Model (POM)
➢ Definido en XML en pom.xml
➢ Soporta herencia simple de tipo árbol
➢ Todo POM extiende del Super POM
Convención sobre Configuración
<project> <groupId>com.projectsexception</groupId> <artifactId>redmine-api</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version></project>
Gestión de Dependencias
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${hibernate.version}</version> </dependency></dependencies>
➢ Escribir una vez➢ Mejorar las
dependencias anidadas➢ Dependencias
consistentes➢ Evitar la búsqueda de
JARs➢ Evitar la búsqueda de
versiones➢ Evitar la autogestión de
librerías➢ Gestión por ámbitos
Repositorios
➢ Almacenan artefactos y dependencias➢ Repositorio Local
➢ Caché local de artefactos➢ Puede eliminarse completamente➢ Útil para construcciones offline➢ Reside en el directorio .m2 del usuario
➢ Repositorio Remoto
Repositorio Remoto
➢ Central Repository almacena todos los artefactos
➢ El local descarga del central (maven.org)
Repositorio Local
Repositorio Remoto
Orden de búsqueda
Repositorio Interno
➢ Repositorio corporativo➢ Suele hacer también de proxy
Repositorio Local
Repositorio Remoto
Orden de búsquedaRepositorio Interno
Repositorios
<repositories> <repository> <id>LocalRepo</id> <name>LocalRepo</name> <url>file://${project.basedir}/lib</url> </repository> <repository> <id>IntraRepo</id> <name>IntraRepo</name> <url>http://intranet/repo</url> </repository> <repository> <id>java-net</id> <url>https://oss.sonatype.org/content/repositories/java-net/</url> </repository></repositories>
Plugins
➢ Ant: Ejecutar tareas AND➢ Hibernate3: Generar POJO's, DAO y
XML Mappings basado en esquemas remotos
➢ Javadoc: Generate javadoc del código
http://maven.apache.org/plugins/http://mojo.codehaus.org/plugins.html
Propiedades
➢ $MAVEN_HOME/conf/settings.xml➢ $USER_HOME/.m2/settings.xml➢ $PROJECT_HOME/pom.xml
<project> <groupId>com.projectsexception</groupId> <artifactId>redmine-api</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <properties> <greeting>hello</greeting> </properties></project>
${basedir}${project.groupId}${greeting}
Perfiles
➢ Variables específicas del despliegue➢ Cambia URLs en base al entorno de
despliegue➢ Cambia código a través de filtrado
según el perfil➢ Simplifica y unifica métodos de
despliegue
Perfiles - Definición
<profile> <id>dev</id> <properties> <name>DEVELOPMENT</name> <filter>dev-filter</filter> <include>dev-includes</include> </properties></profile><profile> <id>pro</id> <properties> <name>PRODUCTION</name> <filter>pro-filter</filter> <include>pro-includes</include> </properties></profile>
Perfiles - Filtrar recursos
<filters> <filter>src/main/filters/${filter}.properties</filter></filters><resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <include>config.properties</include> <includes> </resource> <resource> <directory>src/main/resources</directory> <filtering>false</filtering> <excludes><exclude>config.properties</exclude></excludes> </resource></resources>
Perfiles - Filtrar recursos web
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.4</version> <configuration> <webResources> <resource> <directory>${basedir}/src/main/webapp/META-INF</directory> <filtering>true</filtering> <targetPath>META-INF</targetPath> <includes> <include>context.xml</include> </includes> </resource> </webResources> </configuration></plugin>
Perfiles - Filtrar recursos web
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.4</version> <configuration> <webResources> <resource> <directory>${basedir}/src/main/includes/${include}</directory> <filtering>true</filtering> <targetPath>WEB-INF</targetPath> </resource> </webResources> </configuration></plugin>
Artifactory
➢ Es un repositorio Maven➢ Lo usaremos si:
➢ Necesitamos almacenar nuestras propias librerías
➢ Poner nuestras librerías disponibles en la red
➢ Podemos controlar el acceso➢ Actúa como proxy de forma
automática
SonarQube
➢ SonarQube is the central place to manage code quality, offering visual reporting on and across projects and enabling to replay the past to follow metrics evolution
- sonarqube.org
SonarQube
➢ Servidor web➢ Proyectos envían los datos➢ SonarQube almacena dichos datos
➢ Panel de control que permite ver los datos y la evolución a través de las versiones
➢ Extensible a través de plugins
SonarQube
➢ CheckStyle - checkstyle.sourceforge.net➢ Findbugs - findbugs.sourceforge.net➢ PMD - pmd.sourceforge.net➢ Más a través de Plugins:
➢ Android➢ JavaScript➢ PHP
➢ MADEJA:www.juntadeandalucia.es/servicios/madeja/contenido/recurso/828
Jenkins
➢ Jenkins provides an easy-to-use so-called continuous integration system, making it easier for developers to integrate changes to the project, and making it easier for users to obtain a fresh build.
-jenkins-ci.org
Alternativas CI
➢ Hudson (mantenido by Oracle)➢ Travis CI (Solution alojada por
Github)➢ Bamboo (Atlassian)➢ TeamCity (JetBrains)➢ Jenkins (fork de Hudson)
➢ Popular➢ Versátil (más de 600 plugins)➢ Desarrollo y comunidad activa (LTS)
Jenkins
➢ Testing➢ Unitarios, funcionales, de integración, de
rendimiento, análisis estático➢ Construcción
➢ Empaquetado, lanzamiento y publicación➢ Despliegue➢ Y más tareas repetitivas...
Jenkins
➢ SCM➢ CVS, Subversion, Git, Mercurial,
Clearcase...➢ Ejecuta
➢ Apache Ant, Apache Maven, shell scripts y comandos batch de Windows
➢ Inicio➢ Commit, cron, otras construcciones,
petición URL o manualmente
Crear un “job” en Jenkins
Crear un “job” en Jenkins
Crear un “job” en Jenkins
Crear un “job” en Jenkins
¿Cómo monto yo todo esto?
Instalaciones
➢ Maven➢ Descomprime y añade al PATH
➢ SonarQube➢ Descargar y ejecutar
➢ Jenkins➢ WAR o paquete para Windows,
Ubuntu/Debian, Red Hat/Fedora/CentOS, Mac OS X, openSUSE, FreeBSD, OpenBSD, Solaris/OpenIndiana y Gentoo