IntelliJ IDEA har i dag den mest avancerede statiske Java kodeanalyse, som klart har overgået "veteraner" såsom og . Dens mange "inspektioner" tjekker koden fra forskellige vinkler, lige fra kodestil til typiske fejl.
Men indtil videre vises analysens resultater kun i udviklerens lokale IDE-grænseflade, hvilket gør dem mindre nyttige i udviklingsprocessen. Statisk analyse som det første skridt i byggeprocessen, og dens resultater bør definere quality gates, hvor bygningen skal fejle, hvis quality gates ikke er bestået. Det er kendt, at TeamCity CI er integreret med IDEA. Men selv hvis du ikke bruger TeamCity, kan du nemt forsøge at køre inspektioner fra IDEA på enhver anden CI-server. Lad os se på, hvordan det kan gøres ved hjælp af IDEA Community Edition, Jenkins og Warnings NG plugin.
Trin 1. Kør analysen i en container og få rapporten
I starten kan ideen om at køre IDE (desktopapplikation!) inde i en CI-system uden grafisk interface virke tvivlsom og meget besværlig. Heldigvis har udviklerne af IDEA givet mulighed for at køre og fra kommandolinjen. Og for at køre IDEA i denne tilstand kræves der ikke en grafisk subsystem, og disse opgaver kan udføres på servere med tekstbaseret shell.
Inspektionerne startes ved hjælp af scriptet bin/inspect.sh fra installationsmappen af IDEA. Parametre, der kræves, inkluderer:
- den fulde sti til projektet (relative stier understøttes ikke),
- stien til .xml-filen med inspektionsindstillinger (som normalt findes inde i projektet i .idea/inspectionProfiles/Project_Default.xml),
- den fulde sti til den mappe, hvor .xml-filerne med rapporter om analysemulighederne skal placeres.
Derudover forventes det, at
- IDE'en har stien til Java SDK konfigureret, ellers vil analysen ikke fungere. Disse indstillinger findes i konfigurationsfilen
jdk.table.xmli IDEA's globale konfigurationsmappe. Den globale konfiguration for IDEA ligger som standard i brugerens hjemmemappe, men denne placering i filenidea.properties. - det analyserede projekt skal være et gyldigt IDEA-projekt, hvilket betyder, at nogle filer, som normalt ignoreres, skal committes til versionskontrol, nemlig:
.idea/inspectionProfiles/Project_Default.xml— indstillinger for analysatoren, de vil bestemt blive brugt ved kørsel af inspektioner i containeren,.idea/modules.xml— ellers får vi fejlen ‘Dette projekt indeholder ingen moduler’,.idea/misc.xml— ellers får vi fejlen ‘JDK'en er ikke korrekt konfigureret til dette projekt’,*.iml-filer— ellers får vi en fejl om ikke-konfigureret JDK i modulet.
Selvom disse filer normalt inkluderer .gitignore, indeholder de ingen specifik information for den enkelte udvikler — i modsætning til for eksempel filen workspace.xml, hvor sådan information netop er indeholdt, og derfor skal vi ikke committe den.
Det giver mening at pakke JDK sammen med IDEA Community Edition ind i en container i en form, der er klar til at blive 'sat på' de analyserede projekter. Lad os vælge en passende basiskontainer, og her er hvordan vores Dockerfile vil se ud:
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 -v2Ved hjælp af indstillingen idea.config.path fik vi IDEA til at søge sin globale konfiguration i mappen /etc/idea, da brugernes hjemmemappe i CI-miljøet er en usikker størrelse og ofte slet ikke eksisterer.
Sådan ser den fil ud, der kopieres ind i containeren jdk.table.xml, hvor stierne til OpenJDK, som er installeret inde i containeren, er angivet (en lignende fil fra din egen IDEA-indstillingsmappe kan bruges som grundlag):
jdk.table.xml
Billedet i sin færdige form .
Før vi går videre, lad os kontrollere, at IDEA-analyzatoren starter i containeren:
docker run --rm -v :/var/project inponomarev/intellij-idea-analyzerAnalysen skal gennemføres med succes, og der skal oprettes mange .xml-filer med rapporter fra analysatoren i undermappen target/idea_inspections.
Nu er der ikke længere nogen tvivl om, at IDEA-analyzatoren kan køres offline i et hvilket som helst CI-miljø, og vi går videre til trin to.
Trin 2. Vis og analyser rapporten
At få rapporten i form af .xml-filer er halvdelen af arbejdet, nu skal den gøres læsbar for mennesker. Desuden skal resultaterne bruges i quality gates - logikken for, om en modtaget ændring opfylder kvalitetskriterierne eller ej.
Dette vil hjælpe os med , hvis lancering fandt sted i januar 2019. Med dens ankomst er mange separate plugins til arbejde med resultater fra statisk analyse i Jenkins (CheckStyle, FindBugs, PMD mv.) nu markeret som forældede (obsolete).
Plugin’et består af to dele:
- mange samlere af analyserapporter ( som inkluderer alle kendte analyser fra AcuCobol til ZPT Lint),
- én fælles rapportvisning for dem alle.
Blandt det, Warnings NG kan analysere, er også Java-kompilatorens advarsler og advarsler fra Maven-udførselens logs: selvom de konstant er i fokus, bliver de sjældent analyseret målrettet. Rapporterne fra IntelliJ IDEA er også blandt de genkendte formater.
Da pluggin’et er nyt, interagerer det fra starten godt med Jenkins Pipeline. Byggeprocessen med det involverede vil se således ud (vi siger blot til plugin’et, hvilken rapportformat vi genkender og hvilke filer der skal scannes):
stage ('Statisk analyse'){
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')]
)
}Rapportens grænseflade ser således ud:

Det er praktisk, at denne grænseflade er universel for alle genkendte analyser. Den indeholder et interaktivt diagram over fordelingen af fund efter kategori og en graf over ændringerne i antal fund over tid. I bunden af siden kan der foretages hurtige søgninger. Det eneste, der ikke fungerede korrekt for IDEA-inspektionerne, er muligheden for at browse koden direkte i Jenkins (selvom denne plugin klarer sig flot for andre rapporter som Checkstyle). Det synes at være en bug i parseren for IDEA-rapporter, som skal rettes.
Blandt Warnings NG’s funktioner er muligheden for at aggregere fund fra forskellige kilder i én rapport og programmere Quality Gates, herunder en „lås“ på den referente bygning. Nogen dokumentation til programmering af Quality Gates er tilgængelig. — dog, den er ikke fuld, og man er nødt til at se på kildeteksten. På den anden side kan man implementere en "ratchet" selv for fuld kontrol over processen (se min til dette emne).
Konklusion
Før jeg begyndte at forberede dette materiale, besluttede jeg at søge efter, om nogen allerede havde skrevet om dette emne på Habr? Jeg fandt kun med , hvor han siger:
Så vidt jeg ved, findes der ingen integration med Jenkins eller maven-plugin […] I princippet kunne enhver entusiast forbinde IDEA Community Edition og Jenkins, mange ville kun få fordel af det.
Så hvad: efter to år har vi Warnings NG Plugin, og endelig er dette venskab blevet en realitet!
Kilde: habr.com
