Ejecutando inspecciones de IntelliJ IDEA en Jenkins

IntelliJ IDEA cuenta hoy con el analizador estático de código Java más avanzado, dejando atrás a "veteranos" como Checkstyle y Spotbugs. Sus numerosas "inspecciones" revisan el código en varios aspectos, desde el estilo de codificación hasta errores característicos.

Sin embargo, hasta ahora los resultados del análisis se muestran solo en la interfaz local de la IDE del desarrollador, lo que los hace poco útiles para el proceso de desarrollo. El análisis estático debe realizarse como el primer paso en la cadena de compilación, sus resultados deben determinar los quality gates, y la compilación debe fallar si no se superan los quality gates. Se sabe que TeamCity CI está integrado con IDEA. Pero incluso si no usas TeamCity, puedes probar a ejecutar las inspecciones de IDEA en cualquier otro servidor CI. Te propongo ver cómo se puede hacer esto utilizando IDEA Community Edition, Jenkins y el plugin Warnings NG.

Paso 1. Ejecuta el análisis en un contenedor y obtén un informe

Al principio, la idea de ejecutar la IDE (¡una aplicación de escritorio!) dentro de un sistema CI que no tiene interfaz gráfica puede parecer dudosa y muy laboriosa. Afortunadamente, los desarrolladores de IDEA han proporcionado la posibilidad de ejecutar formato de código y inspecciones desde la línea de comandos. Y para ejecutar IDEA en este modo, no se requiere un subsistema gráfico y estas tareas se pueden realizar en servidores con interfaz de texto.

La ejecución de las inspecciones se lleva a cabo mediante el script bin/inspect.sh desde el directorio de instalación de IDEA. Se requieren los siguientes parámetros:

  • la ruta completa al proyecto (no se admiten rutas relativas),
  • la ruta al archivo .xml con la configuración de inspecciones (normalmente se encuentra dentro del proyecto en .idea/inspectionProfiles/Project_Default.xml),
  • la ruta completa a la carpeta donde se guardarán los archivos .xml con los informes de los resultados del análisis.

Además, se espera que

  • en la IDE se configure la ruta al Java SDK, de lo contrario el análisis no funcionará. Estas configuraciones se encuentran en el archivo de configuración jdk.table.xml en la carpeta de configuración global de IDEA. La configuración global de IDEA por defecto se encuentra en el directorio de inicio del usuario, pero esta ubicación puede ser especificada explícitamente en el archivo idea.properties.
  • el proyecto analizado debe ser un proyecto válido de IDEA, para lo cual en el control de versiones será necesario añadir algunos archivos que normalmente se ignoran, a saber:
    • .idea/inspectionProfiles/Project_Default.xml — configuraciones del analizador, que claramente se utilizarán al ejecutar inspecciones en el contenedor,
    • .idea/modules.xml — de lo contrario obtendremos el error ‘Este proyecto no contiene módulos’,
    • .idea/misc.xml — de lo contrario obtendremos el error ‘El JDK no está configurado correctamente para este proyecto’,
    • *.iml-files — de lo contrario obtendremos un error sobre el JDK no configurado en el módulo.

Aunque normalmente estos archivos incluyen .gitignore, no contienen información específica del entorno de ningún desarrollador en particular — a diferencia de, por ejemplo, el archivo workspace.xml, donde tal información está contenida, y por lo tanto no se debe hacer commit de él.

Surge naturalmente la necesidad de empaquetar JDK junto con IDEA Community Edition en el contenedor en una forma lista para ser ‘dirigida’ hacia los proyectos a analizar. Elegiremos un contenedor base adecuado, y así es como nos quedará el Dockerfile:

Dockerfile

FROM openkbs/ubuntu-bionic-jdk-mvn-py3

ARG INTELLIJ_VERSION="ideaIC-2019.1.1"

ARG INTELLIJ_IDE_TAR=${INTELLIJ_VERSION}.tar.gz

ENV IDEA_PROJECT_DIR="/var/project"

WORKDIR /opt

COPY jdk.table.xml /etc/idea/config/options/

RUN wget https://download-cf.jetbrains.com/idea/${INTELLIJ_IDE_TAR} && 
    tar xzf ${INTELLIJ_IDE_TAR} && 
    tar tzf ${INTELLIJ_IDE_TAR} | head -1 | sed -e 's//.*//' | xargs -I{} ln -s {} idea && 
    rm ${INTELLIJ_IDE_TAR} && 
    echo idea.config.path=/etc/idea/config >> idea/bin/idea.properties && 
    chmod -R 777 /etc/idea

CMD idea/bin/inspect.sh ${IDEA_PROJECT_DIR} ${IDEA_PROJECT_DIR}/.idea/inspectionProfiles/Project_Default.xml ${IDEA_PROJECT_DIR}/target/idea_inspections -v2

Con la opción idea.config.path hicimos que IDEA busque su configuración global en la carpeta /etc/idea, ya que la carpeta personal del usuario en un entorno CI es algo incierto y a menudo ni siquiera existe.

Así se ve el archivo copiado en el contenedor jdk.table.xml, en el que se especifican las rutas a OpenJDK, instalada dentro del contenedor (se puede tomar como base un archivo similar de su propio directorio de configuraciones de IDEA):

jdk.table.xml

Imagen en formato listo disponible en Docker Hub.

Antes de continuar, verifiquemos que el analizador IDEA se esté ejecutando en el contenedor:

docker run --rm -v :/var/project inponomarev/intellij-idea-analyzer

El análisis debe completarse con éxito, y en la subcarpeta target/idea_inspections deben aparecer numerosos archivos .xml con los informes del analizador.

Ya no hay dudas de que el analizador IDEA se puede ejecutar de manera autónoma en cualquier entorno de CI, y pasamos al segundo paso.

Paso 2. Mostramos y analizamos el informe

Obtener un informe en formato .xml es solo la mitad del trabajo; ahora debe hacerse legible para los humanos. Además, sus resultados deben ser utilizados en los quality gates, que son criterios para determinar si un cambio propuesto cumple con los estándares de calidad.

Esto nos ayudará Complemento Jenkins Warnings NG, cuya versión fue lanzada en enero de 2019. Con su llegada, muchos complementos individuales para trabajar con los resultados de análisis estático en Jenkins (CheckStyle, FindBugs, PMD, etc.) ahora están marcados como obsoletos.

El complemento consta de dos partes:

  • múltiples recopiladores de mensajes de analizadores (lista completa que incluyen todos los analizadores conocidos desde AcuCobol hasta ZPT Lint),
  • y un visualizador de informes único para todos ellos.

En la lista de lo que Warnings NG puede analizar se incluyen advertencias del compilador Java y advertencias de los logs de ejecución de Maven: aunque están siempre a la vista, rara vez se analizan intencionadamente. Los informes de IntelliJ IDEA también están incluidos en la lista de formatos reconocidos.

Dado que el complemento es nuevo, interactúa bien con Jenkins Pipeline desde el inicio. Un paso de construcción que lo involucra se verá de la siguiente manera (solo le indicamos al complemento qué formato de informe reconocemos y qué archivos deben ser escaneados):

stage ('Análisis estático'){
    sh 'rm -rf target/idea_inspections'
    docker.image('inponomarev/intellij-idea-analyzer').inside {
       sh '/opt/idea/bin/inspect.sh $WORKSPACE $WORKSPACE/.idea/inspectionProfiles/Project_Default.xml $WORKSPACE/target/idea_inspections -v2'
    }
    recordIssues(
       tools: [ideaInspection(pattern: 'target/idea_inspections/*.xml')]
    )
}

La interfaz del informe se ve así:

Ejecutando inspecciones de IntelliJ IDEA en Jenkins

Es conveniente que esta interfaz sea universal para todos los analizadores reconocidos. Contiene un gráfico interactivo que muestra la distribución de los hallazgos por categorías y un gráfico de la tendencia en la cantidad de hallazgos. En la cuadrícula en la parte inferior de la página, se puede realizar una búsqueda rápida. Lo único que no funcionó correctamente para las inspecciones de IDEA es la capacidad de navegar por el código directamente en Jenkins (aunque para otros informes, como Checkstyle, este complemento puede hacerlo de manera efectiva). Parece ser un error del analizador de informes de IDEA que debe corregirse.

Entre las capacidades de Warnings NG se encuentra la posibilidad de agregar en un solo informe los hallazgos de diferentes fuentes y programar Quality Gates, incluyendo un 'repetidor' en la compilación de referencia. Parte de la documentación sobre la programación de Quality Gates está disponible. aquí Aunque no está completa, se debe consultar el código fuente. Por otro lado, para tener control total sobre lo que sucede, se puede implementar el 'ratchet' de forma independiente (ver mi publicación anterior sobre este tema).

Conclusión

Antes de comenzar a preparar este material, decidí buscar si alguien ya había escrito sobre este tema en Habr. Solo encontré una entrevista de 2017 con lany, donde dice:

Hasta donde sé, no hay integración con Jenkins o un complemento de maven […] En principio, cualquier entusiasta podría hacer que la edición Community de IDEA y Jenkins funcionen juntos, y muchos se beneficiarían de ello.

Así que, después de dos años, tenemos el Warnings NG Plugin, ¡y finalmente se ha concretado esta amistad!

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster