Kör IntelliJ IDEA-inspektioner pÄ Jenkins

IntelliJ IDEA har för nÀrvarande den mest avancerade statiska Java-kodanalysatorn, som i sin kapacitet har lÀmnat sÄdana "veteraner" som Checkstyle О Spotbugs. Dess mÄnga "inspektioner" kontrollerar koden för olika aspekter, frÄn kodningsstil till vanliga buggar.

Men sÄ lÀnge som analysresultaten endast visas i det lokala grÀnssnittet för utvecklarens IDE, Àr de till liten nytta för utvecklingsprocessen. Statisk analys mÄste utföras Som det första steget i byggpipelinen bör dess resultat avgöra kvalitetsgrindar, och bygget bör misslyckas om kvalitetsgrindarna inte passeras. Det Àr kÀnt att TeamCity CI Àr integrerat med IDEA. Men Àven om du inte anvÀnder TeamCity kan du fortfarande prova att köra IDEA-inspektioner pÄ vilken annan CI-server som helst. Jag föreslÄr att du tittar pÄ hur detta kan göras med IDEA Community Edition, Jenkins och Warnings NG plugin.

Steg 1. Kör analysen i behÄllaren och hÀmta rapporten

Till en början kan idén att köra en IDE (en skrivbordsapplikation!) inuti ett CI-system som inte har ett grafiskt grÀnssnitt verka tvivelaktig och mycket besvÀrlig. Lyckligtvis har IDEA-utvecklarna gett möjligheten att köra kodformatering О inspektioner frÄn kommandoraden. För att köra IDEA i detta lÀge krÀvs dessutom inget grafiskt delsystem och dessa uppgifter kan utföras pÄ servrar med ett textskal.

Inspektioner startas med hjÀlp av ett skript bin/inspect.sh frÄn IDEA-installationskatalogen. Följande parametrar krÀvs:

  • fullstĂ€ndig sökvĂ€g till projektet (relativa sökvĂ€gar stöds inte),
  • sökvĂ€g till .xml-filen med inspektionsinstĂ€llningar (vanligtvis placerad i projektet i .idea/inspectionProfiles/Project_Default.xml),
  • den fullstĂ€ndiga sökvĂ€gen till mappen dĂ€r .xml-filerna med analysresultatrapporterna kommer att lagras.

Dessutom förvÀntas det

  • SökvĂ€gen till Java SDK kommer att konfigureras i IDE, annars fungerar inte analysen. Dessa instĂ€llningar finns i konfigurationsfilen. jdk.table.xml i IDEA globala konfigurationsmappen. SjĂ€lva den globala IDEA-konfigurationen finns som standard i anvĂ€ndarens hemkatalog, men den hĂ€r platsen kan uttryckligen anges i fil idea.properties.
  • det analyserade projektet mĂ„ste vara ett giltigt IDEA-projekt, för vilket du mĂ„ste överlĂ„ta vissa filer till versionskontroll som vanligtvis ignoreras, nĂ€mligen:
    • .idea/inspectionProfiles/Project_Default.xml — analysatorinstĂ€llningar, de kommer uppenbarligen att anvĂ€ndas vid inspektioner i behĂ„llaren,
    • .idea/modules.xml - annars fĂ„r vi felet 'Detta projekt innehĂ„ller inga moduler',
    • .idea/misc.xml - annars fĂ„r vi felet "JDK Ă€r inte korrekt konfigurerad för detta projekt",
    • *.iml-фаĐčлы — annars fĂ„r vi ett felmeddelande om att JDK inte Ă€r konfigurerad i modulen.

Även om dessa filer vanligtvis ingĂ„r i .gitignore, innehĂ„ller de ingen information som Ă€r specifik för miljön för en viss utvecklare - till skillnad frĂ„n till exempel en fil workspace.xml, dĂ€r sĂ„dan information finns och det dĂ€rför inte finns nĂ„got behov av att begĂ„ den.

Den uppenbara lösningen Àr att packa JDK tillsammans med IDEA Community Edition i en container i en form redo att "stÀllas in pÄ" de projekt som analyseras. LÄt oss vÀlja en lÀmplig basbehÄllare, och sÄ hÀr kommer vÄr Dockerfile att se ut:

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

AnvÀnder alternativet idea.config.path vi fick IDEA att leta efter dess globala konfiguration i mappen /etc/idea, eftersom anvÀndarens hemmapp i CI-förhÄllanden Àr en odefinierad sak och ofta helt frÄnvarande.

SÄ hÀr ser en fil som kopierats till en behÄllare ut jdk.table.xml, som anger sökvÀgarna till OpenJDK installerat i behÄllaren (en liknande fil frÄn din egen katalog med IDEA-instÀllningar kan anvÀndas som bas):

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>

Den fÀrdiga bilden tillgÀnglig pÄ Docker Hub.

Innan vi gÄr vidare, lÄt oss kontrollera lanseringen av IDEA-analysatorn i behÄllaren:

docker run --rm -v <путь/Đș/ĐČĐ°ŃˆĐ”ĐŒŃƒ/ĐżŃ€ĐŸĐ”Đșту>:/var/project inponomarev/intellij-idea-analyzer

Analysen ska slutföras framgÄngsrikt, och mÄnga .xml-filer med analysrapporter bör visas i undermappen target/idea_inspections.

Nu rÄder det ingen tvekan om att IDEA-analysatorn kan köras i fristÄende lÀge i vilken CI-miljö som helst, och vi gÄr vidare till det andra steget.

Steg 2. Visa och analysera rapporten

Att fÄ en rapport i form av .xml-filer Àr halva striden, nu mÄste den göras lÀsbar för mÀnniskor. Och dess resultat bör ocksÄ anvÀndas i kvalitetsgrindar - logiken för att avgöra om en accepterad förÀndring godkÀnns eller misslyckas enligt kvalitetskriterier.

Detta kommer att hjÀlpa oss Jenkins Warnings NG Plugin, som slÀpptes i januari 2019. Med sin introduktion Àr mÄnga individuella plugins för att arbeta med statiska analysresultat i Jenkins (CheckStyle, FindBugs, PMD, etc.) nu markerade som förÄldrade.

Insticksprogrammet bestÄr av tvÄ delar:

  • mĂ„nga meddelandeinsamlare analysatorer (hela listan inkluderar alla kĂ€nda vetenskapliga analysatorer frĂ„n AcuCobol till ZPT Lint),
  • en enda rapportvisare för dem alla.

Listan över saker som Warnings NG kan analysera inkluderar Java-kompilatorvarningar och varningar frÄn Mavens exekveringsloggar: Àven om de Àr stÀndigt synliga, analyseras de sÀllan med avsikt. IntelliJ IDEA-rapporter ingÄr ocksÄ i listan över erkÀnda format.

Eftersom plugin-programmet Àr nytt interagerar det initialt bra med Jenkins Pipeline. Byggsteget som involverar det kommer att se ut sÄ hÀr (vi berÀttar bara för plugin vilket rapportformat vi kÀnner igen och vilka filer som ska skannas):

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Ànssnittet ser ut sÄ hÀr:

Kör IntelliJ IDEA-inspektioner pÄ Jenkins

Det Àr bekvÀmt att detta grÀnssnitt Àr universellt för alla erkÀnda analysatorer. Den innehÄller ett interaktivt diagram över fyndfördelningen per kategori och en graf över dynamiken i förÀndringar i antalet fynd. Du kan göra en snabb sökning i rutnÀtet lÀngst ner pÄ sidan. Det enda som inte fungerade korrekt för IDEA-inspektioner var möjligheten att blÀddra i kod direkt i Jenkins (Àven om för andra rapporter, som Checkstyle, kan detta plugin göra det bra). Det ser ut som att detta Àr en bugg i IDEA:s rapportparser som mÄste fixas.

Varningar NG-funktioner inkluderar möjligheten att samla resultat frĂ„n olika kĂ€llor i en rapport och programmera Quality Gates, inklusive en "spĂ€rr" för referensenheten. Viss dokumentation om programmering av Quality Gates finns tillgĂ€nglig hĂ€r - den Ă€r dock inte komplett, och du mĂ„ste titta pĂ„ kĂ€llkoden. Å andra sidan, för fullstĂ€ndig kontroll över vad som hĂ€nder, kan "spĂ€rren" implementeras oberoende (se min föregĂ„ende inlĂ€gg om detta Ă€mne).

Slutsats

Innan jag började förbereda det hÀr materialet bestÀmde jag mig för att söka: har nÄgon redan skrivit om detta Àmne pÄ Habr? Jag hittade bara intervju 2017 с lany, dÀr han sÀger:

SÄ vitt jag vet finns det ingen integration med Jenkins eller maven plugin [
] I princip kan vilken entusiast som helst fÄ vÀnner mellan IDEA Community Edition och Jenkins, mÄnga skulle bara dra nytta av detta.

Tja, tvÄ Är senare har vi Warnings NG Plugin, och Àntligen har denna vÀnskap blivit sann!

KĂ€lla: will.com

Köp pĂ„litlig hosting för webbplatser med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster