Pokrenite IntelliJ IDEA Inspections na Jenkinsu

IntelliJ IDEA danas ima najnapredniji statički Java analizator koda, koji je po svojim mogućnostima ostavio daleko iza sebe takve "veterane" kao što su provjeri stil и Spotbugs. Njegove brojne "inspekcije" provjeravaju kod u različitim aspektima, od stila kodiranja do karakterističnih grešaka.

Međutim, sve dok se rezultati analize prikazuju samo u lokalnom IDE programera, oni su od male koristi za razvojni proces. Statička analiza mora se izvršiti kao prvi korak u procesu izgradnje, njegovi rezultati moraju odrediti kapije kvaliteta, a izgradnja mora propasti ako kapije kvaliteta zakažu. Poznato je da je TeamCity CI integrisan sa IDEA-om. Ali čak i ako ne koristite TeamCity, još uvijek možete pokušati pokrenuti IDEA inspekcije na bilo kojem drugom CI serveru. Predlažem da vidimo kako se to može uraditi koristeći IDEA Community Edition, Jenkins i Warnings NG dodatak.

Korak 1. Pokrenite analizu u kontejneru i dobijte izvještaj

U početku, ideja o pokretanju IDE (desktop aplikacije!) unutar CI sistema koji nema grafičko sučelje može izgledati sumnjivo i vrlo problematično. Srećom, IDEA programeri su omogućili mogućnost pokretanja formatiranje koda и inspekcija iz komandne linije. Štaviše, za pokretanje IDEA-e u ovom režimu nije potreban grafički podsistem, a ovi zadaci se mogu obavljati na serverima sa tekstualnom ljuskom.

Inspekcije se pokreću pomoću skripte bin/inspect.sh iz IDEA instalacijskog direktorija. Potrebni parametri su:

  • puni put do projekta (srodničke nisu podržane),
  • put do .xml datoteke s postavkama inspekcije (obično se nalazi unutar projekta u .idea/inspectionProfiles/Project_Default.xml),
  • puna putanja do fascikle u kojoj će se čuvati .xml fajlovi sa izveštajima o rezultatima analize.

Osim toga, očekuje se da

  • put do Java SDK-a će biti konfigurisan u IDE-u, inače analiza neće raditi. Ove postavke su sadržane u konfiguracijskoj datoteci. jdk.table.xml u IDEA globalnoj konfiguracijskoj mapi. Sama zadana globalna IDEA konfiguracija je u korisničkom početnom direktoriju, ali na ovoj lokaciji može se eksplicitno postaviti u fajlu idea.properties.
  • analizirani projekat mora biti važeći IDEA projekat, za koji će neke datoteke koje se obično zanemaruju morati predati kontroli verzija, i to:
    • .idea/inspectionProfiles/Project_Default.xml — postavke analizatora, očito će se koristiti prilikom pokretanja inspekcija u kontejneru,
    • .idea/modules.xml - u suprotnom dobijamo grešku 'Ovaj projekat ne sadrži module',
    • .idea/misc.xml - u suprotnom dobijamo grešku 'JDK nije pravilno konfigurisan za ovaj projekat',
    • *.iml-файлы - inače ćemo dobiti grešku o nekonfigurisanom JDK u modulu.

Iako su ove datoteke obično uključene u .gitignore, ne sadrže nikakve informacije specifične za okruženje određenog programera - za razliku od, na primjer, datoteke workspace.xml, gdje su takve informacije, samo, sadržane, pa ih stoga nije potrebno upisivati.

Sam po sebi, izlaz sugeriše da se JDK zajedno sa IDEA Community Edition-om spakuje u kontejner u formi spremnom da se "postavi" na analizirane projekte. Odaberimo odgovarajući osnovni kontejner, a evo Dockerfilea koji dobijamo:

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

Koristeći opciju idea.config.path natjerali smo IDEA da traži svoju globalnu konfiguraciju u folderu /etc/idea, budući da je kućni folder korisnika u uslovima rada u CI neodređena stvar i često potpuno odsutan.

Ovako izgleda datoteka kopirana u kontejner jdk.table.xml, koji sadrži putanje do OpenJDK instaliranog unutar kontejnera (može se zasnivati ​​na sličnoj datoteci iz vašeg IDEA direktorija postavki):

jdk.table.xml

<application>
 <component name="ProjectJdkTable">
   <jdk version="2">
     <name value="1.8" />
     <type value="JavaSDK" />
     <version value="1.8" />
     <homePath value="/usr/java" />
     <roots>
       <annotationsPath>
         <root type="composite">
           <root url="jar://$APPLICATION_HOME_DIR$/lib/jdkAnnotations.jar!/" type="simple" />
         </root>
       </annotationsPath>
       <classPath>
         <root type="composite">
           <root url="jar:///usr/java/jre/lib/charsets.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/deploy.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/access-bridge-64.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/cldrdata.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/dnsns.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/jaccess.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/jfxrt.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/localedata.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/nashorn.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/sunec.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/sunjce_provider.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/sunmscapi.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/sunpkcs11.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/zipfs.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/javaws.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/jce.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/jfr.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/jfxswt.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/jsse.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/management-agent.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/plugin.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/resources.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/rt.jar!/" type="simple" />
         </root>
       </classPath>
     </roots>
     <additional />
   </jdk>
 </component>
</application>

Gotova slika dostupno na Docker Hubu.

Prije nego krenemo dalje, testirajmo pokretanje IDEA parsera u kontejneru:

docker run --rm -v <путь/к/вашему/проекту>:/var/project inponomarev/intellij-idea-analyzer

Analiza bi trebala uspješno funkcionirati, a brojne .xml datoteke sa izvještajima analizatora trebale bi se pojaviti u poddirektorijumu target/idea_inspections.

Sada više nema sumnje da IDEA analizator može biti pokrenut van mreže u bilo kojem CI okruženju, i prelazimo na drugi korak.

Korak 2. Prikaz i analiza izvještaja

Dobivanje izvještaja u obliku .xml datoteka je pola bitke, sada ga treba učiniti čitljivim za ljude. I takođe, njegove rezultate treba koristiti u kapijama kvaliteta - logiku za određivanje da li prihvaćena promena prolazi ili ne prolazi prema kriterijumima kvaliteta.

Ovo će nam pomoći Jenkins Warnings NG dodatakkoji je objavljen u januaru 2019. Sa njegovim uvođenjem, mnogi zasebni dodaci za rad sa rezultatima statičke analize u Jenkinsu (CheckStyle, FindBugs, PMD, itd.) sada su označeni kao zastarjeli.

Dodatak se sastoji od dva dela:

  • brojni sakupljači poruka analizatora (potpuni popis uključuje sve analizatore poznate nauci od AcuCobola do ZPT Lint),
  • jedan preglednik izvještaja za sve njih.

Lista stvari koje Warnings NG može raščlaniti uključuje upozorenja Java kompajlera i upozorenja iz dnevnika izvršavanja Mavena: iako su stalno na vidiku, rijetko se namjerno analiziraju. IntelliJ IDEA izvještaji su također uključeni u listu priznatih formata.

Pošto je dodatak nov, u početku dobro komunicira sa Jenkins Pipeline-om. Korak izgradnje uz njegovo učešće će izgledati ovako (samo kažemo dodatku koji format izvještaja prepoznajemo i koje datoteke treba 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')]
    )
}

Interfejs izvještaja izgleda ovako:

Pokrenite IntelliJ IDEA Inspections na Jenkinsu

Zgodno je što je ovo sučelje univerzalno za sve prepoznatljive parsere. Sadrži interaktivni grafikon distribucije nalaza po kategorijama i grafikon dinamike promjene broja nalaza. U mreži na dnu stranice možete izvršiti brzu pretragu. Jedina stvar koja nije funkcionisala ispravno za IDEA inspekcije bila je mogućnost pregledavanja koda direktno u Jenkinsu (iako za druge izveštaje, kao što je Checkstyle, ovaj dodatak to može lepo da uradi). Čini se da je greška u IDEA analizatoru izvještaja koju treba popraviti.

Među karakteristikama Warnings NG je i mogućnost objedinjavanja nalaza iz različitih izvora u jednom izveštaju i programiranje kapija kvaliteta, uključujući i čegrtaljku za referentni sklop. Dostupna je neka programska dokumentacija Quality Gatesa ovdje - međutim, nije potpuna, i morate pogledati izvor. S druge strane, za potpunu kontrolu nad onim što se dešava, „čegrtaljka“ se može implementirati nezavisno (vidi moj prethodni post o ovoj temi).

zaključak

Prije nego počnem pripremati ovaj materijal, odlučio sam pogledati: da li je neko već pisao o ovoj temi na Habréu? Samo sam našao intervju 2017 с Lanygdje piše:

Koliko ja znam, nema integracije sa Jenkinsom ili maven dodatkom [...] U principu, svaki entuzijasta bi mogao da napravi IDEA Community Edition i Jenkins prijatelje, mnogi bi od ovoga imali samo koristi.

Pa, nakon dvije godine imamo Warnings NG Plugin, i konačno se ovo prijateljstvo ostvarilo!

izvor: www.habr.com

Dodajte komentar