Índice de contenidos
- 1. Entorno
- 2. Creación del proyecto de ejemplo
- 3. Integración con Travis
- 4. Integración con Codacy
- 5. Integración con otros lenguajes
- 6. Conclusiones
- 7. Referencias
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é cdelhoyom/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é cdelhoyom / 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
- Java – cdelhoyom/travis-codacy
- JavaScript – cdelhoyom/travis-codacy-ng
- Scala – cdelhoyom/travis-codacy-scala
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.