Spustenie inšpekcií IntelliJ IDEA na Jenkinsovi

IntelliJ IDEA má dnes najpokročilejší statický analyzátor kódu Java, ktorý svojimi schopnosťami zanecháva ďaleko za sebou takých „veteránov“ ako napr. Checkstyle и Spotbugs. Jeho početné „inšpekcie“ kontrolujú kód v rôznych aspektoch, od štýlu kódovania až po typické chyby.

Pokiaľ sa však výsledky analýzy zobrazujú iba v lokálnom rozhraní vývojárskeho IDE, sú pre proces vývoja málo užitočné. Statická analýza musia byť splnené Ako prvý krok procesu budovania by jeho výsledky mali definovať brány kvality a stavba by mala zlyhať, ak nie sú brány kvality. Je známe, že TeamCity CI je integrovaný s IDEA. Ale aj keď nepoužívate TeamCity, môžete jednoducho skúsiť spustiť kontroly IDEA na akomkoľvek inom serveri CI. Navrhujem, aby ste videli, ako sa to dá urobiť pomocou IDEA Community Edition, doplnku Jenkins and Warnings NG.

Krok 1. Spustite analýzu v kontajneri a získajte správu

Spočiatku sa myšlienka spustenia IDE (desktopovej aplikácie!) v systéme CI, ktorý nemá grafické rozhranie, môže zdať pochybná a veľmi problematická. Našťastie vývojári IDEA poskytli možnosť spustiť formátovanie kódu и inšpekcia z príkazového riadku. Navyše na spustenie IDEA v tomto režime nie je potrebný grafický subsystém a tieto úlohy je možné vykonávať na serveroch s textovým shellom.

Kontroly sa spúšťajú pomocou skriptu bin/inspect.sh z inštalačného adresára IDEA. Požadované parametre sú:

  • úplná cesta k projektu (príbuzné nie sú podporované),
  • cesta k súboru .xml s nastaveniami inšpekcie (zvyčajne sa nachádza v projekte v .idea/inspectionProfiles/Project_Default.xml),
  • úplná cesta k priečinku, v ktorom budú uložené súbory .xml so správami o výsledkoch analýzy.

Okrem toho sa očakáva, že

  • cesta k Java SDK bude nakonfigurovaná v IDE, inak analýza nebude fungovať. Tieto nastavenia sú obsiahnuté v konfiguračnom súbore jdk.table.xml v globálnom konfiguračnom priečinku IDEA. Samotná globálna konfigurácia IDEA sa štandardne nachádza v domovskom adresári používateľa, ale toto umiestnenie možno explicitne špecifikovať v súbore idea.properties.
  • Analyzovaný projekt musí byť platný projekt IDEA, pre ktorý budete musieť odovzdať niektoré súbory, ktoré sa zvyčajne ignorujú do správy verzií, konkrétne:
    • .idea/inspectionProfiles/Project_Default.xml — nastavenia analyzátora, budú sa samozrejme používať pri vykonávaní kontrol v kontajneri,
    • .idea/modules.xml - inak sa zobrazí chyba „Tento projekt neobsahuje žiadne moduly“,
    • .idea/misc.xml - inak sa zobrazí chyba „JDK nie je správne nakonfigurovaná pre tento projekt“,
    • *.iml-файлы — inak dostaneme chybu o nenakonfigurovanom JDK v module.

Hoci tieto súbory sú zvyčajne zahrnuté v .gitignore, neobsahujú žiadne informácie špecifické pre prostredie konkrétneho vývojára – na rozdiel napríklad od súboru workspace.xml, kde sú takéto informácie obsiahnuté, a teda nie je potrebné sa ich zaväzovať.

Samozrejmým riešením je zabaliť JDK spolu s IDEA Community Edition do kontajnera vo forme pripravenej na „nasadenie“ na analyzované projekty. Vyberme si vhodný základný kontajner a toto bude náš Dockerfile:

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

Pomocou možnosti idea.config.path prinútili sme IDEA hľadať jej globálnu konfiguráciu v priečinku /etc/idea, pretože domovský priečinok používateľa pri práci v CI je neistá vec a často úplne chýba.

Takto vyzerá súbor skopírovaný do kontajnera: jdk.table.xml, ktorý obsahuje cesty k OpenJDK nainštalovanému vo vnútri kontajnera (ako základ možno použiť podobný súbor z vášho vlastného adresára s nastaveniami IDEA):

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>

Hotový obrázok k dispozícii na Docker Hub.

Skôr než prejdeme ďalej, skontrolujte, či je v kontajneri spustený analyzátor IDEA:

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

Analýza by mala prebehnúť úspešne a v podpriečinku target/idea_inspections by sa malo objaviť množstvo súborov .xml so správami analyzátora.

Teraz už niet pochýb o tom, že analyzátor IDEA je možné spustiť samostatne v akomkoľvek prostredí CI a prejdeme k druhému kroku.

Krok 2. Zobrazte a analyzujte správu

Získanie správy vo forme súborov .xml je polovica úspechu; teraz ju musíte urobiť tak, aby bola čitateľná pre ľudí. A jeho výsledky by sa mali použiť aj v bránach kvality - logike na určenie, či prijatá zmena prejde alebo zlyhá podľa kritérií kvality.

Toto nám pomôže Plugin Jenkins Warnings NG, ktorý bol vydaný v januári 2019. S jeho príchodom sú mnohé jednotlivé pluginy na prácu s výsledkami statickej analýzy v Jenkins (CheckStyle, FindBugs, PMD atď.) teraz označené ako zastarané.

Plugin sa skladá z dvoch častí:

  • početné zberače správ analyzátora (úplný zoznam zahŕňa všetky analyzátory známe vede od AcuCobol po ZPT Lint),
  • jediný prehliadač prehľadov pre všetky z nich.

Zoznam vecí, ktoré môže Warnings NG analyzovať, zahŕňa varovania z kompilátora Java a varovania z protokolov vykonávania Maven: hoci sú neustále viditeľné, zriedka sa špecificky analyzujú. Správy IntelliJ IDEA sú tiež zahrnuté v zozname uznávaných formátov.

Keďže je doplnok nový, spočiatku dobre spolupracuje s Jenkins Pipeline. Krok zostavenia s jeho účasťou bude vyzerať takto (doplnku jednoducho povieme, aký formát správy rozpoznávame a aké súbory by sa mali skenovať):

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

Rozhranie prehľadu vyzerá takto:

Spustenie inšpekcií IntelliJ IDEA na Jenkinsovi

Pohodlne je toto rozhranie univerzálne pre všetky uznávané analyzátory. Obsahuje interaktívny diagram rozloženia nálezov podľa kategórií a graf dynamiky zmien počtu nálezov. Môžete vykonať rýchle vyhľadávanie v mriežke v spodnej časti stránky. Jediné, čo pri kontrolách IDEA nefungovalo korektne, bola možnosť prezerania kódu priamo v Jenkins (aj keď pri iných prehľadoch, napríklad Checkstyle, to tento plugin dokáže krásne). Zdá sa, že ide o chybu v analyzátore správ IDEA, ktorú treba opraviť.

Medzi funkcie Warnings NG patrí schopnosť agregovať zistenia z rôznych zdrojov do jednej správy a naprogramovať Quality Gates, vrátane „rachty“ pre referenčnú zostavu. K dispozícii je určitá programová dokumentácia spoločnosti Quality Gates tu - nie je však úplný a musíte sa pozrieť na zdrojový kód. Na druhej strane, pre úplnú kontrolu nad tým, čo sa deje, môže byť „račňa“ implementovaná nezávisle (pozri môj predchádzajúci príspevok o tejto téme).

Záver

Pred začatím prípravy tohto materiálu som sa rozhodol pátrať: písal už niekto na túto tému na Habrého? Len som našiel rozhovor 2017 с Lanykde hovorí:

Pokiaľ viem, neexistuje žiadna integrácia s Jenkinsom alebo doplnkom pre maven […] V zásade by sa každý nadšenec mohol spriateliť s IDEA Community Edition a Jenkins, mnohí by z toho len profitovali.

O dva roky neskôr tu máme doplnok Warnings NG a toto priateľstvo sa konečne naplnilo!

Zdroj: hab.com

Pridať komentár