Integración de un proyecto de GitHub con Travis y Codacy

0
3376

Índice de contenidos


1. Entorno

El tutorial está escrito usando el siguiente entorno:

  • Hardware: Portátil MacBook Pro 15′ (2.5 GHz Intel Core i7, 16GB DDR3)
  • Sistema Operativo: Mac OS High Sierra 10.13.3
  • Apache Maven 3.5.0


2. Creación del proyecto de ejemplo

En primer lugar entraremos en nuestro perfil de GitHub y crearemos un proyecto, en este tutorial yo usaré el proyecto creado en mi perfil travis-codacy. Una vez creado nuestro proyecto en GitHub, añadiremos las fuentes de un proyecto de prueba (con test unitarios y de integración), usaremos un arquetipo de Spring Boot descargado de GitHub.

En mi caso únicamente he cambiado el nombre del paquete para que sea «com.autentia.traviscode» y he cambiado el «groupId» y «artefactId» del proyecto en el fichero «pom.xml».

Cuando tengamos copiado este proyecto, realizaremos una compilación de maven desde la consola para ver si funciona («mvn clean install»). Si todo está correcto haremos un commit y push al repositorio de GitHub que hemos creado, de esta manera, cuando la integración con Travis y Codacy esté acabada podremos ver el análisis y la cobertura de código que nos ofrecerá Codacy sobre este arquetipo de Spring Boot. En mi proyecto será el commit «Example project from https://github.com/spring-guides/gs-spring-boot.git».


3. Integración con Travis

Accedemos a la página web de Travis y nos registramos con nuestra cuenta de GitHub. En nuestro perfil tendremos la opción de activar los proyectos que tenemos subidos en GitHub, en mi caso activaré cdelhoyo/travis-codacy.

Una vez activado el proyecto, con nuestro siguiente push se lanzará la compilación de Travis y nos enviará un email con el resultado de la compilación, pero para ello necesitamos añadir el fichero .travis.yml a la raíz de nuestro proyecto.

.travis.yml
language: java
sudo: false

cache:
	directories:
	- "$HOME/.m2"

before_cache:
- rm -rf $HOME/.m2/repository/com/autentia/traviscodacy

jdk:
	- oraclejdk8

En nuestro caso usaremos el lenguaje Java con la jdk8, además guardaremos en cache las dependencias de Maven excepto las de nuestro proyecto. Una vez añadido el fichero, podemos hacer el commit y push para ver como compila travis. En mi repositorio será el commit «.travis.yml added».

Si accedemos inmediatamente a nuestro panel de Travis, veremos como la compilación está en marcha.

Y una vez termine, deberíamos ver cómo se ha completado con éxito y nos ha mandado un email para informar de ello.

En este punto ya tenemos integrado nuestro proyecto de GitHub con Travis y podemos pasar a la integración con Codacy.


4. Integración con Codacy

Para comenzar la integración con Codacy, en primer lugar entraremos en su página web y nos registraremos nuevamente con nuestra cuenta de GitHub. Al entrar nos dará la opción de añadir un proyecto de nuestra cuenta, yo elegiré cdelhoyo / travis-codacy.

Ahora que tiene vinculada nuestra cuenta de GitHub, Codacy puede hacer un análisis de nuestro código y nos mostrará un panel de control con las principales métricas:

Pero este análisis no tiene la cobertura de código, un indicador bastante útil en el análisis de código. Al ser un proyecto Java, para obtener la cobertura de código, usaremos un informe de jacoco que tendremos que configurar en nuestro proyecto.

Para configurar jacoco usaremos una configuración típica para test unitarios y test de integración añadiendo el plugin de jacoco a nuestro pom.xml.

pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
		<modelVersion>4.0.0</modelVersion>

		<groupId>com.autentia</groupId>
		<artifactId>traviscodacy</artifactId>
		<version>0.1.0</version>

		<parent>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-starter-parent</artifactId>
				<version>2.0.0.RELEASE</version>
		</parent>

		<dependencies>
				<dependency>
						<groupId>org.springframework.boot</groupId>
						<artifactId>spring-boot-starter-web</artifactId>
				</dependency>
				<dependency>
						<groupId>org.springframework.boot</groupId>
						<artifactId>spring-boot-starter-test</artifactId>
						<scope>test</scope>
				</dependency>
		</dependencies>

		<properties>
				<java.version>1.8</java.version>
		
				<jacoco.version>0.7.6.201602180812</jacoco.version>
				<jacoco.outputDir>${project.build.directory}</jacoco.outputDir>

				<jacoco.utreportpath>${project.build.directory}/jacoco</jacoco.utreportpath>
				<jacoco.utreportfile>${jacoco.utreportpath}/jacoco.exec</jacoco.utreportfile>

				<jacoco.itreportpath>${project.build.directory}/jacoco</jacoco.itreportpath>
				<jacoco.itreportfile>${jacoco.itreportpath}/jacoco-it.exec</jacoco.itreportfile>
		</properties>


		<build>
				<plugins>
						<plugin>
								<groupId>org.springframework.boot</groupId>
								<artifactId>spring-boot-maven-plugin</artifactId>
						</plugin>

						<plugin>
								<groupId>org.jacoco</groupId>
								<artifactId>jacoco-maven-plugin</artifactId>
								<version>${jacoco.version}</version>
								<executions>
										<execution>
												<id>pre-unit-test</id>
												<phase>process-test-classes</phase>
												<goals>
														<goal>prepare-agent</goal>
												</goals>
												<configuration>
														<propertyName>surefireArgLine</propertyName>
														<destFile>${jacoco.utreportfile}</destFile>
														<append>true</append>
												</configuration>
										</execution>
										<execution>
												<id>post-unit-test</id>
												<phase>test</phase>
												<goals>
														<goal>report</goal>
												</goals>
												<configuration>
														<outputDirectory>${jacoco.utreportpath}</outputDirectory>
														<dataFile>${jacoco.utreportfile}</dataFile>
												</configuration>
										</execution>
										<execution>
												<id>pre-integration-test</id>
												<phase>pre-integration-test</phase>
												<goals>
														<goal>prepare-agent-integration</goal>
												</goals>
												<configuration>
														<propertyName>failsafeArgLine</propertyName>
														<destFile>${jacoco.itreportfile}</destFile>
														<append>true</append>
												</configuration>
										</execution>
										<execution>
												<id>post-integration-test</id>
												<phase>post-integration-test</phase>
												<goals>
														<goal>report</goal>
												</goals>
												<configuration>
														<outputDirectory>${jacoco.itreportpath}</outputDirectory>
														<dataFile>${jacoco.itreportfile}</dataFile>
												</configuration>
										</execution>
								</executions>
						</plugin>

						<plugin>
								<groupId>org.apache.maven.plugins</groupId>
								<artifactId>maven-surefire-plugin</artifactId>
								<configuration>
										<argLine>${surefireArgLine}</argLine>
										<excludes>
												<exclude>**/*IT.java</exclude>
										</excludes>
								</configuration>
						</plugin>

						<plugin>
								<groupId>org.apache.maven.plugins</groupId>
								<artifactId>maven-failsafe-plugin</artifactId>
				<executions>
					<execution>
						<id>integration-tests</id>
						<goals>
							<goal>integration-test</goal>
							<goal>verify</goal>
						</goals>
						<configuration>
							<argLine>${failsafeArgLine}</argLine>
													<reportsDirectory>${project.build.directory}/failsafe-reports</reportsDirectory>
													<skipTests>false</skipTests>
						</configuration>
					</execution>
				</executions>
						</plugin>
				</plugins>
		</build>
	
</project>
		

Si comprobamos las diferencias, veremos que solo hemos añadido el plugin de jacoco con sus propiedades. Para comprobar que está todo configurado correctamente, volveremos a compilar nuestro proyecto con Maven y comprobaremos que se genera el informe de jacoco «jacoco.xml» en el directorio «target/jacoco».

Por desgracia esto no es suficiente para tener la cobertura de código en Codacy, pero para conseguirla solo tendremos que cambiar la configuración de travis para que al compilar mande el informe de jacoco a Codacy.

.travis.yml
		language: java
		sudo: false
		
		cache:
			directories:
				- "$HOME/.m2"
		
		before_cache:
			- rm -rf $HOME/.m2/repository/com/autentia/traviscodacy
		
		before_install:
			- sudo apt-get install jq
			- wget -O ~/codacy-coverage-reporter-assembly-latest.jar $(curl https://api.github.com/repos/codacy/codacy-coverage-reporter/releases/latest | jq -r .assets[0].browser_download_url)
		
		after_success:
			- java -jar ~/codacy-coverage-reporter-assembly-latest.jar report -l Java -r target/jacoco/jacoco.xml
		
		jdk:
			- oraclejdk8

Para que Travis envie el informe a Codacy simplemente tendremos que añadir el «before_install» y el «after_success» definidos en la configuración del «.travis.yml» para usar el jar que nos proporciona Codacy «codacy-coverage-reporter-assembly-latest.jar».

Además, tendremos que añadir la variable de entorno «CODACY_PROJECT_TOKEN» en Travis. Para ello, tenemos que ir al apartado «Settings» (accesible en «More options») de nuestro proyecto en el panel de Travis y añadir en «Environment Variables» la variable «CODACY_PROJECT_TOKEN» con el valor de nuestro token

Para conseguir el valor del token de Codacy iremos a la pestaña «Settings» del menú lateral de nuestro proyecto de Codacy, pulsaremos sobre la pestaña superior «Integrations» y obtendremos el token de «Project API».

Por último, haremos un commit y push de los ficheros «pom.xml» y «.travis.yaml». En mi caso será el commit «Jacoco configuration».

Si accedemos al panel de control de Travis para nuestro proyecto, podemos ver que la compilación ha terminado con éxito.

Y si accedemos al panel de control de Codacy ya podemos analizar nuestra cobertura de código.


5. Integración con otros lenguajes

Hemos hecho un ejemplo con un proyecto Java usando jacoco, pero Codacy soporta varios lenguajes más como Scala, Ruby, Javascript, Python o PHP. Codacy recomienda las siguientes herramientas para conseguir la cobertura de código:

  • Java – JaCoCo
  • JavaScript – Istanbul
  • PHP – PHPUnit
  • Python – Coverage.py
  • Scala – Scoverage
  • Ruby – SimpleCov

Ejemplos de proyectos integrados con Travis y Codacy


6. Conclusiones

En este tutorial hemos visto como integrar de manera rápida y sencilla un proyecto de GitHub con un entorno de integración continua y análisis de código, además, si el proyecto es de código abierto, este entorno será gratuito y no tendrá coste alguno, también hemos visto que Codacy soporta multitud de lenguajes como Java, Scala, Ruby, Javascript, Python o PHP.


7. Referencias

Consultor Tecnológico de desarrollo de proyectos informáticos.
Ingeniero Técnico Superior en Telecomunicaciones por la Universidad Politécnica de Madrid Puedes encontrarme en Autentia: Ofrecemos servicios de soporte a desarrollo, factoría y formación. Somos expertos en Java/Java EE

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad