Kører IntelliJ IDEA-inspektioner på Jenkins

IntelliJ IDEA har i dag den mest avancerede statiske Java-kodeanalysator, som i sine muligheder efterlader sådanne "veteraner" som f.eks. Tjekstil и Spotbugs. Dens talrige "inspektioner" kontrollerer koden i forskellige aspekter, fra kodningsstil til typiske fejl.

Men så længe analyseresultaterne kun vises i den lokale grænseflade af udviklerens IDE, er de til lidt nytte for udviklingsprocessen. Statisk analyse skal opfyldes Som det første trin i byggepipelinen bør resultaterne definere kvalitetsporte, og bygningen skulle mislykkes, hvis kvalitetsportene ikke er bestået. Det er kendt, at TeamCity CI er integreret med IDEA. Men selvom du ikke bruger TeamCity, kan du nemt prøve at køre IDEA-inspektioner i enhver anden CI-server. Jeg foreslår, at du ser, hvordan dette kan gøres ved hjælp af IDEA Community Edition, Jenkins og Warnings NG plugin.

Trin 1. Kør analysen i containeren og få en rapport

I første omgang kan ideen om at køre en IDE (desktop-applikation!) inde i et CI-system, der ikke har en grafisk grænseflade, virke tvivlsom og meget besværlig. Heldigvis har IDEA-udviklere givet mulighed for at køre kodeformatering и inspektioner fra kommandolinjen. For at køre IDEA i denne tilstand kræves der desuden ikke et grafikundersystem, og disse opgaver kan udføres på servere med en tekstskal.

Inspektioner lanceres ved hjælp af et script bin/inspect.sh fra IDEA installationsmappen. De nødvendige parametre er:

  • fuld vej til projektet (slægtninge understøttes ikke),
  • stien til .xml-filen med inspektionsindstillinger (normalt placeret inde i projektet i .idea/inspectionProfiles/Project_Default.xml),
  • fuld sti til mappen, hvori .xml-filer med rapporter om analyseresultaterne vil blive gemt.

Derudover forventes det

  • stien til Java SDK vil blive konfigureret i IDE, ellers vil analysen ikke fungere. Disse indstillinger er indeholdt i konfigurationsfilen jdk.table.xml i IDEA globale konfigurationsmappe. Den globale IDEA-konfiguration er som standard placeret i brugerens hjemmemappe, men denne placering kan udtrykkeligt specificeres i fil idea.properties.
  • det projekt, der analyseres, skal være et gyldigt IDEA-projekt, for hvilket du bliver nødt til at committe nogle filer, som normalt ignoreres til versionskontrol, nemlig:
    • .idea/inspectionProfiles/Project_Default.xml — analysatorindstillinger, de vil naturligvis blive brugt, når der udføres inspektioner i containeren,
    • .idea/modules.xml - ellers får vi fejlen 'Dette projekt indeholder ingen moduler',
    • .idea/misc.xml - ellers får vi fejlen 'JDK'et er ikke konfigureret korrekt til dette projekt',
    • *.iml-файлы - ellers får vi en fejl om en ukonfigureret JDK i modulet.

Selvom disse filer normalt er inkluderet i .gitignore, indeholder de ingen information, der er specifik for miljøet for en bestemt udvikler - i modsætning til for eksempel en fil workspace.xml, hvor sådanne oplysninger er indeholdt, og det derfor ikke er nødvendigt at begå dem.

Den oplagte løsning er at pakke JDK sammen med IDEA Community Edition i en container i en form, der er klar til at blive "pittet" på de analyserede projekter. Lad os vælge en passende basiscontainer, og dette er, hvad vores Dockerfile bliver:

Dockerfil

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

Brug af muligheden idea.config.path vi tvang IDEA til at lede efter dens globale konfiguration i mappen /etc/idea, fordi brugerens hjemmemappe ved arbejde i CI er en usikker ting og ofte helt fraværende.

Sådan ser filen kopieret til containeren ud: jdk.table.xml, som indeholder stierne til OpenJDK installeret inde i containeren (en lignende fil fra din egen mappe med IDEA-indstillinger kan tages som basis):

jdk.table.xml

<application>
 <component name="ProjectJdkTable">
   <jdk version="2">
     <name value="1.8" />
     <type value="JavaSDK" />
     <version value="1.8" />
     <homePath value="/usr/java" />
     <roots>
       <annotationsPath>
         <root type="composite">
           <root url="jar://$APPLICATION_HOME_DIR$/lib/jdkAnnotations.jar!/" type="simple" />
         </root>
       </annotationsPath>
       <classPath>
         <root type="composite">
           <root url="jar:///usr/java/jre/lib/charsets.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/deploy.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/access-bridge-64.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/cldrdata.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/dnsns.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/jaccess.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/jfxrt.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/localedata.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/nashorn.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/sunec.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/sunjce_provider.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/sunmscapi.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/sunpkcs11.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/zipfs.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/javaws.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/jce.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/jfr.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/jfxswt.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/jsse.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/management-agent.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/plugin.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/resources.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/rt.jar!/" type="simple" />
         </root>
       </classPath>
     </roots>
     <additional />
   </jdk>
 </component>
</application>

Det færdige billede tilgængelig på Docker Hub.

Før vi går videre, lad os kontrollere, at IDEA-analysatoren kører i beholderen:

docker run --rm -v <путь/к/вашему/проекту>:/var/project inponomarev/intellij-idea-analyzer

Analysen skulle køre med succes, og adskillige .xml-filer med analysatorrapporter skulle vises i undermappen target/idea_inspections.

Nu er der ikke længere nogen tvivl om, at IDEA-analysatoren kan køres selvstændigt i ethvert CI-miljø, og vi går videre til andet trin.

Trin 2. Vis og analyser rapporten

At få rapporten i form af .xml-filer er halvdelen af ​​kampen, nu skal du gøre den læsbar. Og også dens resultater skal bruges i kvalitetsporte - logikken til at bestemme, om den accepterede ændring bestå eller mislykkes i henhold til kvalitetskriterier.

Dette vil hjælpe os Jenkins Warnings NG Plugin, som blev udgivet i januar 2019. Med sin fremkomst er mange individuelle plugins til at arbejde med statiske analyseresultater i Jenkins (CheckStyle, FindBugs, PMD osv.) nu markeret som forældede.

Pluginnet består af to dele:

  • talrige analysator beskedsamlere (komplet liste inkluderer alle analysatorer kendt af videnskaben fra AcuCobol til ZPT Lint),
  • en enkelt rapportfremviser for dem alle.

Listen over ting, som Warnings NG kan analysere, inkluderer advarsler fra Java-kompileren og advarsler fra Maven-udførelseslogfiler: selvom de konstant er synlige, analyseres de sjældent specifikt. IntelliJ IDEA-rapporter er også inkluderet i listen over anerkendte formater.

Da plugin'et er nyt, interagerer det i første omgang godt med Jenkins Pipeline. Opbygningstrinnet med dets deltagelse vil se sådan ud (vi fortæller blot pluginnet, hvilket rapportformat vi genkender, og hvilke filer der skal scannes):

stage ('Static analysis'){
    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')]
    )
}

Rapportgrænsefladen ser sådan ud:

Kører IntelliJ IDEA-inspektioner på Jenkins

Denne grænseflade er bekvemt universel for alle anerkendte analysatorer. Den indeholder et interaktivt diagram over fordelingen af ​​fund efter kategori og en graf over dynamikken i ændringer i antallet af fund. Du kan udføre en hurtig søgning i gitteret nederst på siden. Det eneste, der ikke fungerede korrekt til IDEA-inspektioner, var muligheden for at gennemse kode direkte i Jenkins (selvom for andre rapporter, for eksempel Checkstyle, kan dette plugin gøre dette smukt). Det ser ud til, at dette er en fejl i IDEA-rapportparseren, der skal rettes.

Blandt funktionerne i Warnings NG er muligheden for at samle resultater fra forskellige kilder i én rapport og programmere Quality Gates, herunder en "skralde" til referencesamlingen. Noget Quality Gates-programmeringsdokumentation er tilgængelig her - den er dog ikke komplet, og man skal se på kildekoden. På den anden side, for fuldstændig kontrol over, hvad der sker, kan "skralden" implementeres uafhængigt (se min tidligere indlæg om dette tema).

Konklusion

Før jeg begyndte at forberede dette materiale, besluttede jeg at søge: har nogen allerede skrevet om dette emne på Habré? Jeg fandt kun interview 2017 с Lanyhvor han siger:

Så vidt jeg ved, er der ingen integration med Jenkins eller et maven-plugin […] I princippet kunne enhver entusiast blive venner med IDEA Community Edition og Jenkins, mange ville kun have gavn af dette.

Nå, to år senere har vi Warnings NG Plugin, og endelig er dette venskab kommet til virkelighed!

Kilde: www.habr.com

Køb pålidelig hosting til websteder med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster