Käivitame IntelliJ IDEA kontrollid Jenkinsis

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 Checkstyle ja Spotbugs. 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 tuleb teostada 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 koodiformaadistamine ja kontrolle 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.xml IDEA globaalsete seade kaustas. IDEA globaalne seade asub vaikimisi kasutaja kodukaustas, kuid see asukoht võib olla selgelt määratud failis idea.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 -v2

Valiku 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 on saadaval Docker Hubis.

Enne edasiminekut kontrollime, kas IDEA analüsaator töötab konteineris:

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

Analüü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 Jenkins Warnings NG Plugin, 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 (täielik nimekiri 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:

Käivitame IntelliJ IDEA kontrollid Jenkinsis

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. siin — 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 eelmist postitust selle teema kohta).

Kokkuvõte

Enne kui hakkasin seda materjali valmistama, otsisin, kas keegi on juba sellest teemast Habras kirjutanud. Leidsin vaid 2017. aasta intervjuu jot lany, 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

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster