Doen IntelliJ IDEA-inspeksies op Jenkins

IntelliJ IDEA het vandag die mees gevorderde statiese Java-kode-ontleder, wat in sy vermoëns sulke "veterane" ver agterlaat soos Kontrolestyl и Spotbugs. Sy talle “inspeksies” kontroleer die kode in verskeie aspekte, van koderingstyl tot tipiese foute.

Solank die ontledingsresultate egter slegs in die plaaslike koppelvlak van die ontwikkelaar se IDE vertoon word, is dit van min nut vir die ontwikkelingsproses. Statiese analise vervul moet word As die eerste stap van die boupyplyn, moet die resultate daarvan kwaliteithekke definieer, en die bou moet misluk as die kwaliteithekke nie geslaag word nie. Dit is bekend dat TeamCity CI met IDEA geïntegreer is. Maar selfs as jy nie TeamCity gebruik nie, kan jy maklik probeer om IDEA-inspeksies in enige ander CI-bediener uit te voer. Ek stel voor jy kyk hoe dit gedoen kan word met IDEA Community Edition, Jenkins en Warnings NG-inprop.

Stap 1. Begin die ontleding in die houer en kry 'n verslag

Aanvanklik kan die idee om 'n IDE (rekenaartoepassing!) binne 'n CI-stelsel wat nie 'n grafiese koppelvlak het nie, twyfelagtig en baie lastig lyk. Gelukkig het IDEA-ontwikkelaars die vermoë verskaf om te hardloop kode formatering и inspeksies vanaf die opdragreël. Verder, om IDEA in hierdie modus te laat loop, is 'n grafiese substelsel nie nodig nie en hierdie take kan op bedieners met 'n teksdop uitgevoer word.

Inspeksies word geloods met behulp van 'n skrif bin/inspect.sh vanaf die IDEA-installasiegids. Die vereiste parameters is:

  • volle pad na die projek (verwante word nie ondersteun nie),
  • pad na die .xml-lêer met inspeksie-instellings (gewoonlik geleë binne die projek in .idea/inspectionProfiles/Project_Default.xml),
  • volledige pad na die gids waarin .xml-lêers met verslae oor die ontledingsresultate gestoor sal word.

Daarbenewens word verwag dat

  • die pad na die Java SDK sal in die IDE gekonfigureer word, anders sal die analise nie werk nie. Hierdie instellings is vervat in die konfigurasielêer jdk.table.xml in die IDEA globale konfigurasiegids. Die IDEA globale konfigurasie self is by verstek in die gebruiker se tuisgids geleë, maar hierdie ligging kan uitdruklik gespesifiseer word in lêer idea.properties.
  • die projek wat ontleed word, moet 'n geldige IDEE-projek wees, waarvoor jy 'n paar lêers wat gewoonlik geïgnoreer word vir weergawebeheer moet verbind, naamlik:
    • .idea/inspectionProfiles/Project_Default.xml - ontlederinstellings, dit sal natuurlik gebruik word wanneer inspeksies in die houer uitgevoer word,
    • .idea/modules.xml - anders kry ons die fout 'Hierdie projek bevat geen modules',
    • .idea/misc.xml - anders kry ons die fout 'Die JDK is nie behoorlik opgestel vir hierdie projek nie',
    • *.iml-файлы - anders sal ons 'n fout kry oor 'n ongekonfigureerde JDK in die module.

Alhoewel hierdie lêers gewoonlik ingesluit word .gitignore, bevat hulle geen inligting spesifiek vir die omgewing van 'n spesifieke ontwikkelaar nie - anders as byvoorbeeld 'n lêer workspace.xml, waar sulke inligting vervat is, en daarom is dit nie nodig om dit te pleeg nie.

Die voor die hand liggende oplossing is om die JDK saam met IDEA Community Edition in 'n houer te verpak in 'n vorm wat gereed is om op die geanaliseerde projekte "ontpit" te word. Kom ons kies 'n geskikte basishouer, en dit is wat ons Dockerfile sal wees:

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

Gebruik die opsie idea.config.path ons het IDEA gedwing om sy globale konfigurasie in die gids te soek /etc/idea, want die gebruiker se tuislêergids wanneer hy in CI werk, is 'n onsekere ding en dikwels heeltemal afwesig.

Dit is hoe die lêer lyk wat na die houer gekopieer is: jdk.table.xml, wat die paaie na OpenJDK bevat wat binne die houer geïnstalleer is ('n soortgelyke lêer uit jou eie gids met IDEA-instellings kan as basis geneem word):

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>

Die voltooide beeld beskikbaar op Docker Hub.

Voordat ons verder gaan, kom ons kyk of die IDEA-ontleder in die houer loop:

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

Die analise behoort suksesvol te loop, en talle .xml-lêers met ontlederverslae moet in die target/idea_inspections-subgids verskyn.

Nou is daar geen twyfel meer dat die IDEA-ontleder selfstandig in enige CI-omgewing uitgevoer kan word nie, en ons gaan aan na die tweede stap.

Stap 2. Vertoon en ontleed die verslag

Om die verslag in die vorm van .xml-lêers te kry, is die helfte van die stryd; nou moet jy dit mens-leesbaar maak. En ook die resultate daarvan moet in kwaliteithekke gebruik word - die logika om te bepaal of die aanvaarde verandering slaag of misluk volgens kwaliteitkriteria.

Dit sal ons help Jenkins Waarskuwings NG Inprop, wat in Januarie 2019 vrygestel is. Met sy koms is baie individuele inproppe om met statiese analise-resultate in Jenkins (CheckStyle, FindBugs, PMD, ens.) te werk, nou as verouderd gemerk.

Die inprop bestaan ​​uit twee dele:

  • talle ontleder boodskap versamelaars (volledige lys sluit alle ontleders in wat aan die wetenskap bekend is van AcuCobol tot ZPT Lint),
  • 'n enkele verslagkyker vir almal.

Die lys van dinge wat Waarskuwings NG kan ontleed, sluit waarskuwings van die Java-samesteller en waarskuwings van Maven-uitvoeringslogboeke in: alhoewel hulle voortdurend sigbaar is, word dit selde spesifiek ontleed. IntelliJ IDEA verslae is ook ingesluit in die lys van erkende formate.

Aangesien die inprop nuut is, werk dit aanvanklik goed met Jenkins Pipeline. Die boustap met sy deelname sal so lyk (ons vertel eenvoudig vir die inprop watter verslagformaat ons herken en watter lêers geskandeer moet word):

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

Die verslag-koppelvlak lyk soos volg:

Doen IntelliJ IDEA-inspeksies op Jenkins

Gerieflik is hierdie koppelvlak universeel vir alle erkende ontleders. Dit bevat 'n interaktiewe diagram van die verspreiding van vondste per kategorie en 'n grafiek van die dinamika van veranderinge in die aantal vondste. Jy kan 'n vinnige soektog in die rooster onderaan die bladsy uitvoer. Die enigste ding wat nie reg gewerk het vir IDEA-inspeksies nie, was die vermoë om kode direk in Jenkins te blaai (hoewel vir ander verslae, byvoorbeeld Checkstyle, hierdie inprop dit pragtig kan doen). Dit lyk asof dit 'n fout in die IDEA-verslagontleder is wat reggemaak moet word.

Onder die kenmerke van Waarskuwings NG is die vermoë om bevindinge van verskillende bronne in een verslag saam te voeg en Quality Gates te programmeer, insluitend 'n "ratchet" vir die verwysingssamestelling. Sommige Quality Gates-programmeringsdokumentasie is beskikbaar hier - dit is egter nie volledig nie, en jy moet na die bronkode kyk. Aan die ander kant, vir volledige beheer oor wat gebeur, kan die "ratchet" onafhanklik geïmplementeer word (sien my vorige pos oor hierdie tema).

Gevolgtrekking

Voordat ek begin om hierdie materiaal voor te berei, het ek besluit om te soek: het iemand al oor hierdie onderwerp op Habré geskryf? Ek het net gevind onderhoud 2017 с Lanywaar hy sê:

Sover ek weet, is daar geen integrasie met Jenkins of 'n maven-inprop nie […] In beginsel kan enige entoesias vriende maak met IDEA Community Edition en Jenkins, baie sal net hierby baat.

Wel, twee jaar later het ons Warnings NG Plugin, en uiteindelik het hierdie vriendskap tot stand gekom!

Bron: will.com

Voeg 'n opmerking