Vi kör IntelliJ IDEA-inspektioner pÄ Jenkins

IntelliJ IDEA har idag den mest avancerade statiska kodanalysatorn för Java, med fÀrdigheter som övertrÀffar sÄdana "veteraner" som Checkstyle och Spotbugs. Dess mÄnga "inspektioner" kontrollerar koden ur olika aspekter, frÄn kodningsstil till vanliga buggar.

Men tills resultaten av analysen visas endast i IDE:ns lokala grÀnssnitt, Àr de av liten nytta för utvecklingsprocessen. Statisk analys mÄste utföras som det första steget i byggkedjan, dess resultat ska definiera quality gates, och bygget ska misslyckas om quality gates inte godkÀnns. Det Àr kÀnt att TeamCity CI Àr integrerat med IDEA. Men Àven om du inte anvÀnder TeamCity, kan du enkelt köra inspektioner frÄn IDEA pÄ vilken annan CI-server som helst. Jag föreslÄr att vi tittar pÄ hur detta kan göras med hjÀlp av IDEA Community Edition, Jenkins och Warnings NG-plugin.

Steg 1. Kör analysen i containern och fÄ en rapport

Till en början kan tanken pÄ att köra IDE (ett desktopprogram!) inom en CI-system utan grafiskt grÀnssnitt verka tveksam och mycket besvÀrlig. Lyckligtvis har utvecklarna av IDEA tillhandahÄllit möjligheten att köra kodformattering och inspektioner frÄn kommandoraden. För att köra IDEA i detta lÀge krÀvs ingen grafisk underhÄllning, och dessa uppgifter kan utföras pÄ servrar med textgrÀnssnitt.

Inspektionerna körs med skriptet bin/inspect.sh frÄn installationskatalogen för IDEA. Som parametrar krÀvs:

  • den fullstĂ€ndiga sökvĂ€gen till projektet (relativa stigar stöds inte),
  • sökvĂ€gen till .xml-filen med inspektionsinstĂ€llningar (finns vanligtvis inuti projektet pĂ„ .idea/inspectionProfiles/Project_Default.xml),
  • den fullstĂ€ndiga sökvĂ€gen till mappen dĂ€r .xml-filer med analysresultat kommer att sparas.

Dessutom förvÀntas det att

  • i IDE Ă€r sökvĂ€gen till Java SDK instĂ€lld, annars kommer analysen inte att fungera. Dessa instĂ€llningar Ă„terfinns i konfigurationsfilen jdk.table.xml i IDEA:s globala konfigurationsmapp. SjĂ€lva den globala konfigurationen av IDEA ligger som standard i anvĂ€ndarens hemmakatalog, men denna plats kan anges explicit i filen idea.properties.
  • det analyserade projektet mĂ„ste vara ett giltigt IDEA-projekt, vilket krĂ€ver att vissa filer som vanligtvis ignoreras mĂ„ste committas i versionskontrollen, nĂ€mligen:
    • .idea/inspectionProfiles/Project_Default.xml — instĂ€llningar för analysatorn, som uppenbarligen kommer att anvĂ€ndas vid körning av inspektioner i containern,
    • .idea/modules.xml — annars fĂ„r vi felmeddelandet ‘Detta projekt innehĂ„ller inga moduler’,
    • .idea/misc.xml — annars fĂ„r vi felmeddelandet ‘JDK: n Ă€r inte korrekt konfigurerad för detta projekt’,
    • *.iml-filer — annars fĂ„r vi ett felmeddelande om en oconfigurerad JDK i modulen.

Även om dessa filer vanligtvis inkluderar .gitignore, innehĂ„ller de ingen information som Ă€r specifik för den enskilde utvecklaren — till skillnad frĂ„n, till exempel, filen workspace.xml, dĂ€r sĂ„dan information finns, och dĂ€rför ska vi inte checka in den.

Det föreslÄr sig nÀstan att packa in JDK tillsammans med IDEA Community Edition i containern i en form redo för att "utvecklas" pÄ analyserade projekt. LÄt oss vÀlja en lÀmplig bascontainer och hÀr Àr vÄrt resultat 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

Med hjÀlp av alternativet idea.config.path har vi tvingat IDEA att söka sin globala konfiguration i mappen /etc/idea, eftersom anvÀndarens hemmamapp i CI-miljöer Àr en osÀker sak och ofta helt saknas.

SÄ hÀr ser filen ut som kopieras till containern jdk.table.xml, dÀr sökvÀgarna till OpenJDK, som Àr installerad inuti containern, Àr angivna (en liknande fil frÄn din egen IDEA-konfigurationsmapp kan anvÀndas som grund):

jdk.table.xml

Bild i fÀrdig form finns pÄ Docker Hub.

Innan vi gÄr vidare, lÄt oss kontrollera att IDEA-analysatorn körs i containern:

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

Analysen ska genomföras framgÄngsrikt, och i undermappen target/idea_inspections kommer mÄnga .xml-filer med analyserapporter att dyka upp.

Nu finns det inga tvivel om att IDEA-analysatorn kan köras i fristÄende lÀge i vilken CI-miljö som helst, och vi gÄr vidare till steg tvÄ.

Steg 2. Visa och analysera rapporten

Att fĂ„ en rapport i form av .xml-filer Ă€r halva jobbet, nu mĂ„ste den göras lĂ€sbar för mĂ€nniskor. Dessutom ska resultaten anvĂ€ndas i quality gates — logiken för att avgöra om den accepterade Ă€ndringen uppfyller kvalitetskriterier.

Det hÀr hjÀlper oss med Jenkins Warnings NG Plugin, vars release gjordes i januari 2019. Med dess ankomst Àr mÄnga enskilda plugins för att arbeta med resultaten frÄn statisk analys i Jenkins (CheckStyle, FindBugs, PMD osv.) nu mÀrkta som förÄldrade (obsolete).

Pluginet bestÄr av tvÄ delar:

  • ett stort antal analysators meddelandesamlare (fullstĂ€ndig lista som inkluderar alla kĂ€nda analysatorer frĂ„n AcuCobol till ZPT Lint),
  • en gemensam rapportvisare för dem alla.

Bland de saker som Warnings NG kan analysera finns ocksÄ Java-kompilatorns varningar och varningar frÄn Maven-körloggar: Àven om de alltid Àr synliga, analyseras de sÀllan direkt. Rapporter frÄn IntelliJ IDEA ingÄr ocksÄ i listan över erkÀnda format.

Eftersom pluginet Àr nytt interagerar det frÄn början vÀl med Jenkins Pipeline. Byggsteget med dess deltagande kommer att se ut som följer (vi sÀger helt enkelt till pluginet vilket rapportformat vi kÀnner igen och vilka filer som ska skannas):

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

RapportgrÀnssnittet ser ut sÄ hÀr:

Vi kör IntelliJ IDEA-inspektioner pÄ Jenkins

Det Àr praktiskt att detta grÀnssnitt Àr universellt för alla erkÀnda analysatorer. Det innehÄller ett interaktivt diagram som visar fördelningen av fynd per kategori och en graf över förÀndringar i antalet fynd. I gridden lÀngst ner pÄ sidan kan man utföra snabb sökning. Det enda som inte riktigt fungerade för inspektionerna i IDEA var möjligheten att blÀddra i koden direkt i Jenkins (Àven om detta plugin kan göra det fint för andra rapporter, som Checkstyle). Det verkar vara en bugg i parsern för IDEA-rapporter som mÄste ÄtgÀrdas.

Bland funktionerna i Warnings NG finns möjligheten att aggregera fynd frĂ„n olika kĂ€llor i en rapport och programmera Quality Gates, inklusive en "ratchet" baserat pĂ„ referensbygget. Viss dokumentation om programmering av Quality Gates finns tillgĂ€nglig. hĂ€r — förresten, den Ă€r inte komplett, och man mĂ„ste titta i kĂ€llorna. Å andra sidan, för att fĂ„ full kontroll över vad som hĂ€nder kan man ocksĂ„ implementera en "backande" sjĂ€lv (se min tidigare inlĂ€gg i det hĂ€r Ă€mnet).

Slutsats

Innan jag började förbereda detta material beslutade jag mig för att kolla: har nÄgon redan skrivit om detta Àmne pÄ Habré? Jag hittade endast en intervju frÄn 2017 med lany, dÀr han sÀger:

SÄvitt jag vet finns det ingen integration med Jenkins eller maven-plugin [
] I princip skulle vilken entusiast som helst kunna koppla ihop IDEA Community Edition och Jenkins, vilket mÄnga skulle dra nytta av.

SÄ vad hÀnder: efter tvÄ Är har vi Warnings NG Plugin, och Àntligen har denna vÀnskap blivit verklighet!

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster