Zagnati inšpekcije IntelliJ IDEA na Jenkins

IntelliJ IDEA danes razpolaga z najsodobnejšim statičnim analizatorjem kode Java, ki svojim zmožnostim pušča daleč za seboj takšne "veterane" kot Checkstyle in Spotbugs. Njene številne "inšpekcije" preverjajo kodo v različnih vidikih, od stila kodiranja do značilnih napak.

Vendar pa trenutni rezultati analize prikazani le v lokalnem vmesniku IDE razvijalca, zato so zelo omejene za proces razvoja. Statično analizo je treba izvajati kot prvi korak v gradbenem konveju, njeni rezultati morajo določati quality gates, gradnja pa se mora neuspešno končati, če quality gates niso doseženi. Znan je podatek, da je TeamCity CI integriran z IDEA. Toda tudi če ne uporabljate TeamCity, lahko preizkusite zagon inšpekcij IDEA na katerem koli drugem CI strežniku. Predlagam, da si ogledate, kako to lahko storite z uporabo IDEA Community Edition, Jenkins in Warnings NG plugin.

Korak 1. Začnemo analizo v vsebniku in dobimo poročilo

Sprva se lahko zdi dvomljivo in zelo zapleteno, da bi zagnali IDE (namizna aplikacija!) znotraj CI sistema, ki nima grafičnega vmesnika. Na srečo so razvijalci IDEA omogočili zagon formatiranje kode in inšpekcij iz ukazne vrstice. Za zagon IDEA v tem načinu ni potrebna grafična podpora in te naloge lahko izvaja na strežnikih s tekstovnim vmesnikom.

Zagon inšpekcij se izvede s pomočjo skripta bin/inspect.sh iz namestitvene mape IDEA. Potrebni so naslednji parametri:

  • polna pot do projekta (relativne poti niso podprte),
  • pot do .xml datoteke s nastavitvami inšpekcij (običajno se nahaja znotraj projekta v .idea/inspectionProfiles/Project_Default.xml),
  • polna pot do mape, v katero bodo shranjene .xml datoteke z rezultati analize.

Poleg tega se pričakuje, da

  • bo v IDE nastavljena pot do Java SDK, sicer analiza ne bo delovala. Te nastavitve so vsebujo v konfiguracijski datoteki jdk.table.xml v mapi globalne konfiguracije IDEA. Sama globalna konfiguracija IDEA je privzeto v uporabniški domači mapi, vendar se lahko to mesto izrecno določi в файле idea.properties.
  • analizirani projekt mora biti veljaven projekt IDEA, kar pomeni, da bo treba na nadzoru različic vnesti nekatere datoteke, ki se običajno ignorirajo, in sicer:
    • .idea/inspectionProfiles/Project_Default.xml — nastavitve analizatorja, te bodo zagotovo uporabljene pri zagonu pregledov v zabojniku,
    • .idea/modules.xml — sicer bomo prejeli napako 'Ta projekt ne vsebuje modulov',
    • .idea/misc.xml — sicer bomo prejeli napako 'JDK ni pravilno konfiguriran za ta projekt',
    • *.iml datoteke — sicer bomo prejeli napako o nepravilno nastavljenem JDK v modulu.

Čeprav običajno te datoteke vključujejo .gitignore, ne vsebujejo nobenih specifičnih informacij o okolju konkretnega razvijalca — v nasprotju z, na primer, datoteko workspace.xml, kjer so take informacije pravzaprav vključene, zato je ne smemo dovoliti pri commitiranju.

Samo od sebe se ponuja rešitev, da pakiramo JDK skupaj z IDEA Community Edition v zabojnik v obliki, pripravljeni za 'smeti' na analizirane projekte. Izberimo ustrezen osnovni zabojnik, in tukaj je, kakšen bo naš 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

S pomočjo možnosti idea.config.path smo prisilili IDEA, da išče svojo globalno konfiguracijo v mapi /etc/idea, saj je domača mapa uporabnika v pogojih dela v CI — stvar negotova in pogosto sploh ni prisotna.

Tako izgleda datoteka, kopirana v zabojnik, jdk.table.xml, v kateri so zapisane poti do OpenJDK, nameščenega znotraj zabojnika (za osnovo je lahko vzeta podobna datoteka iz vaše lastne mape s konfiguracijami IDEA):

jdk.table.xml

Slika u gotovom obliku dostupna na Docker Hubu.

Prije nego što krenemo dalje, provjerimo pokretanje IDEA analizer-a u kontejneru:

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

Analiza bi trebala uspješno završiti, a u podmapi target/idea_inspections trebali bi se pojaviti brojni .xml datoteke s izvještajima analize.

Sada više nema sumnje da se IDEA analizer može pokrenuti u offline režimu u bilo kojem CI okruženju, i prelazimo na drugi korak.

Korak 2. Prikazujemo i analiziramo izvještaj

Dobili ste izveštaj u obliku .xml datoteka — to je samo deo posla; sada ga treba učiniti čitljivim za ljude. Takođe, njegovi rezultati moraju se koristiti u kvalitetnim stepenicama — logici za određivanje da li prihvaćena izmena ispunjava kriterijume kvaliteta.

U tome će nam pomoći Jenkins Warnings NG Plugin, čije je izdanje obavljeno u januaru 2019. godine. Sa njegovim dolaskom, mnogi pojedinačni dodaci za rad sa rezultatima statičke analize u Jenkins-u (CheckStyle, FindBugs, PMD itd.) sada su označeni kao zastareli (obsolete).

Plugin se sastoji od dva dela:

  • brojnih skupljača poruka analizatora (popoln seznam uključuje sve poznate analizatore od AcuCobol do ZPT Lint),
  • jedinstvenog preglednika izveštaja za sve njih.

Na spisku onoga što Warnings NG može analizirati su, između ostalog, upozorenja Java kompajlera i upozorenja iz logova Maven izvršenja: iako su stalno na vidiku, retko se posebno analiziraju. Izveštaji IntelliJ IDEA takođe ulaze u niz prepoznatih formata.

S obzirom na to da je plugin nov, od samog početka dobro interaguje sa Jenkins Pipeline-om. Korak izgradnje sa njegovim učešćem će izgledati ovako (samo kažemo pluginu koji format izveštaja prepoznajemo i koje datoteke treba da skeniramo):

stage ('Statistička analiza'){
    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')]
    )
}

Interfejs izveštaja izgleda ovako:

Zagnati inšpekcije IntelliJ IDEA na Jenkins

Praktično je što je ovaj interfejs univerzalan za sve prepoznate analizatore. Sadrži interaktivni dijagram raspodele nalaza po kategorijama i grafikon dinamike promena u broju nalaza. U donjem delu stranice može se izvesti brza pretraga. Jedino što kod inspekcija IDEA nije pravilno radilo je mogućnost pregledavanja koda direktno u Jenkins-u (iako za druge izveštaje, poput Checkstyle-a, ovaj plugin to lepo radi). Izgleda da je ovo greška parsera izveštaja IDEA, koju treba ispraviti.

Među mogućnostima Warnings NG je i mogućnost aggregracije nalaza iz različitih izvora u jednom izveštaju i programiranje kvalitetnih stepenica, uključujući — 'zupčanike' prema referentnoj gradnji. Neki materijali o programiranju kvalitetnih stepenica su dostupni. ovde Vendar pa ni popolna in je treba pogledati v izvorno kodo. Po drugi strani pa lahko za popoln nadzor nad dogajanjem 'kronski mehanizem' implementirate tudi sami (glej moj prejšnji zapis o tej temi).

Zaključek

Preden sem začel pripravljati ta material, sem se odločil, da preverim, ali je kdo že pisal o tej temi na Habré? Našel sem le intervju iz leta 2017 z lany, kjer pravi:

Kolikor vem, integracije z Jenkinsom ali maven vtičnikom ni […] Na splošno bi si lahko vsak navdušenec predstavljal povezavo IDEA Community Edition in Jenkins, mnogi bi od tega samo imeli korist.

Kaj pa: po dveh letih imamo Warnings NG Plugin in končno se je ta prijateljstvo uresničilo!

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster