Pokrećemo IntelliJ IDEA inspekcije na Jenkinsu

IntelliJ IDEA danas ima najnapredniji statički analizator koda za Java, ostavljajući daleko iza sebe takve 'veterane' kao što su Checkstyle i Spotbugs. Njen brojni 'inspekcije' provjerava kod u raznim aspektima, od stilskog kodiranja do karakterističnih grešaka.

Međutim, rezultati analize se trenutno prikazuju samo u lokalnom sučelju IDE-a programera, što ih čini malo korisnima za proces razvoja. Statička analiza mora se izvesti kao prvi korak u procesu izgradnje, njeni rezultati trebaju određivati quality gates, a izgradnja bi trebala propasti ako quality gates nisu prošli. Poznato je da je TeamCity CI integriran s IDEA-om. Ali čak i ako ne koristite TeamCity, možete pokušati pokrenuti IDEA inspekcije na bilo kojem drugom CI poslužitelju. Predlažem da pogledamo kako to možete učiniti koristeći IDEA Community Edition, Jenkins i Warnings NG plugin.

Korak 1. Pokrećemo analizu u kontejneru i dobivamo izvještaj

U početku se može činiti sumnjivim i vrlo napornim pokretati IDE (desktop aplikaciju!) unutar CI sustava koji nema grafičko sučelje. Srećom, programeri IDEA-e omogućili su pokretanje formatiranja koda i inspekcija iz naredbenog retka. Osim toga, za pokretanje IDEA-e u tom režimu nije potrebna grafička podpora i te se zadatke može izvršavati na poslužiteljima s tekstualnim okruženjem.

Pokretanje inspekcija vrši se putem skripte bin/inspect.sh iz instalacijske direktorije IDEA-e. Kao parametri su potrebni:

  • puni put do projekta (relativni se ne podržavaju),
  • put do .xml datoteke s postavkama inspekcija (obično se nalazi unutar projekta u .idea/inspectionProfiles/Project_Default.xml),
  • puni put do mape u koju će biti pohranjene .xml datoteke s izvještajima o rezultatima analize.

Osim toga, očekuje se da

  • u IDE-u bude postavljen put do Java SDK, inače analiza neće raditi. Ove postavke nalaze se u konfiguracijskoj datoteci jdk.table.xml u mapi globalne konfiguracije IDEA-e. Sama globalna konfiguracija IDEA-e po defaultu se nalazi u korisnikovom domaćem direktoriju, ali ova lokacija može biti izričito definirana u datoteci idea.properties.
  • analizirani projekt mora biti valjan IDEA projekt, za što će na kontrolu verzija biti potrebno dodati neke datoteke koje se obično ignoriraju, a to su:
    • .idea/inspectionProfiles/Project_Default.xml — postavke analizatora, koje će se očito koristiti pri pokretanju inspekcija u kontejneru,
    • .idea/modules.xml — inače ćemo dobiti grešku ‘Ovaj projekt ne sadrži module’,
    • .idea/misc.xml — inače ćemo dobiti grešku ‘JDK nije ispravno konfiguriran za ovaj projekt’,
    • *.iml-datoteke — inače ćemo dobiti grešku o neispravnom JDK-u u modulu.

Iako obično ove datoteke uključuju u .gitignore, one ne sadrže nikakve specifične informacije za okolinu konkretnog programera — za razliku od, na primjer, datoteke workspace.xml, gdje se takve informacije nalaze, i zato ih ne treba dodavati.

Nadamo se da će rješenje biti pakiranje JDK-a zajedno s IDEA Community Edition u kontejner u obliku spremnom za „napad” na analizirane projekte. Izabrat ćemo odgovarajući osnovni kontejner, i evo kakav će biti 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

Pomoću opcije idea.config.path natjerali smo IDEA da potraži svoju globalnu konfiguraciju u mapi /etc/idea, jer je domaća mapa korisnika u uvjetima rada u CI — stvar neodređena i često potpuno odsutna.

Ovako izgleda datoteka koja se kopira u kontejner, jdk.table.xmlu kojoj su navedene staze do OpenJDK-a, instaliranog unutar kontejnera (kao osnovu se može uzeti slična datoteka iz vlastite direktorije s postavkama IDEA):

jdk.table.xml

Slika u gotovom obliku dostupan na Docker Hubu.

Prije nego što nastavimo, provjerimo pokretanje analizirača IDEA unutar kontejnera:

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

Analiza bi trebala uspješno završiti, a u podmapu target/idea_inspections trebaju se pojaviti brojni .xml datoteke s izvješćem analize.

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

Korak 2. Prikazujemo i analiziramo izvješće

Dobivanje izvještaja u obliku .xml datoteka je tek pola posla, sada ga treba učiniti čitljivim za ljude. Također, njegovi rezultati trebaju biti korišteni u quality gates — logici određivanja da li prijedlog izmjene zadovoljava kriterije kvalitete ili ne.

U tome će nam pomoći Jenkins Warnings NG Plugin, čije je izdanje bilo u siječnju 2019. godine. S njegovim dolaskom, mnogi pojedinačni dodaci za rad s rezultatima statičke analize u Jenkinsu (CheckStyle, FindBugs, PMD itd.) sada su označeni kao zastarjeli (obsolete).

Plugin se sastoji od dva dijela:

  • brojnih sabirnih alata analizatora (potpuni popis uključuje sve poznate analizatore od AcuCobol do ZPT Lint),
  • jedinstvenog preglednika izvještaja za sve njih.

Na popisu onoga što Warnings NG može analizirati su i upozorenja Java kompajlera te upozorenja iz logova Maven izvršenja: iako su stalno na oku, rijetko ih se analizira ciljno. Izvještaji IntelliJ IDEA također su uključeni u popis prepoznatih formata.

Budući da je plugin nov, počeo je dobro surađivati sa Jenkins Pipeline-om. Korak izgradnje s njegovim sudjelovanjem izgledat će ovako (jednostavno govorimo pluginu koji format izvještaja prepoznajemo i koje datoteke trebamo skenirati):

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

Izgled izvještaja je sljedeći:

Pokrećemo IntelliJ IDEA inspekcije na Jenkinsu

Pogodno je da je ovaj sučelje univerzalno za sve prepoznate analizatore. Sadrži interaktivni dijagram raspodjele nalaza po kategorijama i grafikon dinamike promjene broja nalaza. U donjem gridu stranice moguće je izvršiti brzu pretragu. Jedina stvar koja za inspekcije IDEA nije ispravno funkcionirala je mogućnost pregledavanja koda neposredno u Jenkinsu (iako za druge izvještaje, kao što je Checkstyle, ovaj plugin to radi uredno). Čini se da je to bug parsera izvještaja IDEA koji treba popraviti.

Među mogućnostima Warnings NG je mogućnost agregiranja nalaza iz različitih izvora u jedan izvještaj i programiranje Quality Gates, uključujući „zupčanik“ prema referentnoj verziji. Određena dokumentacija o programiranju Quality Gates je dostupna. ovdje — međutim, nije potpuna i potrebno je pogledati u izvorne kodove. S druge strane, za potpunu kontrolu nad procesom, "ratchet" se može implementirati i samostalno (vidi moj prethodni post na ovu temu).

Zaključak

Prije nego što sam počeo pripremati ovaj materijal, odlučio sam potražiti: je li već netko pisao o ovoj temi na Habr-u? Naišao sam samo na intervju iz 2017. godine s lany, gdje on kaže:

Koliko mi je poznato, nema integracije s Jenkinsom ili maven pluginom […] U principu, svaki entuzijast mogao bi povezati IDEA Community Edition i Jenkins, mnogi bi od toga imali koristi.

Pa, nakon dvije godine imamo Warnings NG Plugin, i konačno se ta suradnja ostvarila!

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster