Provádění inspekcí IntelliJ IDEA na Jenkinsovi

IntelliJ IDEA má dnes nejpokročilejší statický analyzátor kódu Java, který svými schopnostmi nechává daleko za sebou takové „veterány“, jako jsou Kontrolní styl и Spotbugs. Jeho četné „inspekce“ kontrolují kód v různých aspektech, od stylu kódování až po typické chyby.

Dokud se však výsledky analýzy zobrazují pouze v místním rozhraní vývojářského vývojového prostředí, jsou pro proces vývoje málo užitečné. Statická analýza musí být splněny Jako první krok procesu sestavení by jeho výsledky měly definovat kvalitativní brány a sestavení by mělo selhat, pokud nejsou brány kvality splněny. Je známo, že TeamCity CI je integrován s IDEA. Ale i když TeamCity nepoužíváte, můžete snadno zkusit spustit inspekce IDEA na jakémkoli jiném serveru CI. Navrhuji, abyste viděli, jak to lze provést pomocí IDEA Community Edition, pluginu Jenkins and Warnings NG.

Krok 1. Spusťte analýzu v kontejneru a získejte zprávu

Zpočátku se myšlenka spuštění IDE (desktopové aplikace!) uvnitř systému CI, který nemá grafické rozhraní, může zdát pochybná a velmi problematická. Naštěstí vývojáři IDEA poskytli možnost spuštění formátování kódu и inspekce z příkazového řádku. Navíc ke spuštění IDEA v tomto režimu není nutný grafický subsystém a tyto úlohy lze provádět na serverech s textovým shellem.

Kontroly se spouštějí pomocí skriptu bin/inspect.sh z instalačního adresáře IDEA. Požadované parametry jsou:

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

Navíc se očekává, že

  • cesta k Java SDK bude nakonfigurována v IDE, jinak analýza nebude fungovat. Tato nastavení jsou obsažena v konfiguračním souboru jdk.table.xml v globální konfigurační složce IDEA. Samotná globální konfigurace IDEA je standardně umístěna v domovském adresáři uživatele, ale toto umístění lze explicitně specifikovat v souboru idea.properties.
  • Analyzovaný projekt musí být platný projekt IDEA, pro který budete muset odevzdat některé soubory, které jsou obvykle ignorovány do správy verzí, konkrétně:
    • .idea/inspectionProfiles/Project_Default.xml — nastavení analyzátoru, budou samozřejmě použita při provádění kontrol v kontejneru,
    • .idea/modules.xml - jinak se zobrazí chyba „Tento projekt neobsahuje žádné moduly“,
    • .idea/misc.xml - jinak se zobrazí chyba 'JDK není správně nakonfigurován pro tento projekt',
    • *.iml-файлы — jinak dostaneme chybu o nenakonfigurovaném JDK v modulu.

Ačkoli jsou tyto soubory obvykle součástí .gitignore, neobsahují žádné informace specifické pro prostředí konkrétního vývojáře – na rozdíl např. od souboru workspace.xml, kde jsou takové informace obsaženy, a není tedy třeba se jich zavazovat.

Samozřejmým řešením je zabalit JDK spolu s IDEA Community Edition do kontejneru ve formě připravené k „nasazení“ na analyzované projekty. Vyberme si vhodný základní kontejner a takový 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

Pomocí možnosti idea.config.path donutili jsme IDEA hledat svou globální konfiguraci ve složce /etc/idea, protože domovská složka uživatele při práci v CI je nejistá a často zcela chybí.

Takto vypadá soubor zkopírovaný do kontejneru: jdk.table.xml, který obsahuje cesty k OpenJDK nainstalovanému uvnitř kontejneru (jako základ lze vzít podobný soubor z vašeho vlastního adresáře s nastavením 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ázek k dispozici na Docker Hub.

Než budeme pokračovat, zkontrolujte, zda v kontejneru běží analyzátor IDEA:

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

Analýza by měla proběhnout úspěšně a v podsložce target/idea_inspections by se mělo objevit mnoho souborů .xml se zprávami analyzátoru.

Nyní již není pochyb o tom, že analyzátor IDEA lze provozovat samostatně v jakémkoli prostředí CI, a přejdeme k druhému kroku.

Krok 2. Zobrazte a analyzujte zprávu

Získání zprávy ve formě souborů .xml je polovina úspěchu, nyní je třeba, aby byla čitelná pro člověka. A také jeho výsledky by měly být použity v branách kvality - logice pro určení, zda přijatá změna projde nebo selže podle kritérií kvality.

To nám pomůže Plugin Jenkins Warnings NG, která vyšla v lednu 2019. S jeho příchodem je nyní mnoho jednotlivých pluginů pro práci s výsledky statické analýzy v Jenkins (CheckStyle, FindBugs, PMD atd.) označeno jako zastaralé.

Plugin se skládá ze dvou částí:

  • četné sběrače zpráv analyzátoru (Úplný seznam zahrnuje všechny analyzátory známé vědě od AcuCobol po ZPT Lint),
  • jediný prohlížeč přehledů pro všechny.

Seznam věcí, které může Warnings NG analyzovat, zahrnuje varování z kompilátoru Java a varování z protokolů provádění Maven: přestože jsou neustále viditelná, jsou zřídka specificky analyzována. Zprávy IntelliJ IDEA jsou také zahrnuty v seznamu uznávaných formátů.

Protože je plugin nový, zpočátku dobře spolupracuje s Jenkins Pipeline. Krok sestavení s jeho účastí bude vypadat takto (pluginu jednoduše řekneme, jaký formát sestavy rozpoznáváme a jaké soubory by měly být skenovány):

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

Rozhraní sestavy vypadá takto:

Provádění inspekcí IntelliJ IDEA na Jenkinsovi

Pohodlně je toto rozhraní univerzální pro všechny uznávané analyzátory. Obsahuje interaktivní schéma rozložení nálezů podle kategorií a graf dynamiky změn počtu nálezů. Můžete provést rychlé vyhledávání v mřížce v dolní části stránky. Jediné, co pro kontroly IDEA nefungovalo korektně, byla možnost procházet kód přímo v Jenkins (i když u jiných sestav, například Checkstyle, to tento plugin umí krásně). Zdá se, že se jedná o chybu v analyzátoru sestav IDEA, kterou je třeba opravit.

Mezi funkce Warnings NG patří schopnost shromáždit poznatky z různých zdrojů do jedné zprávy a naprogramovat Quality Gates, včetně „ráčny“ pro referenční sestavu. K dispozici je některá programová dokumentace Quality Gates zde - není však kompletní a musíte se podívat na zdrojový kód. Na druhou stranu, pro úplnou kontrolu nad tím, co se děje, může být „ráčna“ implementována nezávisle (viz můj předchozí příspěvek o tomto tématu).

Závěr

Než jsem začal připravovat tento materiál, rozhodl jsem se pátrat: psal už někdo na toto téma na Habrého? Jen jsem našel rozhovor 2017 с Lánykde říká:

Pokud vím, neexistuje žádná integrace s Jenkinsem nebo pluginem pro maven […] V zásadě by se každý nadšenec mohl spřátelit s IDEA Community Edition a Jenkins, mnozí by z toho měli jen prospěch.

No, o dva roky později máme Warnings NG Plugin a konečně se toto přátelství naplnilo!

Zdroj: www.habr.com

Přidat komentář