Spouštíme inspekce IntelliJ IDEA na Jenkins

IntelliJ IDEA dnes disponuje nejpokročilejším statickým analyzátorem kódu Java, který daleko překonává starší "veterány", jako jsou Checkstyle a Spotbugs. Její četné „inspekce“ kontrolují kód z různých hledisek, od stylu kódování po charakteristické chyby.

Nicméně, zatímco výsledky analýzy jsou zobrazovány pouze v místním rozhraní IDE vývojáře, mají malou hodnotu pro proces vývoje. Statická analýza musí být prováděna jako první krok v konvayi sestavení, její výsledky by měly určovat quality gates, a build by měl selhat, pokud quality gates nejsou splněny. Je známo, že TeamCity CI je integrován s IDEA. Ale i pokud nepoužíváte TeamCity, můžete zkusit spustit inspekce IDEA na jakémkoli jiném CI serveru. Navrhuji se podívat, jak to lze udělat pomocí IDEA Community Edition, Jenkins a Warnings NG pluginu.

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

Na první pohled se může zdát myšlenka spouštět IDE (desktopovou aplikaci!) uvnitř CI systému, který nemá grafické rozhraní, jako problematická a velmi obtížná. Naštěstí vývojáři IDEA poskytli možnost spouštět formátování kódu a inspekce z příkazového řádku. A pro spuštění IDEA v tomto režimu není vyžadována grafická podsystém a tyto úkoly lze vykonávat 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ími inspekcí (obvykle se nachází uvnitř projektu v .idea/inspectionProfiles/Project_Default.xml),
  • úplná cesta k adresáři, do kterého budou uloženy .xml soubory s 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. Tato nastavení jsou obsažena v konfiguračním souboru jdk.table.xml v adresáři globální konfigurace IDEA. Samotná 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ě zadáno v souboru idea.properties.
  • analyzovaný projekt musí být platným projektem IDEA, za účelem čehož bude třeba do verzovacího systému zkomitovat některé soubory, které jsou obvykle ignorovány, konkrétně:
    • .idea/inspectionProfiles/Project_Default.xml — nastavení analyzátoru, která budou zřejmě použita při spuštění inspekcí v kontejneru,
    • .idea/modules.xml — jinak obdržíme chybu 'Tento projekt neobsahuje žádné moduly',
    • .idea/misc.xml — jinak obdržíme chybu 'JDK není správně nakonfigurováno pro tento projekt',
    • *.iml-soubory — jinak obdržíme chybu o nenakonfigurovaném JDK v modulu.

Ačkoli tyto soubory obvykle zahrnují .gitignore, neobsahují žádné specifické informace o prostředí konkrétního vývojáře — na rozdíl od například souboru workspace.xml, kde takové informace naopak existují, a proto ho není potřeba commitovat.

Samozřejmostí je, že se nabízí řešení zabalit JDK spolu s IDEA Community Edition do kontejneru ve formátu připraveném pro "nájezd" na analyzované projekty. Vybereme vhodný základní kontejner, a zde je, jaký 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

Pomocí volby idea.config.path jsme přiměli IDEA hledat svou globální konfiguraci ve složce /etc/idea, protože domovská složka uživatele v podmínkách práce v CI — je věc nejistá a často zcela chybí.

Tak vypadá soubor kopírovaný do kontejneru, jdk.table.xml, ve kterém jsou uvedeny cesty k OpenJDK, které je nainstalováno uvnitř kontejneru (jako základ lze vzít podobný soubor z vaší vlastní adresáře s nastavením IDEA):

jdk.table.xml

Obrázek ve hotovém stavu je k dispozici na Docker Hub.

Než se posuneme dál, zkontrolujme spuštění analyzátoru IDEA v kontejneru:

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

Analýza by měla proběhnout úspěšně a ve složce target/idea_inspections by se měly objevit četné .xml soubory s reporty analyzátoru.

Nyní už není žádných pochyb o tom, že analyzátor IDEA může být spuštěn v offline režimu v jakémkoli CI prostředí, a přecházíme k druhému kroku.

Krok 2. Zobrazit a analyzovat report

Získání zprávy ve formátu .xml je polovina práce, nyní ji je třeba učinit čitelnou pro člověka. Dále musí být výsledky použity v quality gates — logice určování, zda přijatá změna splňuje nebo nesplňuje kvalitativní kritéria.

S tím nám pomůže Jenkins Warnings NG Plugin, jehož vydání bylo v lednu 2019. S jeho příchodem jsou nyní mnohé samostatné pluginy pro práci s výsledky statické analýzy v Jenkins (CheckStyle, FindBugs, PMD atd.) označeny jako zastaralé.

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

  • mnoha sběračů zpráv analyzátorů (úplný seznam zahrnuje všechny známé analyzátory od AcuCobol až po ZPT Lint),
  • jediného pro všechny z nich prohlížeče zpráv.

Mezi tím, co Warnings NG dokáže analyzovat, patří také varování z kompilátoru Java a varování z logů provádění Maven: ačkoli jsou stále na očích, zřídka je cíleně analyzují. Zprávy IntelliJ IDEA jsou také součástí rozpoznávaných formátů.

Jelikož je plugin nový, initialně dobře spolupracuje s Jenkins Pipeline. Krok sestavení s jeho účastí bude vypadat takto (prostě říkáme pluginu, jaký formát zprávy rozpoznáváme a které soubory by se měly prozkoumat):

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

Rozhraní zprávy vypadá takto:

Spouštíme inspekce IntelliJ IDEA na Jenkins

Je užitečné, že toto rozhraní je univerzální pro všechny rozpoznané analyzátory. Obsahuje interaktivní diagram rozdělení nálezů podle kategorií a graf dynamiky změny počtu nálezů. Ve spodní části stránky je možné provádět rychlé vyhledávání. Jediné, co u inspekcí IDEA nefungovalo správně, je možnost prohlížet kód přímo v Jenkins (i když pro jiné zprávy, například Checkstyle, tento plugin umí udělat pěkně). Zdá se, že se jedná o chybu parseru zpráv IDEA, kterou je třeba opravit.

Mezi funkcemi Warnings NG je možnost aggrovat v jednom přehledu nálezy z různých zdrojů a programovat Quality Gates, včetně — „závěs“ podle referenční sestavy. Nějaká dokumentace k programování Quality Gates je k dispozici. zde — Nicméně není úplná a je třeba se podívat do zdrojů. Na druhou stranu, pro úplnou kontrolu nad tím, co se děje, může „zámkový mechanismus“ realizovat i sám (viz můj předchozí příspěvek na toto téma).

Závěr

Před tím, než jsem začal připravovat tento materiál, jsem se rozhodl zjistit, zda už o tomto někdo nepsal na Habru. Našel jsem pouze rozhovor z roku 2017 s lany, kde říká:

Pokud vím, integrace s Jenkins nebo maven pluginem nebyla [...] V zásadě by jakýkoli nadšenec mohl propojit IDEA Community Edition a Jenkins, mnozí by z toho jen profitovali.

Co říct: Po dvou letech máme Warnings NG Plugin a konečně se toto přátelství uskutečnilo!

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster