Spúšťame kontroly IntelliJ IDEA na Jenkins

IntelliJ IDEA má dnes nejpokročilejší statický analyzer kódu Java, který svými schopnostmi daleko předčil takové "veterány", jako jsou Checkstyle a Spotbugs. Její četné "inspekce" kontrolují kód z různých aspektů, od stylu kódování po charakteristické chyby.

Nicméně zatím výsledky analýzy zobrazují pouze v lokálním rozhraní IDE vývojáře, což pro proces vývoje není příliš užitečné. Statická analýza se musí provádět jako první krok v rámci build pipeline, jejíž výsledky by měly určovat quality gates, a build by měl selhat, pokud quality gates nebyly splněny. Je známo, že TeamCity CI je integrován s IDEA. Ale i pokud nepoužíváte TeamCity, můžete zkusit spouštět inspekce IDEA na jakémkoli jiném CI serveru. Navrhuji se podívat, jak to lze udělat pomocí IDEA Community Edition, Jenkins a pluginu Warnings NG.

Krok 1. Spustíme analýzu v kontejneru a získáme zprávu

Zprvu se může zdát nápad spouštět IDE (desktopovou aplikaci!) uvnitř CI systému bez grafického rozhraní jako pochybný a velmi pracný. Naštěstí, vývojáři IDEA poskytli možnost spouštět formátování kódu a inspekce z příkazové řádky. A pro spuštění IDEA v tomto režimu není třeba grafická podsystém a tyto úkoly lze provádět na serverech s textovým rozhraním.

Spuštění inspekcí se provádí pomocí skriptu bin/inspect.sh z instalačního adresáře IDEA. Jako parametry jsou vyžadovány:

  • úplná cesta k projektu (relativní cesty nejsou podporovány),
  • cesta k .xml souboru s nastavením inspekcí (obvykle se nachází v projektu v .idea/inspectionProfiles/Project_Default.xml),
  • úplná cesta k složce, do které budou uloženy .xml soubory se zprávami o výsledcích analýzy.

Kromě toho se očekává, že

  • v IDE bude nastavená cesta k Java SDK, jinak analýza nebude fungovat. Tyto nastavení jsou obsažena v konfiguračním souboru jdk.table.xml ve složce globální konfigurace IDEA. Globální konfigurace IDEA je ve výchozím nastavení umístěna v domovském adresáři uživatele, ale toto umístění může být explicitně určeno v súbore idea.properties.
  • analizovaný projekt musí být platným projektem IDEA, což znamená, že do verzovacích systémů bude třeba commitnout některé soubory, které se obvykle ignorují, a to konkrétně:
    • .idea/inspectionProfiles/Project_Default.xml — nastavenia analyzátora, ktoré sa určite použijú pri spustení kontrol v kontejnery,
    • .idea/modules.xml — inak dostaneme chybu 'Tento projekt neobsahuje žiadne moduly',
    • .idea/misc.xml — inak dostaneme chybu 'JDK nie je správne nakonfigurované pre tento projekt',
    • *.iml súbory — inak dostaneme chybu o nesprávne nakonfigurovanom JDK v module.

Hoci tieto súbory zvyčajne zahŕňajú .gitignore, neobsahujú žiadne špecifické informácie pre prostredie konkrétneho vývojára — na rozdiel od, napríklad, súboru workspace.xml, kde sa takéto informácie nachádzajú, a preto ho nie je potrebné commitovať.

Samozrejme, vynára sa nápad zabaliť JDK spolu s IDEA Community Edition do kontajnera v podobe pripraveného na "nasadenie" na analyzované projekty. Vyberieme vhodný základný kontajner, a tu je, aký Dockerfile dostaneme:

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 sme prinútili IDEA hľadať svoju globálnu konfiguráciu v priečinku /etc/idea, pretože domáca zložka používateľa v podmienkach CI je vec nejasná a často vôbec neexistuje.

Takto vyzerá súbor kopírovaný do kontajnera jdk.table.xml, v ktorom sú uvedené cesty k OpenJDK, ktorá je nainštalovaná vo vnútri kontajnera (môže byť zohľadnený podobný súbor z vašej vlastnej adresáre so nastaveniami IDEA):

jdk.table.xml

Obraz v hotovom stave je k dispozícii na Docker Hub.

Predtým, než pokračujeme ďalej, skontrolujme spustenie analyzátora IDEA v kontajneri:

docker run --rm -v :/var/project inponomarev/intellij-idea-analyzer

Analýza by mala úspešne prebehnúť a v podpriečinku target/idea_inspections by sa mali objaviť viaceré .xml súbory s správami analyzátora.

Teraz už niet pochýb o tom, že analyzátor IDEA môže byť spustený offline v akomkoľvek CI prostredí a prechádzame k druhému kroku.

Krok 2. Zobrazenie a analýza správy

Získanie správy vo formáte .xml je len polovičná práca, teraz ju treba urobiť čitateľnou pre človeka. A výsledky by sa mali použiť v kvalitatívnych bránach – logike určovania toho, či zmeny splnili kritériá kvality.

S tým nám pomôže Jenkins Warnings NG Plugin, ktorého vydanie sa uskutočnilo v januári 2019. S jeho príchodom sú mnohé samostatné pluginy na prácu s výsledkami statickej analýzy v Jenkins (CheckStyle, FindBugs, PMD a pod.) teraz označené ako zastarané.

Plugin sa skladá z dvoch častí:

  • mnohých zberačov správ analyzátorov (úplný zoznam obsahuje všetky známe analyzátory od AcuCobol po ZPT Lint),
  • a jedného pre všetkých prehliadača správ.

V zozname toho, čo dokáže Warnings NG analyzovať, sa nachádzajú aj varovania Java kompilátora a varovania z logov Maven: hoci sú stále na očiach, zriedkakedy sa na ne cielené analyzuje. Správy IntelliJ IDEA sú tiež zahrnuté v zozname podporovaných formátov.

Keďže je plugin nový, pôvodne dobre interaguje s Jenkins Pipeline. Krok zostavenia s jeho použitím bude vyzerať takto (jednoducho hovoríme pluginu, aký formát správy rozpoznávame a ktoré súbory by sa mali skenovať):

stage ('Statická analýza'){
    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 správy vyzerá takto:

Spúšťame kontroly IntelliJ IDEA na Jenkins

Je praktické, že toto rozhranie je univerzálne pre všetky rozpoznané analyzátory. Obsahuje interaktívny graf rozdelenia nálezov podľa kategórií a graf dynamiky zmien počtu nálezov. V dolnej časti stránky je možné vykonávať rýchle vyhľadávanie. Jediná vec, ktorá pre inšpekcie IDEA nefungovala správne - možnosť prehliadať kód priamo v Jenkins (aj keď pre iné správy, ako Checkstyle, tento plugin to dokáže spraviť pekne). Zdá sa, že je to chyba parsovania správ IDEA, ktorú treba opraviť.

Medzi možnosťami Warnings NG je aj agregovanie nálezov z rôznych zdrojov do jednej správy a programovanie Kvalitatívnych brán, vrátane „závesu“ na referenčnej verzii. Niektorá dokumentácia k programovaniu Kvalitatívnych brán je dostupná. tu — no, nie je to kompletné, a treba sa pozrieť do zdrojových kódov. Na druhej strane, pre úplnú kontrolu nad tým, čo sa deje, môže "preklápac" realizovať aj samostatne (pozri môj predchádzajúci príspevok o tejto téme).

Záver

Predtým, ako som začal pripravovať tento materiál, som sa rozhodol zistiť, či už niekto písal na túto tému na Habre. Našiel som len rozhovor z roku 2017 s lany, kde hovorí:

Pokiaľ viem, integrácia s Jenkins alebo maven pluginom neexistuje […] V podstate by každý nadšenec mohol skombinovať IDEA Community Edition a Jenkins, mnohí by z toho len získali.

Čo sa stalo: po dvoch rokoch máme Warnings NG Plugin a konečne sa toto priateľstvo realizovalo!

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster