We starten IntelliJ IDEA-inspecties op Jenkins

IntelliJ IDEA beschikt vandaag de dag over de meest geavanceerde statische code-analysetool voor Java, die zijn mogelijkheden ver achterlaat bij "veteranen" zoals Checkstyle en Spotbugs. De vele "inspecties" controleren de code op verschillende aspecten, van code stijl tot typische bugs.

Echter, zolang de analysemogelijkheden alleen worden weergegeven in de lokale interface van de IDE van de ontwikkelaar, hebben ze weinig nut voor het ontwikkelproces. Statische analyse moet worden uitgevoerd als een eerste stap in de build-pijplijn, de resultaten moeten de quality gates bepalen, en de build moet mislukken als de quality gates niet zijn doorstaan. Het is bekend dat TeamCity CI is geïntegreerd met IDEA. Maar zelfs als je TeamCity niet gebruikt, kun je de inspecties van IDEA uitvoeren op elke andere CI-server. Laten we kijken hoe dit kan worden gedaan met IDEA Community Edition, Jenkins en de Warnings NG-plugin.

Stap 1. Voer de analyse uit in een container en ontvang het rapport

Oorspronkelijk lijkt het een twijfelachtige en zeer lastige onderneming om een IDE (desktopapplicatie!) binnen een CI-systeem zonder grafische interface te draaien. Gelukkig hebben de ontwikkelaars van IDEA de mogelijkheid geboden om code formatting en inspecties uit de opdrachtregel uit te voeren. Bovendien is er geen grafische subsystemen vereist voor het uitvoeren van IDEA in deze modus en deze taken kunnen worden uitgevoerd op servers met een tekstuele interface.

De inspecties worden uitgevoerd met behulp van het script bin/inspect.sh uit de installatiedirectory van IDEA. Als parameters zijn vereist:

  • het volledige pad naar het project (relatieve paden worden niet ondersteund),
  • het pad naar het .xml-bestand met de inspectie-instellingen (meestal te vinden binnen het project in .idea/inspectionProfiles/Project_Default.xml),
  • het volledige pad naar de map waar de .xml-bestanden met analysesresultaten zullen worden opgeslagen.

Bovendien wordt verwacht dat

  • in de IDE het pad naar de Java SDK is ingesteld, anders zal de analyse niet werken. Deze instellingen zijn te vinden in het configuratiebestand jdk.table.xml in de globale configuratiemap van IDEA. De globale configuratie van IDEA bevindt zich standaard in de thuismap van de gebruiker, maar deze locatie kan expliciet worden opgegeven in het bestand idea.properties.
  • het geanalyseerde project moet een geldig IDEA-project zijn, waarvoor op versiebeheer enkele bestanden moeten worden gecommit die normaal worden genegeerd, namelijk:
    • .idea/inspectionProfiles/Project_Default.xml — de analyzer-instellingen, deze zullen zeker worden gebruikt bij het uitvoeren van inspecties in de container,
    • .idea/modules.xml — anders krijgen we de foutmelding ‘Dit project bevat geen modules’,
    • .idea/misc.xml — anders krijgen we de foutmelding ‘De JDK is niet correct geconfigureerd voor dit project’,
    • *.iml-bestanden — anders krijgen we een foutmelding over de niet-geconfigureerde JDK in de module.

Hoewel deze bestanden meestal in .gitignore, bevatten ze geen ontwikkelingsspecifieke informatie van de specifieke ontwikkelaar — in tegenstelling tot, bijvoorbeeld, het bestand workspace.xml, waar dergelijke informatie juist wel in staat, en daarom hoeft het niet te worden gecommit.

Het ligt voor de hand om de JDK samen met IDEA Community Edition in de container te verpakken in een formaat dat klaar is om op de te analyseren projecten losgelaten te worden. We kiezen een geschikte basiscontainer, en dit is de Dockerfile die we krijgen:

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

Met de optie idea.config.path hebben we IDEA gedwongen zijn globale configuratie in de map te zoeken /etc/idea, aangezien de home-directory van de gebruiker in een CI-omgeving onbepaald en vaak helemaal afwezig is.

Zo ziet het bestand eruit dat in de container wordt gekopieerd jdk.table.xml, waarin de paden naar OpenJDK zijn aangegeven, die binnen de container is geïnstalleerd (een vergelijkbaar bestand uit uw eigen IDEA-configuratiemap kan als basis worden gebruikt):

jdk.table.xml

Afbeelding in gereed formaat beschikbaar op Docker Hub.

Laten we voordat we verder gaan de IDEA-analyzer in de container starten:

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

De analyse moet succesvol worden uitgevoerd en in de submap target/idea_inspections moeten verschillende .xml-bestanden met rapportages van de analyzer verschijnen.

Er zijn nu geen twijfels meer dat de IDEA-analyzer offline kan worden uitgevoerd in elke CI-omgeving, en we gaan verder naar de tweede stap.

Stap 2. We tonen en analyseren het rapport

Het verkrijgen van een rapport in de vorm van .xml-bestanden is een half werk, het moet nu leesbaar worden gemaakt. Bovendien moeten de resultaten worden gebruikt in quality gates – de logica die bepaalt of een wijziging wel of niet voldoet aan de kwaliteitscriteria.

Daarbij helpt ons Jenkins Warnings NG Plugin, waarvan de release in januari 2019 plaatsvond. Met de komst hiervan zijn veel afzonderlijke plugins voor het werken met de resultaten van statische analyse in Jenkins (CheckStyle, FindBugs, PMD, enz.) nu als verouderd (obsolete) gemarkeerd.

De plugin bestaat uit twee delen:

  • talrijke verzamelaars voor berichten van de analyzers (volledige lijst die alle bekende analyzers van AcuCobol tot ZPT Lint omvat),
  • en een uniforme rapportviewer voor allemaal.

In de lijst van wat Warnings NG kan analyseren, bevinden zich ook Java-compiler waarschuwingen en waarschuwingen uit de uitvoeringslogs van Maven: hoewel ze altijd in het zicht zijn, worden ze zelden gericht geanalyseerd. Rapporten van IntelliJ IDEA behoren ook tot de herkenbare formaten.

Omdat de plugin nieuw is, werkt hij in eerste instantie goed samen met Jenkins Pipeline. Een stap in de build met zijn deelname zou er als volgt uitzien (we zeggen simpelweg tegen de plugin welke rapportformaat we herkennen en welke bestanden we moeten scannen):

stage ('Statistische analyse'){
    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')]
    )
}

De rapportinterface ziet er als volgt uit:

We starten IntelliJ IDEA-inspecties op Jenkins

Handig is dat deze interface universeel is voor alle herkenbare analyzers. Het bevat een interactieve diagram van de verdeling van bevindingen per categorie en een grafiek van de dynamiek van veranderingen in het aantal bevindingen. In de grid onderaan de pagina kan een snelle zoekopdracht worden uitgevoerd. Het enige wat niet goed werkt voor IDEA-inspecties is de mogelijkheid om de code rechtstreeks in Jenkins te doorbladeren (hoewel deze plugin dat mooi kan maken voor andere rapporten, zoals Checkstyle). Dit lijkt een bug te zijn in de parser van IDEA-rapporten die nog moet worden opgelost.

Onder de mogelijkheden van Warnings NG bevindt zich de mogelijkheid om bevindingen uit verschillende bronnen te aggregeren in één rapport en Quality Gates te programmeren, inclusief een 'ratchet' op de referentiebuild. Een bepaalde documentatie over het programmeren van Quality Gates is beschikbaar. hier — eigenlijk is het niet compleet, en moet je de bronbestanden bekijken. Aan de andere kant, voor volledige controle over de situatie kan je de "ratchet" ook zelf implementeren (zie mijn vorige post over dit onderwerp).

Conclusie

Voordat ik aan het opstellen van dit materiaal begon, besloot ik te kijken: heeft iemand er al over geschreven op Habr? Ik vond alleen maar een interview uit 2017 met lany, waarin hij zegt:

Voor zover ik weet, is er geen integratie met Jenkins of een maven-plugin […] In principe zou elke enthousiasteling IDEA Community Edition en Jenkins kunnen combineren, veel mensen zouden er alleen maar baat bij hebben.

Nou, twee jaar later hebben we de Warnings NG Plugin, en eindelijk is die vriendschap tot stand gekomen!

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster