IntelliJ IDEA omab täna kõige arenenumat Java koodi staatilist analüüsijat, mis on oma võimetelt kaugel maha jätnud sellised "vanad mehed" nagu ja . Selle arvukad "kontrollid" uurivad koodi erinevatest aspektidest, alates koodistiilist kuni iseloomulike tõrgeteni.
Praegu kuvatakse analüüsi tulemused ainult arendaja IDE kohalikes liidestes, seega on neist arendusprotsessis vähe kasu. Staatilist analüüsi esimese sammuna kokkuvõtete konveieris, selle tulemused peavad määrama kvaliteediküünid ja kokkuvõte peab ebaõnnestuma, kui kvaliteediküünid ei ole läbitud. On teada, et TeamCity CI on integreeritud IDEA-ga. Kuid isegi kui te ei kasuta TeamCity't, võite proovida käivitada IDEA kontrolle mis tahes muus CI-teenuses. Pakun välja, kuidas seda teha, kasutades IDEA Community Edition'i, Jenkinsit ja Warnings NG pluginat.
Samm 1. Käivitame analüüsi konteineris ja saame aruande
Esialgu võib IDE (laua rakendus!) käivitamine CI-süsteemis, mis ei omada graafilist liidest, tunduda kahtlane ja väga vaevarikas. Õnneks on IDEA arendajad pakkunud võimalust käivitada ja komandorealt. Lisaks ei nõuta IDEA käivitamiseks sellises režiimis graafilist alamsüsteemi ja need ülesanded saab täita tekstipõhistes serverites.
Kontrollide käivitamine toimub skripti abil bin/inspect.sh IDEA installeerimise kataloogist. Parameetritena on vajalikud:
- projekti täielik tee (relatiivsed ei ole toetatud),
- tee .xml-failile, milles on kontrollide seaded (tavaliselt asub see projekti sees .idea/inspectionProfiles/Project_Default.xml),
- projekti täielik tee, kuhu salvestatakse analüüsi tulemuste kohta .xml-failid.
Lisaks eeldatakse, et
- IDE-s on Java SDK tee seadistatud, muidu analüüs ei toimi. Need seaded on konfigureerimisfailis
jdk.table.xmlIDEA globaalsete seade kaustas. IDEA globaalne seade asub vaikimisi kasutaja kodukaustas, kuid see asukoht failisidea.properties. - Analüüsitav projekt peab olema valideeritud IDEA projekt, milleks tuleb versioonikontrolli süsteemi commitida mõned failid, mis tavaliselt jäetakse tähelepanuta, nimelt:
.idea/inspectionProfiles/Project_Default.xml— analüsaatori seaded, mida kasutatakse inspekteerimise käivitamisel konteineris,.idea/modules.xml— vastasel juhul saame vea ‘Selles projektis ei ole mooduleid’,.idea/misc.xml— vastasel juhul saame vea ‘JDK ei ole korralikult konfigureeritud selle projekti jaoks’,*.iml-failid— vastasel juhul saame vea, et JDK ei ole moodulis seadistatud.
Kuigi tavaliselt sisaldavad need failid .gitignore, ei sisalda nad kedagi arendaja spetsiifilist teavet — erinevalt näiteks failist workspace.xml, kus selline teave tõepoolest on, ja seetõttu ei tohiks seda commitida.
Lahendusena pakub end üles idee pakkida JDK koos IDEA Community Editioniga konteinerisse vormingus, mis on valmis ‘analüüsitavatele’ projektidele suunamiseks. Valime sobiva aluskonteineri ning siin on meie 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 -v2Valiku idea.config.path abil sundisime IDEA-d otsima oma globaalset konfiguratsiooni kaustast /etc/idea, kuna CI töötingimustes on kasutaja kodukaust määramatu ja sageli üldse puudub.
Nii näeb välja konteinerisse kopeeritud fail jdk.table.xml, milles on määratud teed OpenJDK-le, mis on konteineris installitud (selle aluseks võib olla sarnane fail teie enda IDEA seadete kaustast):
jdk.table.xml
Pilt valmiskujul .
Enne edasiminekut kontrollime, kas IDEA analüsaator töötab konteineris:
docker run --rm -v :/var/project inponomarev/intellij-idea-analyzerAnalüüs peaks olema edukas ja kaustas target/idea_inspections peaks ilmuma arvukalt .xml-failide analüüsiraporteid.
Nüüd ei ole enam kahtlust, et IDEA analüsaator saab töötada iseseisvalt igas CI-keskkonnas, ning liigume edasi teise sammu juurde.
Samm 2. Kuvame ja analüüsime raportit
XML-failina saamine on pool tööst, nüüd tuleb see muuta inimesele arusaadavaks. Lisaks peavad tulemused olema kasutatavad kvaliteediküpsiste loogikas - kvaliteedi määratlemise, kas muudetav muudatus vastab kehtestatud kriteeriumidele.
Sellega aitab meid , mille väljaandmine toimus 2019. aasta jaanuaris. Selle tulekuga on palju eraldi pluginaid, mis töötavad Jenkinsis staatilise analüüsi tulemustega (CheckStyle, FindBugs, PMD jne), nüüd märgitud vananenuks (obsolete).
Plugin koosneb kahest osast:
- mõnedest analüüsi teoste sõnumite kogujatest ( mis sisaldab kõiki tuntud teaduse analüsaatoreid alates AcuCobolist kuni ZPT Linti),
- ühe kuulutaja ühe koodi raportite jaoks.
Warnings NG analüüsikogumisse kuuluvad ka Java kompilaatori teated ja Maven'i täitmislogidest saadud teated: kuigi need on pidevalt nähtaval, analüüsitakse neid harva sihipäraselt. IntelliJ IDEA raportid kuuluvad samuti tuvastatavate formaatide hulka.
Kuna plugin on uus, töötab see algusest peale hästi koos Jenkins Pipeline'iga. Koondamisaste koos oma osavõtuga näeb välja järgmisel viisil (me ütleme lihtsalt pluginile, millist raporti formaati me tuvastame ja milliseid faile tuleks skannida):
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')]
)
}Raporti liides näeb välja selline:

Mugav on see, et see liides on universaalne kõigi tuvastatavate analüsaatorite jaoks. See sisaldab interaktiivset diagrammi leidude kategooriate ja leidude arvu dünaamika kohta. Lehe alumise osa gridis saab kiiresti otsida. Ainus, mis IDEA inspekteerimise puhul ei toiminud korralikult — on võimalus vaadata koodi otse Jenkinsis (kuigi teiste raportite, nagu Checkstyle, puhul oskab see plugin seda kenasti teha). Tundub, et see on IDEA raportite parsija tõrge, mille tuleb parandada.
Warnings NG võimalustele kuulub ka leidude kogumise võimalus erinevatest allikatest ühes raportis ja kvaliteedi värgate programmeerimine, sealhulgas - „hõrkuvite” referentside kogumise põhjal. Teatud dokumentatsioon kvaliteediküpsiste programmeerimise kohta on saadaval. — siiski, see ei ole täielik ning tuleb vaadata lähtekoodidesse. Teiselt poolt, täieliku kontrolli nimel saab "hårpow" ka iseseisvalt rakendada (vt mu selle teema kohta).
Kokkuvõte
Enne kui hakkasin seda materjali valmistama, otsisin, kas keegi on juba sellest teemast Habras kirjutanud. Leidsin vaid jot , kus ta ütleb:
Mulle teadaolevalt ei ole Jenkins'i või maven'i pluginat […] Põhimõtteliselt oleks iga entusiast saanud IDEA Community Edition'i ja Jenkins'i sõbraks teha, paljud oleksid sellest ainult kasu saanud.
Noh, kaks aastat hiljem on meil Warnings NG Plugin ja lõpuks on see sõprus teoks saanud!
Allikas: habr.com
