Lancement des inspections IntelliJ IDEA sur Jenkins.

IntelliJ IDEA possède aujourd'hui l'analyseur statique de code Java le plus avancé, laissant loin derrière des « vétérans » tels que Checkstyle et Spotbugs. Ses nombreuses « inspections » vérifient le code sous divers aspects, du style de codage aux bugs typiques.

Cependant, pour l'instant, les résultats de l'analyse ne s'affichent que dans l'interface locale de l'IDE du développeur, ce qui les rend peu utiles pour le processus de développement. L'analyse statique doit être effectuée comme première étape du pipeline de construction, ses résultats doivent déterminer les quality gates, et la construction doit échouer si les quality gates ne sont pas passés. Il est connu que TeamCity CI est intégré avec IDEA. Mais même si vous n'utilisez pas TeamCity, vous pouvez tout à fait essayer d'exécuter les inspections IDEA sur n'importe quel autre serveur CI. Je vous propose de voir comment cela peut être fait en utilisant IDEA Community Edition, Jenkins et le plugin Warnings NG.

Étape 1. Lancer l'analyse dans un conteneur et obtenir un rapport

Au début, l'idée de lancer l'IDE (une application de bureau !) à l'intérieur d'un système CI sans interface graphique peut sembler douteuse et très fastidieuse. Heureusement, les développeurs d'IDEA ont permis de lancer le formatage de code et les inspections à partir de la ligne de commande. De plus, pour exécuter IDEA en mode dégradé, il n'est pas nécessaire d'avoir un sous-système graphique et ces tâches peuvent être effectuées sur des serveurs avec une interface en texte.

Lancer les inspections se fait à l'aide d'un script bin/inspect.sh dans le répertoire d'installation d'IDEA. Les paramètres requis sont :

  • le chemin complet vers le projet (les chemins relatifs ne sont pas supportés),
  • le chemin vers le fichier .xml avec les paramètres d'inspection (se trouve généralement dans le projet à .idea/inspectionProfiles/Project_Default.xml),
  • le chemin complet vers le dossier où les fichiers .xml des rapports d'analyse seront stockés.

De plus, il est attendu que

  • l'IDE soit configuré avec le chemin vers Java SDK, sinon l'analyse ne fonctionnera pas. Ces paramètres sont contenus dans le fichier de configuration jdk.table.xml dans le dossier de configuration globale d'IDEA. La configuration globale d'IDEA est par défaut située dans le répertoire personnel de l'utilisateur, mais cet emplacement peut être explicitement défini dans le fichier idea.properties.
  • le projet analysé doit être un projet valide d'IDEA, ce qui signifie que certains fichiers qui sont généralement ignorés devront être commis dans le contrôle de version, à savoir :
    • .idea/inspectionProfiles/Project_Default.xml — les paramètres de l'analyseur, ils seront clairement utilisés lors du lancement des inspections dans le conteneur,
    • .idea/modules.xml — sinon, nous obtiendrons l'erreur ‘Ce projet ne contient aucun module’,
    • .idea/misc.xml — sinon, nous obtiendrons l'erreur ‘Le JDK n'est pas configuré correctement pour ce projet’,
    • *.iml-fichiers — sinon, nous obtiendrons l'erreur concernant le JDK non configuré dans le module.

Bien que généralement ces fichiers incluent .gitignore, ils ne contiennent aucune information spécifique à l'environnement d'un développeur particulier — contrairement, par exemple, au fichier workspace.xml, où des informations telles que celles-ci sont effectivement contenues, et il ne faut donc pas le commettre.

Il s'impose de packager le JDK avec l'IDEA Community Edition dans un conteneur de façon à le préparer pour les projets à analyser. Choisissons un conteneur de base approprié, et voici ce que nous obtiendrons comme 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

Avec l'option idea.config.path , nous avons contraint IDEA à rechercher sa configuration globale dans le dossier /etc/idea, car le dossier personnel de l'utilisateur dans un environnement CI est une chose indéfinie et souvent inexistante.

Voici le fichier copié dans le conteneur jdk.table.xml, qui spécifie les chemins vers OpenJDK installé à l'intérieur du conteneur (un fichier similaire peut être pris comme base de votre propre répertoire de configuration IDEA) :

jdk.table.xml

Image ready for use available on Docker Hub.

Before moving forward, let's check if the IDEA analyzer runs in the container:

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

The analysis should complete successfully, and numerous .xml files with analyzer reports should appear in the target/idea_inspections subfolder.

There are now no doubts that the IDEA analyzer can run offline in any CI environment, and we move on to the second step.

Step 2. Display and analyze the report

Obtenir un rapport au format .xml est une bonne partie du travail, il doit maintenant être rendu lisible par un humain. De plus, ses résultats doivent être utilisés dans les quality gates — la logique de détermination du passage ou non d'un changement selon des critères de qualité.

Cela nous aidera à Jenkins Warnings NG Plugin, dont la version a été publiée en janvier 2019. Avec son arrivée, de nombreux plugins séparés pour traiter les résultats d'analyse statique dans Jenkins (CheckStyle, FindBugs, PMD, etc.) sont maintenant marqués comme obsolètes.

Le plugin est composé de deux parties :

  • de nombreux collecteurs de messages d'analyseurs (liste complète incluant tous les analyseurs connus de la science, d'AcuCobol à ZPT Lint),
  • un visualiseur de rapports unique pour tous.

Dans la liste de ce que Warnings NG peut analyser, on trouve notamment les avertissements du compilateur Java et les messages issus des journaux d'exécution Maven : bien qu'ils soient constamment visibles, ils sont rarement analysés de manière ciblée. Les rapports d'IntelliJ IDEA font également partie des formats reconnus.

Comme le plugin est nouveau, il interagit bien dès le départ avec Jenkins Pipeline. L'étape de construction avec sa participation sera comme suit (nous disons simplement au plugin quel format de rapport reconnaître et quels fichiers scanner) :

stage ('Analyse statique'){
    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')]
    )
}

L'interface du rapport ressemble à ceci :

Lancement des inspections IntelliJ IDEA sur Jenkins.

Il est pratique que cette interface soit universelle pour tous les analyseurs reconnus. Elle contient un diagramme interactif de répartition des découvertes par catégories et un graphique montrant l'évolution du nombre de découvertes. Dans la grille en bas de la page, une recherche rapide peut être effectuée. La seule chose qui n'a pas bien fonctionné pour les inspections IDEA est la possibilité de naviguer dans le code directement dans Jenkins (bien que pour d'autres rapports, par exemple Checkstyle, ce plugin sache le faire joliment). Il semble que ce soit un bogue du parseur de rapports IDEA qui doit être corrigé.

Parmi les fonctionnalités de Warnings NG se trouve la possibilité d'agréger dans un seul rapport des découvertes provenant de différentes sources et de programmer des Quality Gates, y compris un « chronomètre » basé sur la compilation de référence. Une certaine documentation sur la programmation des Quality Gates est disponible. ici — cela dit, ce n'est pas complet, et il faut regarder dans la source. D'un autre côté, pour un contrôle total sur ce qui se passe, le "ratchet" peut aussi être réalisé par soi-même (voir mon post précédent sur ce sujet).

Conclusion

Avant de préparer ce matériau, j'ai décidé de chercher : quelqu'un avait-il déjà écrit sur ce sujet sur Habr ? Je n'ai trouvé que une interview de 2017 avec lany, où il dit :

Autant que je sache, il n'y a pas d'intégration avec Jenkins ou de plugin maven […] Fondamentalement, tout passionné pourrait lier IDEA Community Edition et Jenkins, beaucoup y gagneraient.

Eh bien : deux ans plus tard, nous avons le Plugin Warnings NG, et enfin cette amitié s'est réalisée !

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster