Suorita IntelliJ IDEA -tarkastukset Jenkinsissä

IntelliJ IDEAlla on nykyään edistynein staattinen Java-koodianalysaattori, joka on ominaisuuksiltaan jättänyt kauas taakseen sellaiset "veteraanit" kuin tarkista tyyli и Spotbugs. Sen lukuisat "tarkastukset" tarkistavat koodin eri näkökohdista koodaustyylistä tyypillisiin virheisiin.

Kuitenkin niin kauan kuin analyysin tulokset näkyvät vain kehittäjän paikallisessa IDE:ssä, niistä ei ole juurikaan hyötyä kehitysprosessissa. Staattinen analyysi on suoritettava rakentamisputken ensimmäisenä vaiheena sen tulosten on määritettävä laatuportit, ja rakentamisen tulee epäonnistua, jos laatuportit epäonnistuvat. TeamCity CI:n tiedetään olevan integroitu IDEA:han. Mutta vaikka et käyttäisi TeamCityä, voit silti yrittää suorittaa IDEA-tarkastuksia millä tahansa muulla CI-palvelimella. Ehdotan, kuinka tämä voidaan tehdä käyttämällä IDEA Community Edition, Jenkins and Warnings NG -laajennusta.

Vaihe 1. Suorita analyysi säilössä ja hanki raportti

Aluksi ajatus IDE:n (työpöytäsovelluksen!) käyttämisestä CI-järjestelmässä, jossa ei ole graafista käyttöliittymää, saattaa tuntua kyseenalaiselta ja erittäin hankalalta. Onneksi IDEA-kehittäjät ovat tarjonneet mahdollisuuden suorittaa koodin muotoilu и tarkastukset komentoriviltä. Lisäksi IDEA:n suorittaminen tässä tilassa ei vaadi graafista alijärjestelmää, ja nämä tehtävät voidaan suorittaa palvelimilla, joissa on tekstikuori.

Tarkastukset käynnistetään komentosarjan avulla bin/inspect.sh IDEA-asennushakemistosta. Vaaditut parametrit ovat:

  • koko polku projektiin (sukulaisia ​​ei tueta),
  • polku .xml-tiedostoon, jossa on tarkastusasetukset (sijaitsee yleensä projektin sisällä tiedostossa .idea/inspectionProfiles/Project_Default.xml),
  • täydellinen polku kansioon, johon .xml-tiedostot ja analyysitulosraportit tallennetaan.

Lisäksi odotetaan, että

  • Java SDK:n polku määritetään IDE:ssä, muuten analyysi ei toimi. Nämä asetukset ovat asetustiedostossa. jdk.table.xml IDEA globaalissa kokoonpanokansiossa. Itse globaali IDEA-kokoonpano on käyttäjän kotihakemistossa, mutta tämä sijainti voidaan asettaa erikseen tiedostossa idea.properties.
  • analysoitavan projektin on oltava kelvollinen IDEA-projekti, jonka osalta jotkin yleensä huomiotta jätetyt tiedostot on sitouduttava versionhallintaan, nimittäin:
    • .idea/inspectionProfiles/Project_Default.xml — analysaattorin asetukset, niitä käytetään ilmeisesti, kun tarkastuksia käynnistetään säiliössä,
    • .idea/modules.xml - muuten saamme virheilmoituksen "Tämä projekti ei sisällä moduuleja",
    • .idea/misc.xml - muuten saamme virheilmoituksen "JDK:ta ei ole määritetty oikein tälle projektille",
    • *.iml-файлы - muuten saamme virheilmoituksen moduulin määrittämättömästä JDK:sta.

Vaikka nämä tiedostot ovat yleensä mukana .gitignore, ne eivät sisällä mitään erityistä tietoa tietyn kehittäjän ympäristöstä - toisin kuin esimerkiksi tiedosto workspace.xml, jos tällaisia ​​tietoja, vain, sisältyy, ja siksi niitä ei ole tarpeen sitoa.

Itse ulospääsy ehdottaa JDK:n pakkaamista yhdessä IDEA Community Editionin kanssa säiliöön muodossa, joka on valmis "asetettavaksi" analysoituihin projekteihin. Valitaan sopiva pohjasäiliö, ja tässä on Dockerfile, jonka saamme:

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

Vaihtoehtoa käyttämällä idea.config.path saimme IDEA:n etsimään kansiosta globaalia kokoonpanoaan /etc/idea, koska käyttäjän kotikansio CI:n työoloissa on epämääräinen asia ja usein puuttuu kokonaan.

Tältä säilöön kopioitu tiedosto näyttää jdk.table.xml, joka sisältää polut säilön sisään asennettuun OpenJDK:han (se voi perustua samanlaiseen tiedostoon omasta IDEA-asetushakemistostasi):

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>

Valmis kuva saatavilla Docker Hubissa.

Ennen kuin siirryt eteenpäin, testataan IDEA-jäsentimen suorittamista säilössä:

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

Analyysin pitäisi toimia onnistuneesti, ja lukuisten .xml-tiedostojen, joissa on analysointiraportit, pitäisi ilmestyä target/idea_inspections-alikansioon.

Nyt ei ole enää epäilystäkään siitä, että IDEA-analysaattoria voidaan käyttää offline-tilassa missä tahansa CI-ympäristössä, ja siirrymme toiseen vaiheeseen.

Vaihe 2. Näytä ja analysoi raportti

Raportin saaminen .xml-tiedostoina on puoli voittoa, nyt siitä on tehtävä ihmisten luettava. Ja myös sen tuloksia tulisi käyttää laatuporteissa - logiikassa, jolla määritetään, meneekö hyväksytty muutos läpi vai ei läpäisy laatukriteerien mukaan.

Tämä auttaa meitä Jenkins Warnings NG -laajennusjoka julkaistiin tammikuussa 2019. Sen käyttöönoton myötä monet erilliset lisäosat Jenkinsin staattisten analyysien tulosten käsittelyyn (CheckStyle, FindBugs, PMD jne.) on nyt merkitty vanhentuneiksi.

Plugin koostuu kahdesta osasta:

  • lukuisia analysaattoriviestien kerääjiä (täydellinen luettelo sisältää kaikki tieteen tuntemat analysaattorit AcuCobolista ZPT Lintiin),
  • yksi raportin katseluohjelma kaikille niille.

Luettelo asioista, joita Warnings NG voi jäsentää, sisältää Java-kääntäjän varoitukset ja varoitukset Mavenin suorituslokeista: vaikka ne ovat jatkuvasti näkyvissä, niitä harvoin tarkoituksellisesti analysoidaan. IntelliJ IDEA -raportit ovat myös tunnistettujen muotojen luettelossa.

Koska laajennus on uusi, se toimii aluksi hyvin Jenkins Pipelinen kanssa. Rakennusvaihe hänen osallistumisensa kanssa näyttää tältä (ilmoitamme vain laajennukselle, minkä raporttimuodon tunnistamme ja mitkä tiedostot tulee tarkistaa):

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')]
    )
}

Raportin käyttöliittymä näyttää tältä:

Suorita IntelliJ IDEA -tarkastukset Jenkinsissä

On kätevää, että tämä käyttöliittymä on universaali kaikille tunnistettavissa oleville jäsentimille. Se sisältää interaktiivisen kaavion löytöjen jakautumisesta luokkien mukaan sekä kaavion löytömäärän muutosten dynamiikasta. Sivun alareunassa olevasta ruudukosta voit tehdä pikahaun. Ainoa asia, joka ei toiminut oikein IDEA-tarkastuksissa, oli kyky selata koodia suoraan Jenkinsissä (vaikka muissa raporteissa, kuten Checkstyle, tämä laajennus voi tehdä sen kauniisti). Se näyttää olevan virhe IDEA-raportin jäsentimessä, joka on korjattava.

Warnings NG:n ominaisuuksiin kuuluu kyky koota havainnot eri lähteistä yhdeksi raportiksi ja ohjelmoida Quality Gates, mukaan lukien "räikkä" referenssikokoonpanoa varten. Joitakin Quality Gates -ohjelmointidokumentaatioita on saatavilla täällä - Se ei kuitenkaan ole täydellinen, ja sinun on katsottava lähdettä. Toisaalta tapahtumien täydelliseen hallintaan "räikkä" voidaan toteuttaa itsenäisesti (katso edellinen postaus tästä aiheesta).

Johtopäätös

Ennen kuin aloin valmistelemaan tätä materiaalia, päätin katsoa: onko kukaan jo kirjoittanut tästä aiheesta Habreen? Minä vain löysin haastattelu 2017 с laiskamissä lukee:

Ymmärtääkseni Jenkinsin tai maven-liitännäisen kanssa ei ole integraatiota [...] Periaatteessa kuka tahansa harrastaja voisi tehdä IDEA Community Editionin ja Jenkinsin ystäviä, monet vain hyötyisivät tästä.

No, kahden vuoden kuluttua meillä on Warnings NG Plugin, ja vihdoin tämä ystävyys on toteutunut!

Lähde: will.com

Lisää kommentti