Keyrir IntelliJ IDEA skoðanir á Jenkins

IntelliJ IDEA í dag er með fullkomnasta kyrrstöðu Java kóða greiningartækið, sem í getu sinni skilur langt á bak við „öldungamenn“ eins og Checkstyle и Spotbugs. Fjölmargar „skoðanir“ þess athuga kóðann á ýmsum sviðum, frá kóðunarstíl til dæmigerðra galla.

Hins vegar, svo framarlega sem greiningarniðurstöðurnar eru aðeins birtar í staðbundnu viðmóti IDE þróunaraðilans, eru þær að litlu gagni fyrir þróunarferlið. Statísk greining verður að uppfylla Sem fyrsta skref byggingarleiðslunnar ættu niðurstöður hennar að skilgreina gæðahlið og smíðin ætti að mistakast ef gæðahliðin eru ekki framhjá. Það er vitað að TeamCity CI er samþætt við IDEA. En jafnvel þótt þú notir ekki TeamCity geturðu auðveldlega prófað að keyra IDEA skoðanir á hvaða öðrum CI netþjóni sem er. Ég legg til að þú sjáir hvernig þetta er hægt að gera með því að nota IDEA Community Edition, Jenkins og Warnings NG viðbótina.

Skref 1. Keyrðu greininguna í gámnum og fáðu skýrslu

Í fyrstu gæti hugmyndin um að keyra IDE (skrifborðsforrit!) inni í CI kerfi sem er ekki með grafísku viðmóti virst vafasöm og mjög erfið. Sem betur fer hafa IDEA forritarar veitt getu til að keyra kóðasniði и skoðanir frá skipanalínunni. Þar að auki, til að keyra IDEA í þessum ham, er grafískt undirkerfi ekki krafist og hægt er að framkvæma þessi verkefni á netþjónum með textaskel.

Skoðanir eru settar af stað með handriti bin/inspect.sh úr IDEA uppsetningarskránni. Færibreyturnar sem krafist er eru:

  • fullur slóð að verkefninu (aðstandendur eru ekki studdir),
  • slóð að .xml skránni með skoðunarstillingum (venjulega staðsett inni í verkefninu í .idea/inspectionProfiles/Project_Default.xml),
  • full slóð að möppunni þar sem .xml skrár með skýrslum um greiningarniðurstöður verða geymdar.

Auk þess er gert ráð fyrir því

  • slóðin að Java SDK verður stillt í IDE, annars virkar greiningin ekki. Þessar stillingar eru í stillingarskránni jdk.table.xml í IDEA alþjóðlegu stillingamöppunni. IDEA alþjóðlega uppsetningin sjálf er sjálfgefið staðsett í heimaskrá notandans, en þessi staðsetning má sérstaklega tilgreina í skrá idea.properties.
  • Greinda verkefnið verður að vera gilt IDEA verkefni, þar sem þú verður að skuldbinda nokkrar skrár sem venjulega eru hunsaðar til útgáfustýringar, þ.e.
    • .idea/inspectionProfiles/Project_Default.xml — greiningarstillingar, þær verða augljóslega notaðar þegar skoðanir eru keyrðar í gámnum,
    • .idea/modules.xml - annars fáum við villuna 'Þetta verkefni inniheldur engar einingar',
    • .idea/misc.xml - annars fáum við villuna 'JDK er ekki rétt stillt fyrir þetta verkefni',
    • *.iml-файлы - annars fáum við villu um óstillt JDK í einingunni.

Þó að þessar skrár séu venjulega innifalin í .gitignore, innihalda þær engar upplýsingar sem eru sértækar fyrir umhverfi tiltekins þróunaraðila - ólíkt til dæmis skrá workspace.xml, þar sem slíkar upplýsingar eru að finna og því er óþarfi að fremja þær.

Augljósa lausnin er að pakka JDK ásamt IDEA Community Edition í gám á formi sem er tilbúið til að „pitta“ á greindu verkefnin. Við skulum velja viðeigandi grunnílát og þetta er það sem Dockerfile okkar verður:

Dockerfil

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

Að nota valkostinn idea.config.path við neyddum IDEA til að leita að alþjóðlegri uppsetningu í möppunni /etc/idea, vegna þess að heimamappa notandans þegar hann vinnur í CI er óviss hlutur og oft algjörlega fjarverandi.

Svona lítur skráin sem afrituð er í ílátið út: jdk.table.xml, sem inniheldur slóðir til OpenJDK uppsettar inni í gámnum (líka skrá úr eigin möppu með IDEA stillingum er hægt að taka til grundvallar):

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>

Fullunnin mynd fáanlegt á Docker Hub.

Áður en haldið er áfram skulum við athuga hvort IDEA greiningartækið sé í gangi í ílátinu:

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

Greiningin ætti að ganga vel og fjölmargar .xml skrár með greiningarskýrslum ættu að birtast í target/idea_inspections undirmöppunni.

Nú er enginn vafi lengur á því að hægt sé að keyra IDEA greiningartækið sjálfstætt í hvaða CI umhverfi sem er og við höldum áfram í annað skrefið.

Skref 2. Birta og greina skýrsluna

Að fá skýrsluna í formi .xml skráa er hálf baráttan, nú þarftu að gera hana læsilega fyrir mönnum. Og einnig ætti að nota niðurstöður hennar í gæðahliðum - rökfræðin til að ákvarða hvort samþykkt breyting standist eða mistekst samkvæmt gæðaviðmiðunum.

Þetta mun hjálpa okkur Jenkins Warnings NG Plugin, sem kom út í janúar 2019. Með tilkomu sinni eru mörg einstök viðbætur til að vinna með niðurstöður kyrrstöðugreiningar í Jenkins (CheckStyle, FindBugs, PMD, osfrv.) nú merktar sem úreltar.

Viðbótin samanstendur af tveimur hlutum:

  • fjölmargir greiningarskilaboðasafnarar (fullur listi inniheldur alla greiningartæki sem vísindin þekkja frá AcuCobol til ZPT Lint),
  • einn skýrsluskoðara fyrir þá alla.

Listinn yfir hluti sem Warnings NG getur greint inniheldur viðvaranir frá Java þýðandanum og viðvaranir frá Maven framkvæmdarskrám: þó þau séu stöðugt sýnileg eru þau sjaldan sérstaklega greind. IntelliJ IDEA skýrslur eru einnig á listanum yfir viðurkennd snið.

Þar sem viðbótin er ný, hefur það upphaflega samskipti við Jenkins Pipeline. Byggingarskrefið með þátttöku þess mun líta svona út (við segjum viðbótinni einfaldlega hvaða skýrslusnið við þekkjum og hvaða skrár á að skanna):

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')]
    )
}

Skýrsluviðmótið lítur svona út:

Keyrir IntelliJ IDEA skoðanir á Jenkins

Þægilega, þetta viðmót er alhliða fyrir alla viðurkennda greiningartæki. Það inniheldur gagnvirka skýringarmynd af dreifingu funda eftir flokkum og línurit yfir gangverki breytinga á fjölda funda. Þú getur framkvæmt snögga leit í ristinni neðst á síðunni. Það eina sem virkaði ekki rétt fyrir IDEA skoðanir var hæfileikinn til að fletta kóða beint í Jenkins (þó fyrir aðrar skýrslur, til dæmis Checkstyle, þá getur þetta tappi gert þetta fallega). Það lítur út fyrir að þetta sé villa í IDEA skýrsluþjálfaranum sem þarf að laga.

Meðal eiginleika Warnings NG er hæfileikinn til að safna saman niðurstöðum frá mismunandi aðilum í einni skýrslu og forrita Quality Gates, þar á meðal „skralla“ fyrir viðmiðunarsamstæðuna. Sum Quality Gates forritunarskjöl eru fáanleg hér - Hins vegar er það ekki fullkomið og þú verður að skoða frumkóðann. Á hinn bóginn, til að fá fulla stjórn á því sem er að gerast, er hægt að útfæra „ratchet“ sjálfstætt (sjá mína fyrri færsla um þetta þema).

Ályktun

Áður en ég byrjaði að undirbúa þetta efni ákvað ég að leita: hefur einhver þegar skrifað um þetta efni á Habré? Ég fann bara viðtal 2017 с Lanyþar sem hann segir:

Eftir því sem ég best veit er engin samþætting við Jenkins eða maven viðbót […] Í grundvallaratriðum gæti hvaða áhugamaður sem er gæti eignast vini með IDEA Community Edition og Jenkins, margir myndu bara njóta góðs af þessu.

Jæja, tveimur árum síðar höfum við Warnings NG Plugin, og loksins hefur þessi vinátta orðið að veruleika!

Heimild: www.habr.com

Bæta við athugasemd