Running IntelliJ IDEA ynspeksjes op Jenkins

IntelliJ IDEA hat hjoeddedei de meast avansearre statyske Java-koadeanalysator, dy't yn syn mooglikheden sokke "feteranen" fier efterlit as Checkstyle и Spotbugs. De tal fan "ynspeksjes" kontrolearje de koade yn ferskate aspekten, fan kodearringstyl oant typyske bugs.

Salang't de analyseresultaten lykwols allinich wurde werjûn yn 'e lokale ynterface fan' e IDE fan 'e ûntwikkelder, binne se fan lyts nut foar it ûntwikkelingsproses. Statyske analyze foldien wurde moat As de earste stap fan 'e boupipeline moatte har resultaten kwaliteitspoarten definiearje, en de bou moat mislearje as de kwaliteitspoarten net trochjûn wurde. It is bekend dat TeamCity CI is yntegrearre mei IDEA. Mar sels as jo TeamCity net brûke, kinne jo maklik besykje IDEA-ynspeksjes út te fieren yn elke oare CI-tsjinner. Ik stel foar dat jo sjogge hoe't dit kin dien wurde mei IDEA Community Edition, Jenkins en Warnings NG plugin.

Stap 1. Run de analyze yn 'e kontener en krije in rapport

Earst kin it idee fan it útfieren fan in IDE (buroblêdapplikaasje!) binnen in CI-systeem dat gjin grafyske ynterface hat twifelich en heul lestich lykje. Gelokkich hawwe IDEA-ûntwikkelders de mooglikheid levere om te rinnen koade opmaak и ynspeksjes fan de kommandorigel. Boppedat, om IDEA yn dizze modus út te fieren, is in grafysk subsysteem net fereaske en dizze taken kinne wurde útfierd op servers mei in tekstshell.

Ynspeksjes wurde lansearre mei in skript bin/inspect.sh út de IDEA-ynstallaasjemap. De fereaske parameters binne:

  • folsleine paad nei it projekt (relative wurde net stipe),
  • paad nei it .xml-bestân mei ynspeksje-ynstellingen (meastentiids leit yn it projekt yn .idea/inspectionProfiles/Project_Default.xml),
  • folsleine paad nei de map wêryn .xml triemmen mei rapporten oer de analyze resultaten sille wurde opslein.

Dêrneist wurdt ferwachte dat

  • it paad nei de Java SDK sil yn 'e IDE konfigureare wurde, oars sil de analyze net wurkje. Dizze ynstellings binne opnommen yn it konfiguraasjetriem jdk.table.xml yn de IDEA globale konfiguraasje map. De IDEA globale konfiguraasje sels is standert yn 'e thúsmap fan' e brûker, mar dizze lokaasje kin eksplisyt oantsjutte yn triem idea.properties.
  • It analysearre projekt moat in jildich IDEA-projekt wêze, wêrfoar jo guon bestannen moatte ynsette dy't normaal negearre wurde foar ferzjekontrôle, nammentlik:
    • .idea/inspectionProfiles/Project_Default.xml - analysatorynstellingen, se sille fansels wurde brûkt by it útfieren fan ynspeksjes yn 'e kontener,
    • .idea/modules.xml - oars krije wy de flater 'Dit projekt befettet gjin modules',
    • .idea/misc.xml - oars krije wy de flater 'De JDK is net goed ynsteld foar dit projekt',
    • *.iml-файлы - oars krije wy in flater oer in net-konfigureare JDK yn 'e module.

Hoewol dizze bestannen normaal binne opnommen yn .gitignore, se befetsje gjin ynformaasje spesifyk foar de omjouwing fan in bepaalde ûntwikkelder - oars as bygelyks in bestân workspace.xml, dêr't sokke ynformaasje is befette, en dêrom is it net nedich om te begean it.

De foar de hân lizzende oplossing is om de JDK tegearre mei IDEA Community Edition yn in kontener te ferpakjen yn in foarm klear om "pitted" te wurden op 'e analysearre projekten. Litte wy in geskikte basiskontener kieze, en dit is wat ús Dockerfile sil wêze:

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

Mei help fan de opsje idea.config.path wy twongen IDEA om te sykjen nei syn globale konfiguraasje yn 'e map /etc/idea, om't de thúsmap fan de brûker by it wurkjen yn CI in ûnwis ding is en faaks folslein ôfwêzich.

Dit is wat it bestân kopiearre nei de kontener derút sjocht: jdk.table.xml, dy't de paden befettet nei OpenJDK ynstalleare yn 'e kontener (in ferlykbere triem út jo eigen map mei IDEA-ynstellingen kin as basis wurde nommen):

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>

De ôfmakke ôfbylding beskikber op Docker Hub.

Foardat jo trochgean, litte wy kontrolearje dat de IDEA-analysator yn 'e kontener rint:

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

De analyze moat mei súkses rinne, en in protte .xml-bestannen mei analyzerrapporten moatte ferskine yn 'e submap target/idea_inspections.

No is d'r gjin twifel mear dat de IDEA-analysator standalone kin wurde útfierd yn elke CI-omjouwing, en wy geane troch nei de twadde stap.

Stap 2. Display en analysearje it rapport

It rapport krije yn 'e foarm fan .xml-bestannen is de helte fan 'e slach, no moatte jo it minsklik lêsber meitsje. En ek de resultaten dêrfan moatte brûkt wurde yn kwaliteitspoarten - de logika om te bepalen oft de akseptearre feroaring trochgiet of mislearret neffens kwaliteitskritearia.

Dit sil ús helpe Jenkins Warnings NG Plugin, dat waard útbrocht yn jannewaris 2019. Mei syn komst binne in protte yndividuele plugins foar it wurkjen mei statyske analyseresultaten yn Jenkins (CheckStyle, FindBugs, PMD, ensfh.) No markearre as ferâldere.

De plugin bestiet út twa dielen:

  • tal fan analysator berjochtensamlers (folsleine list omfettet alle analysators dy't de wittenskip bekend binne fan AcuCobol oant ZPT Lint),
  • ien rapport werjouwer foar allegearre.

De list mei dingen dy't Warnings NG kin analysearje omfettet warskôgings fan 'e Java-kompiler en warskôgings fan Maven-útfierlogboeken: hoewol se konstant sichtber binne, wurde se selden spesifyk analysearre. IntelliJ IDEA-rapporten binne ek opnommen yn 'e list mei erkende formaten.

Sûnt de plugin is nij, it yn earste ynstânsje goed ynteraksje mei Jenkins Pipeline. De boustap mei syn dielname sil der sa útsjen (wy fertelle de plugin gewoan hokker rapportformaat wy werkenne en hokker bestannen moatte wurde skansearre):

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

De rapportynterface sjocht der sa út:

Running IntelliJ IDEA ynspeksjes op Jenkins

Gemaklik is dizze ynterface universeel foar alle erkende analysators. It befettet in ynteraktyf diagram fan 'e ferdieling fan fynsten per kategory en in grafyk fan' e dynamyk fan feroaringen yn it oantal fynsten. Jo kinne in flugge sykopdracht útfiere yn it raster ûnderoan de side. It ienige ding dat net goed wurke foar IDEA-ynspeksjes wie de mooglikheid om koade direkt yn Jenkins te blêdzjen (hoewol foar oare rapporten, bygelyks Checkstyle, kin dizze plugin dit prachtich dwaan). It liket derop dat dit in brek is yn 'e IDEA-rapportparser dy't reparearre wurde moat.

Under de funksjes fan Warnings NG is de mooglikheid om befinings út ferskate boarnen te sammeljen yn ien rapport en programma Quality Gates, ynklusyf in "ratchet" foar de referinsjegearkomste. Guon Quality Gates-programmearring dokumintaasje is beskikber hjir - lykwols, it is net kompleet, en jo moatte sjen op de boarne koade. Oan 'e oare kant, foar folsleine kontrôle oer wat der bart, kin de "ratchet" ûnôfhinklik wurde ymplementearre (sjoch myn foarige post oer dit tema).

konklúzje

Foardat ik begon mei it tarieden fan dit materiaal, besleat ik te sykjen: hat immen al skreaun oer dit ûnderwerp op Habré? Ik fûn allinnich ynterview 2017 с lanydêr't hy seit:

Foar safier't ik wit, is d'r gjin yntegraasje mei Jenkins of in maven-plugin […] Yn prinsipe koe elke entûsjast freonen meitsje mei IDEA Community Edition en Jenkins, in protte soene hjir allinich profitearje fan.

No, twa jier letter hawwe wy Warnings NG Plugin, en op it lêst is dizze freonskip ta bloei kommen!

Boarne: www.habr.com

Add a comment