IntelliJ IDEA má dnes nejpokročilejší statický analyzer kódu Java, který svými schopnostmi daleko předčil takové "veterány", jako jsou a . 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 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 a 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.xmlve 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í v súboreidea.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 -v2Pomocou 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 .
Predtým, než pokračujeme ďalej, skontrolujme spustenie analyzátora IDEA v kontajneri:
docker run --rm -v :/var/project inponomarev/intellij-idea-analyzerAnalý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 , 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 ( 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:

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á. — 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 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 s , 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
