Käivitage Jenkinsil IntelliJ IDEA ülevaatused

IntelliJ IDEA omab täna kõige arenenumat staatilise Java koodianalüsaatorit, mis on oma võimaluste poolest jätnud kaugele selja taha sellised "veteranid" nagu Tšekistiil и Spotbugs. Selle arvukad "ülevaatused" kontrollivad koodi erinevates aspektides, alates kodeerimisstiilist kuni iseloomulike vigadeni.

Kuid seni, kuni analüüsi tulemused kuvatakse ainult arendaja kohalikus IDE-s, on neist arendusprotsessis vähe kasu. Staatiline analüüs tuleb läbi viia ehitustorustiku esimese etapina peavad selle tulemused määrama kvaliteediväravad ja ehitamine peab ebaõnnestuma, kui kvaliteediväravad ebaõnnestuvad. TeamCity CI on teadaolevalt IDEAga integreeritud. Kuid isegi kui te TeamCityt ei kasuta, võite siiski proovida käivitada IDEA kontrolli mis tahes muus CI-serveris. Teen ettepaneku vaadata, kuidas seda teha IDEA Community Editioni, Jenkinsi ja Warnings NG pistikprogrammi abil.

1. samm. Käivitage analüüs konteineris ja hankige aruanne

Alguses võib idee käivitada IDE (töölauarakendus!) CI-süsteemis, millel pole graafilist liidest, tunduda kahtlane ja väga tülikas. Õnneks on IDEA arendajad pakkunud käivitamisvõimalust koodi vormindamine и kontrollid käsurealt. Lisaks pole IDEA selles režiimis käitamiseks vaja graafilist alamsüsteemi ja neid ülesandeid saab täita tekstikestaga serverites.

Kontrollimine käivitatakse skripti abil bin/inspect.sh IDEA installikataloogist. Nõutavad parameetrid on järgmised:

  • täielik tee projektini (sugulasi ei toetata),
  • kontrollisätetega xml-faili tee (tavaliselt asub projekti sees failis .idea/inspectionProfiles/Project_Default.xml),
  • täielik tee kausta, kuhu salvestatakse analüüsitulemuste aruannetega xml-failid.

Lisaks eeldatakse, et

  • Java SDK tee konfigureeritakse IDE-s, vastasel juhul analüüs ei tööta. Need sätted sisalduvad konfiguratsioonifailis. jdk.table.xml IDEA globaalses konfiguratsioonikaustas. Globaalne IDEA vaikekonfiguratsioon ise on kasutaja kodukataloogis, kuid see asukoht saab selgesõnaliselt määrata failis idea.properties.
  • analüüsitav projekt peab olema kehtiv IDEA projekt, mille puhul mõned failid, mida tavaliselt eiratakse, peavad olema seotud versioonikontrolliga, nimelt:
    • .idea/inspectionProfiles/Project_Default.xml — analüsaatori sätted, neid kasutatakse ilmselgelt konteineris kontrolli alustamisel,
    • .idea/modules.xml - vastasel juhul saame veateate "See projekt ei sisalda mooduleid",
    • .idea/misc.xml - vastasel juhul saame veateate "JDK pole selle projekti jaoks õigesti konfigureeritud",
    • *.iml-файлы - vastasel juhul saame veateate moodulis konfigureerimata JDK kohta.

Kuigi need failid on tavaliselt kaasatud .gitignore, ei sisalda need konkreetse arendaja keskkonnale spetsiifilist teavet – erinevalt näiteks failist workspace.xml, kus selline teave lihtsalt sisaldub ja seetõttu pole seda vaja siduda.

Iseenesest soovitab väljapääs JDK koos IDEA Community Editioniga konteinerisse pakkida kujul, mis on valmis analüüsitud projektidele "seadistamiseks". Valime sobiva alusmahuti ja siin on Dockerfile, mille saame:

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

Kasutades valikut idea.config.path panime IDEA kaustast otsima oma globaalset konfiguratsiooni /etc/idea, kuna kasutaja kodukaust töötingimustes CI-s on ebamäärane asi ja sageli puudub täielikult.

Selline näeb konteinerisse kopeeritud fail välja jdk.table.xml, mis sisaldab konteineri sisse installitud OpenJDK teid (see võib põhineda sarnasel failil teie enda IDEA sätete kataloogist):

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 pilt saadaval Docker Hubis.

Enne edasi liikumist testime konteineris IDEA parseri käitamist:

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

Analüüs peaks toimima edukalt ja alamkaustas target/idea_inspections peaks ilmuma arvukalt .xml-faile koos analüsaatori aruannetega.

Nüüd pole enam kahtlust, et IDEA analüsaatorit saab võrguühenduseta käivitada mis tahes CI keskkonnas ja liigume edasi teise sammu juurde.

2. samm. Kuvage ja analüüsige aruannet

Aruande hankimine .xml-failidena on pool võitu, nüüd tuleb see muuta inimloetavaks. Ja ka selle tulemusi tuleks kasutada kvaliteediväravates – loogikat, mille alusel otsustatakse, kas aktsepteeritud muudatus läheb läbi või ei läbi kvaliteedikriteeriumide järgi.

See aitab meid Jenkinsi hoiatuste NG pistikprogrammmis ilmus jaanuaris 2019. Selle kasutuselevõtuga on paljud eraldi pistikprogrammid Jenkinsis staatilise analüüsi tulemustega töötamiseks (CheckStyle, FindBugs, PMD jne) märgitud vananenuks.

Plugin koosneb kahest osast:

  • arvukad analüsaatorite sõnumite kogujad (täielik loetelu hõlmab kõiki teadusele teadaolevaid analüsaatoreid alates AcuCobolist kuni ZPT Lintini),
  • nende kõigi jaoks üks aruannete vaataja.

Asjade loend, mida Warnings NG saab sõeluda, sisaldab Java kompilaatori hoiatusi ja hoiatusi Maveni täitmislogidest: kuigi need on pidevalt silmapiiril, analüüsitakse neid harva sihipäraselt. IntelliJ IDEA aruanded sisalduvad ka tunnustatud vormingute loendis.

Kuna pistikprogramm on uus, suhtleb see algselt Jenkinsi torustikuga hästi. Tema osalusel koostamise samm näeb välja järgmine (me lihtsalt ütleme pistikprogrammile, millise aruandevormingu me ära tunneme ja milliseid faile tuleks kontrollida):

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

Aruande liides näeb välja selline:

Käivitage Jenkinsil IntelliJ IDEA ülevaatused

On mugav, et see liides on universaalne kõigi äratuntavate parserite jaoks. See sisaldab interaktiivset graafikut leidude jaotusest kategooriate kaupa ja graafikut leidude arvu muutumise dünaamika kohta. Lehe allosas asuvas ruudustikus saate teha kiirotsingu. Ainus, mis IDEA kontrollide puhul korralikult ei töötanud, oli võimalus koodi otse Jenkinsis sirvida (kuigi teiste aruannete puhul, nagu Checkstyle, saab see pistikprogramm seda ilusti teha). Tundub, et tegemist on veaga IDEA aruande parseris, mis tuleb parandada.

Warnings NG funktsioonide hulgas on ka võimalus koondada erinevatest allikatest pärit leiud ühte aruandesse ja programmeerida kvaliteediväravaid, sealhulgas võrdluskoostu jaoks mõeldud põrkmehhanism. Mõned Quality Gatesi programmeerimisdokumendid on saadaval siin - aga see pole täielik ja peate vaatama allikat. Teisest küljest saab toimuva täielikuks kontrollimiseks "põrkmehhanismi" rakendada iseseisvalt (vt minu eelmine postitus selle teema kohta).

Järeldus

Enne seda materjali ette valmistama asumist otsustasin uurida: kas keegi on sellel teemal Habres juba kirjutanud? ainult leidsin intervjuu 2017 с Lanykus on kirjas:

Minu teada puudub integratsioon Jenkinsiga ega maven pluginaga [...] Põhimõtteliselt võiks iga entusiast IDEA Community Editioni ja Jenkinsi sõpradeks teha, paljudel oleks sellest ainult kasu.

Kahe aasta pärast on meil Warnings NG Plugin ja lõpuks sai see sõprus tõeks!

Allikas: www.habr.com

Lisa kommentaar