Vi kör IntelliJ IDEA-inspektioner pÄ Jenkins

IntelliJ IDEA har idag den mest avancerade statiska kodanalysatorn för Java, vilket lÀmnar lÄngt bakom sig sÄdana "veteraner" som Checkstyle och Spotbugs. Dess mÄnga "inspektioner" kontrollerar koden ur olika aspekter, frÄn kodstil till typiska buggar.

Men hittills visas analysresultaten bara i utvecklarens lokala IDE-grÀnssnitt, vilket gör dem ganska ineffektiva för utvecklingsprocessen. Statisk analys bör utföras som det första steget i byggprocessen; dess resultat bör definiera quality gates, och bygget bör misslyckas om quality gates inte uppfylls. Det Àr kÀnt att TeamCity CI Àr integrerat med IDEA. Men Àven om du inte anvÀnder TeamCity kan du helt enkelt försöka köra inspektioner i IDEA pÄ vilken annan CI-server som helst. LÄt oss titta pÄ hur detta kan göras med hjÀlp av IDEA Community Edition, Jenkins och Warnings NG-plugin.

Steg 1. Starta analysen i containern och fÄ en rapport

Till en början kan det verka tveksamt och mycket besvÀrligt att starta IDE (ett skrivbordsprogram!) inuti en CI-system utan grafiskt grÀnssnitt. Lyckligtvis har utvecklarna av IDEA gett möjlighet att köra kodformatering och inspektioner frÄn kommandoraden. För att starta IDEA i detta lÀge krÀvs ingen grafisk subsystem, och dessa uppgifter kan utföras pÄ servrar med textgrÀnssnitt.

Inspektionerna startas med hjÀlp av skriptet bin/inspect.sh frÄn installationsmappen för IDEA. Som parametrar behövs:

  • fullstĂ€ndig sökvĂ€g till projektet (relativa sökvĂ€gar stöds inte),
  • sökvĂ€g till .xml-filen med inspektionsinstĂ€llningarna (som vanligtvis finns i projektmappen i .idea/inspectionProfiles/Project_Default.xml),
  • fullstĂ€ndig sökvĂ€g till mappen dĂ€r .xml-filer med analysresultatens rapporter ska lagras.

Dessutom förvÀntas

  • i IDE:s instĂ€llningar finnas en referens till Java SDK, annars kommer analysen inte att fungera. Dessa instĂ€llningar finns i konfigurationsfilen jdk.table.xml i IDEA:s globala konfigurationsmapp. SjĂ€lva den globala konfigurationen för IDEA ligger som standard i anvĂ€ndarens hemkatalog, men denna plats kan anges uttryckligen i filen idea.properties.
  • det analyserade projektet mĂ„ste vara ett giltigt IDEA-projekt, vilket innebĂ€r att vissa filer som normalt ignoreras mĂ„ste kommittas till kontrollsystemet, nĂ€mligen:
    • .idea/inspectionProfiles/Project_Default.xml — konfiguration av analysatorn, de kommer uppenbarligen att anvĂ€ndas nĂ€r inspektioner körs i containern,
    • .idea/modules.xml — annars fĂ„r vi felet 'Detta projekt innehĂ„ller inga moduler',
    • .idea/misc.xml — annars fĂ„r vi felet 'JDK:n Ă€r inte korrekt konfigurerad för detta projekt',
    • *.iml-filer — annars fĂ„r vi ett fel om att JDK inte Ă€r instĂ€llt i modulen.

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

Det föreslÄr sig sjÀlvt att packa JDK tillsammans med IDEA Community Edition i en container i en form som Àr redo för att anvÀnds pÄ analyserade projekt. Vi vÀljer en lÀmplig grundcontainer, och hÀr Àr vad vi fÄr i 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

Genom att anvÀnda alternativet idea.config.path tvingade vi IDEA att söka efter sin globala konfiguration i mappen /etc/idea, eftersom anvÀndarens hemkatalog i CI-arbetsmiljöer Àr osÀker och ofta helt saknas.

SÄ hÀr ser filen ut som kopieras till containern, jdk.table.xml, dÀr sökvÀgarna till OpenJDK, installerad inuti containern, Àr angivna (en liknande fil kan tas som utgÄngspunkt frÄn din egen konfigurationskatalog för IDEA):

jdk.table.xml

Bild i fÀrdig form tillgÀnglig pÄ Docker Hub.

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

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

Analysen ska köras utan problem och i undermappen target/idea_inspections ska det finnas mÄnga .xml-filer med analysrapporter.

Nu finns det inga tvivel om att IDE-analyzern kan köras offline i vilket CI-miljö som helst, och vi gÄr vidare till steg tvÄ.

Steg 2. Visar och analyserar rapporten

Att fĂ„ rapporten i form av .xml-filer Ă€r en del av arbetet, nu mĂ„ste den göras lĂ€sbar för mĂ€nniskor. Dessutom mĂ„ste resultaten anvĂ€ndas i quality gates – logiken för att avgöra om den accepterade Ă€ndringen uppfyller kvalitetskriterierna.

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

Pluginet bestÄr av tvÄ delar:

  • ett stort antal meddelandeaggregatorer frĂ„n analysatorer (fullstĂ€ndig lista inklusive alla kĂ€nda analysatorer frĂ„n AcuCobol till ZPT Lint),
  • en gemensam rapportvisare för alla dessa.

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

Eftersom pluginet Àr nytt fungerar det frÄn början bra med Jenkins Pipeline. Steget för byggprocessen ser ut som följande (vi berÀttar bara för pluginet vilket rapportformat vi kÀnner igen och vilka filer som ska skannas):

stage ('Statisk analys'){ 
    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')] 
    ) 
}

Rapportens grÀnssnitt 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 efter kategorier och en graf som visar hur antalet fynd förÀndras över tid. I rutan lÀngst ner pÄ sidan kan snabb sökning utföras. Det enda som inte fungerade korrekt för IDEA-inspektionerna var möjligheten att blÀddra i koden direkt i Jenkins (Àven om denna plugin kan göra det snyggt för andra rapporter, till exempel Checkstyle). Det verkar vara en bugg i parsern för IDEA-rapporter som behöver fixas.

Bland möjligheterna i Warnings NG finns möjlighet att aggregatera fynd frĂ„n olika kĂ€llor i en rapport och att programmera Quality Gates, inklusive – en "ratchet" baserad pĂ„ referensbyggnaden. Viss dokumentation om programmering av Quality Gates finns tillgĂ€nglig. hĂ€r — men den Ă€r inte fullstĂ€ndig, och man fĂ„r titta i kĂ€llorna. Å andra sidan, för full kontroll över vad som hĂ€nder kan "vĂ€xeln" ocksĂ„ implementeras sjĂ€lv (se min tidigare post i detta Ă€mne).

Slutsats

Innan jag började förbereda detta material, bestÀmde jag mig för att se om nÄgon redan skrivit om detta 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 kunde vilken entusiast som helst koppla ihop IDEA Community Edition och Jenkins, mÄnga skulle bara vinna pÄ det.

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