IntelliJ IDEA danas ima najnapredniji statički analizator koda za Java, ostavljajući daleko iza sebe takve 'veterane' kao što su i . 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 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 i 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.xmlu mapi globalne konfiguracije IDEA-e. Sama globalna konfiguracija IDEA-e po defaultu se nalazi u korisnikovom domaćem direktoriju, ali ova lokacija u datoteciidea.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 -v2Pomoć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 .
Prije nego što nastavimo, provjerimo pokretanje analizirača IDEA unutar kontejnera:
docker run --rm -v :/var/project inponomarev/intellij-idea-analyzerAnaliza 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 , č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 ( 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:

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