Käivitame IntelliJ IDEA kontrollid Jenkinsis

IntelliJ IDEA omab tänaseks kõige arenenumat Java koodi staatilist analüüsijat, jättes kaugele maha sellised „veteranid“ nagu Checkstyle ja Spotbugs. Selle arvukad „kontrollid“ kontrollivad koodi erinevatest aspektidest, alates koodistilisest stiilist kuni spetsiifiliste vigadeni.

Kuid seni, kuni analüüsi tulemusi kuvatakse vaid arendaja IDE kohalikes liidestes, on neist vähe kasu arendusprotsessis. Staatilist analüüsi on vajalik teostada esimese sammuna ehituskonveieris; selle tulemused peaksid määrama kvaliteedi väravad ning ehitus peaks ebaõnnestuma, kui kvaliteedi väravaid ei läbitud. Teadaolevalt on TeamCity CI integreeritud IDEA-ga. Kuid isegi kui te ei kasuta TeamCity't, saate katsetada IDEA kontrollide käivitamist mis tahes muus CI-serveris. Pakun välja, et vaatame, kuidas seda teha, kasutades IDEA Community Edition'i, Jenkinsit ja Warnings NG pluginat.

Samm 1. Käivitame analüüsi konteineris ja saame raporti

Alguses võib tunduda kahtlane ja vaevanõudev käivitada IDE (lauaarvuti rakendus!) CI-süsteemis, mis ei oma graafilist liidest. Õnneks on IDEA arendajad võimaldanud käivitada koodi vormindamine ja inspektsioonid käskluse real. Lisaks ei ole IDEA käitamiseks sellises režiimis vaja graafilist süsteemi ning neid ülesandeid saab täita tekstipõhistes serverites.

Inspektsioonide käivitamine toimub skripti bin/inspect.sh kaudu IDEA installatsioonikaustast. Nõutavad parameetrid on:

  • projekti täielik tee (suhtelised ei ole toetatud),
  • .xml-faili tee inspektsioonide seadetega (tavaliselt asub projektis kaustas .idea/inspectionProfiles/Project_Default.xml),
  • täielik tee kaustale, kuhu salvestatakse .xml-failid analüüsi tulemuste raportitega.

Lisaks eeldatakse, et

  • IDE-s on Java SDK tee seadistatud, muidu analüüs ei toimi. Need seaded asuvad konfiguratsioonifailis jdk.table.xml IDEA globaalsete seade kaustas. IDEA globaalne konfiguratsioon asub vaikesätete kohas kasutaja kodukaustas, kuid see asukoht võib selgelt määrata failis idea.properties.
  • analüüsitav projekt peab olema IDEA valideeritud projekt, mille jaoks tuleb versioonihaldusesse commiteerida mõned failid, mida tavaliselt ignoreeritakse, nimelt:
    • .idea/inspectionProfiles/Project_Default.xml — analüsaatori seaded, mida kasutatakse inspekteerimiste käivitamisel konteineris,
    • .idea/modules.xml — vastasel korral saame vea 'See projekt ei sisalda mudeleid',
    • .idea/misc.xml — vastasel juhul saame vea 'JDK ei ole selle projekti jaoks õigesti konfigureeritud',
    • *.iml-failid — vastasel juhul saame vea, et JDK ei ole moodulis seadistatud.

Kuigi need failid sisaldavad tavaliselt .gitignore, ei sisalda nad mingit arendaja keskkonnale spetsiifilist teavet — erinevalt näiteks failist workspace.xml, kus selline teave on, ja seetõttu ei tohiks seda commiteerida.

Küsimus tõukab end esile, et pakendada JDK koos IDEA Community Editioniga konteinerisse vormis, mis on valmis analüüsitavatele projektidele 'suunamiseks'. Valime sobiva aluskonteineri, ja 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

Kasutades valikut idea.config.path sunnime IDEA otsima oma globaalset konfiguratsiooni kaustast /etc/idea, sest kasutaja kodukaust CI töös on ebaselge ja tihti täiesti puuduv.

Nii näeb välja konteinerisse kopeeritud fail jdk.table.xml, kuhu on märgitud OpenJDK teed, mis on konteineris installitud (selleks võib võtta analoogse faili oma IDEA seadete kaustast):

jdk.table.xml

Valmis pilt on saadaval Docker Hubis.

Enne jätkamist kontrollime IDEA analüsaatori käivitumist konteineris:

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

Analüüs peaks õnnestuma ja kaustas target/idea_inspections peaksid ilmuma mitmed .xml-failid analüsaatori aruannetega.

Nüüd ei ole enam kahtlusi, et IDEA analüsaatorit saab käivitada iseseisvalt igas CI-keskkonnas ning liikume edasi teise sammu juurde.

Samm 2. Kuvame ja analüüsime aruannet

.xml-failide vormis aruande saamine on pool tööst, nüüd tuleb see muuta inimesele loetavaks. Samuti peavad selle tulemusi kasutama kvaliteedi väravates — kvaliteedi määramise loogikas, et kindlaks teha, kas muudatus vastab kvaliteedikriteeriumidele.

Seda aitab meil Jenkins Warnings NG Plugin, mille väljaanne toimus jaanuaris 2019. Agl selle tulekuga on paljusid eraldi pluginaid, mis töötavad Jenkinsis staatilise analüüsi tulemustega (CheckStyle, FindBugs, PMD jne), nüüd märgitud vananenud (obsolete).

Plugin koosneb kahest osast:

  • paljudest analüsaatorite sõnumite kogujatest (täielik nimekiri kätkeb kõiki tuntud teaduslikke analüsaatoreid AcuCobolist ZPT Lintini.
  • ühtset vaatlejat kõigi nende jaoks.

Warnings NG analüüsitavate hulka kuuluvad näiteks Java kompilaatori hoiatuste ja Maven'i täitmise logide hoiatuste analüüs: kuigi need on pidevalt silmade ees, analüüsitakse neid harva eesmärgipäraselt. IntelliJ IDEA aruanne on samuti tuvastatavate formaatide nimekirjas.

Kuna plugin on uus, suhtleb see esialgu hästi Jenkins Pipeline'iga. Koostamisetapp näeb välja järgnev (me ütleme lihtsalt pluginile, millist aruande formaati me tunnustame ja millised failid tuleb 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')]
    )
}

Aruande liides välja näeb nii:

Käivitame IntelliJ IDEA kontrollid Jenkinsis

On mugav, et see liides on universaalne kõigi tuvastatavate analüsaatorite jaoks. See sisaldab interaktiivset jaotustabelit leidude kategooriate järgi ja graafikut, mis näitab leidude arvu dünaamikat. Lehekülje allosas asuvas gridis saab kiiret otsingut teha. Üks asi, mis IDEA jaoks ei tööta korralikult, on võimalus sirvida koodi otse Jenkinsis (kuigi teiste raportite, näiteks Checkstyle'i jaoks, oskab see plugin seda ilusasti teha). Tundub, et see on IDEA raporti parsija tõrge, mille peab parandama.

Warnings NG võimaluste hulka kuulub erinevatest allikatest leitud tõendite kogumine ühte raportisse ja Quality Gates'i programmeerimise võimalus, sealhulgas «hammasratas» referentseeritud kogumise alusel. Osaline dokumentatsioon Quality Gates'i programmeerimise kohta on saadaval, siit — kuid see ei ole täielik, mistõttu tuleb vaadata allikakoode. Teisest küljest, kui soovite täielikku kontrolli, võib «hammasratta» teha ka iseseisvalt (vt minu eelmist postitust selle teema kohta).

Kokkuvõte

Enne selle materjali ettevalmistamist otsustasin uurida, kas keegi on juba sellest teemast Habras kirjutanud. Leidsin vaid intervju 2017. aastal koos lany, kus ta räägib:

Nagu mina tean, ei ole Jenkinsiga ega maven-pluginiga integreerimist […] Üldiselt võiks iga entusiast enda IDE Community Editioni ja Jenkinsiga siduda, paljud sellest ainult võidavad.

Noh, kaks aastat hiljem on meil Warnings NG Plugin ja see sõprus on lõpuks teoks saanud!

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster