Esecuzione di ispezioni IntelliJ IDEA nantu à Jenkins

IntelliJ IDEA hà oghje l'analizzatore di codice Java staticu più avanzatu, chì in e so capacità lascia assai daretu à tali "veterani" cum'è Stile di cuntrollu и Spotbugs. I so numerosi "ispezioni" verificanu u codice in diversi aspetti, da u stilu di codificazione à i bug tipici.

In ogni casu, finu à chì i risultati di l'analisi sò visualizati solu in l'interfaccia lucale di l'IDE di u sviluppatore, sò pocu utili à u prucessu di sviluppu. Analisi statica deve esse fattu Cum'è u primu passu di u pipeline di custruzzione, i so risultati duveranu definisce e porte di qualità, è a custruzzione deve fallu se e porte di qualità ùn sò micca passate. Hè cunnisciutu chì TeamCity CI hè integratu cù IDEA. Ma ancu s'ellu ùn aduprate micca TeamCity, pudete facilmente pruvà à eseguisce ispezioni IDEA in qualsiasi altru servitore CI. Vi suggeriu di vede cumu questu pò esse fattu cù IDEA Community Edition, Jenkins è Warnings NG plugin.

Passu 1. Eseguite l'analisi in u cuntinuu è uttene un rapportu

À u principiu, l'idea di eseguisce un IDE (applicazione di desktop!) Dentru un sistema CI chì ùn hà micca una interfaccia grafica pò sembra dubbiosa è assai fastidiosa. Fortunatamente, i sviluppatori IDEA anu furnitu a capacità di eseguisce furmatu di codice и ispezioni da a linea di cummanda. Inoltre, per eseguisce IDEA in questu modu, un sottosistema graficu ùn hè micca necessariu è questi travaglii ponu esse realizati nantu à i servitori cù una cunchiglia di testu.

L'ispezioni sò lanciate cù un script bin/inspect.sh da u cartulare di stallazione IDEA. I paràmetri necessarii sò:

  • percorsu sanu à u prugettu (i parenti ùn sò micca supportati),
  • percorsu à u schedariu .xml cù paràmetri di ispezione (di solitu situatu in u prugettu in .idea/inspectionProfiles/Project_Default.xml),
  • percorsu pienu à u cartulare in quale i schedari .xml cù i rapporti nantu à i risultati di l'analisi seranu guardati.

Inoltre, hè previstu chì

  • u percorsu à u Java SDK serà cunfiguratu in l'IDE, altrimente l'analisi ùn viaghja micca. Questi paràmetri sò cuntenuti in u schedariu di cunfigurazione jdk.table.xml in u cartulare di cunfigurazione glubale IDEA. A cunfigurazione glubale IDEA stessu si trova in u cartulare di casa di l'utilizatori per automaticamente, ma questu locu pò esse specificatu esplicitamente in u schedariu idea.properties.
  • U prughjettu analizatu deve esse un prughjettu IDEA validu, per quale duverete cummette alcuni schedari chì sò generalmente ignorati à u cuntrollu di versione, vale à dì:
    • .idea/inspectionProfiles/Project_Default.xml - paràmetri di l'analizzatore, seranu ovviamente aduprati durante l'ispezioni in u containeru,
    • .idea/modules.xml - altrimenti averemu l'errore 'Stu prughjettu ùn cuntene micca moduli',
    • .idea/misc.xml - altrimenti averemu l'errore "U JDK ùn hè micca cunfiguratu bè per stu prughjettu",
    • *.iml-файлы - altrimenti averemu un errore nantu à un JDK micca cunfiguratu in u modulu.

Ancu s'è questi schedari sò generalmente inclusi in .gitignore, ùn cuntenenu nisuna infurmazione specifica à l'ambiente di un sviluppatore particulari - a diferenza, per esempiu, un schedariu workspace.xml, induve tali informazioni sò cuntenute, è per quessa ùn ci hè micca bisognu di impegnà.

A suluzione ovvia hè di imballà u JDK inseme cù IDEA Community Edition in un cuntainer in una forma pronta per esse "pitted" nantu à i prughjetti analizati. Scegliemu un containeru di basa adattatu, è questu serà u nostru 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

Utilizendu l'opzione idea.config.path avemu furzatu IDEA à circà a so cunfigurazione glubale in u cartulare /etc/idea, Perchè u cartulare di casa di l'utilizatori quandu travaglia in CI hè una cosa incerta è spessu assente completamente.

Eccu ciò chì u schedariu copiatu in u cuntinuu s'assumiglia: jdk.table.xml, chì cuntene i percorsi per OpenJDK installati in u cuntinuu (un schedariu simili da u vostru propiu repertoriu cù paràmetri IDEA pò esse pigliatu cum'è basa):

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>

L'imagine finita dispunibule nantu à Docker Hub.

Prima di passà, verificate chì l'analizzatore IDEA funziona in u cuntinuu:

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

L'analisi deve esse realizatu cù successu, è numerosi schedari .xml cù rapporti di l'analizzatore deve esse appare in u subfolder target/idea_inspections.

Avà ùn ci hè più dubbitu chì l'analizzatore IDEA pò esse eseguitu standalone in ogni ambiente CI, è andemu à u sicondu passu.

Step 2. Mostra è analizà u rapportu

Ottene u rapportu in a forma di i schedari .xml hè a mità di a battaglia avà bisognu di fà leghjite da l'omu. È ancu i so risultati deve esse usatu in porte di qualità - a logica per determinà se u cambiamentu accettatu passa o falla secondu i criterii di qualità.

Questu ci aiuterà Jenkins Warnings NG Plugin, chì hè stata liberata in ghjennaghju 2019. Cù u so avventu, assai plugins individuali per travaglià cù risultati di l'analisi statica in Jenkins (CheckStyle, FindBugs, PMD, etc.) sò avà marcati cum'è obsoleti.

U plugin hè custituitu di dui parti:

  • numerosi cullettori di messagi di l'analizzatore (lista completa include tutti l'analizzatori cunnisciuti da a scienza da AcuCobol à ZPT Lint),
  • un unicu visore di rapportu per tutti.

A lista di e cose chì Warnings NG pò analizà include avvisi da u compilatore Java è avvisi da i logs d'esekzione Maven: ancu s'ellu sò sempre visibili, sò raramente analizati specificamente. I rapporti IntelliJ IDEA sò ancu inclusi in a lista di formati ricunnisciuti.

Siccomu u plugin hè novu, inizialmente interagisce bè cù Jenkins Pipeline. U passu di custruzzione cù a so participazione serà cusì cusì (simpricamente dicemu à u plugin chì formatu di rapportu ricunnoscemu è quali fugliali deve esse scansatu):

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

L'interfaccia di rapportu hè cusì:

Esecuzione di ispezioni IntelliJ IDEA nantu à Jenkins

Convenientemente, sta interfaccia hè universale per tutti l'analizzatori ricunnisciuti. Contene un diagramma interattivu di a distribuzione di i ritrovi per categuria è un graficu di a dinamica di i cambiamenti in u numeru di ritrovi. Pudete fà una ricerca rapida in a griglia in u fondu di a pagina. L'unicu ciò chì ùn hà micca travagliatu bè per l'ispezioni IDEA era a capacità di navigà u codice direttamente in Jenkins (ancu se per altri rapporti, per esempiu Checkstyle, stu plugin pò fà stu bellu). Sembra chì questu hè un bug in u parser di rapportu IDEA chì deve esse riparatu.

Trà e caratteristiche di Warnings NG hè a capacità di aggregate i risultati da diverse fonti in un rapportu è prugramma Quality Gates, cumprese un "ratchet" per l'assemblea di riferimentu. Alcune documentazioni di prugrammazione Quality Gates sò dispunibili ccà - in ogni modu, ùn hè cumpleta, è vi tocca à circà à u codice fonte. Per d 'altra banda, per un cuntrollu cumpletu di ciò chì succede, u "ratchet" pò esse implementatu indipindente (vede u mo post precedente circa stu tema).

cunchiusioni

Prima di principià à preparà stu materiale, aghju decisu di circà : qualcunu hà digià scrittu annantu à questu tema nantu à Habré ? Aghju trovu solu intervista 2017 с laniainduve ellu dice:

In quantu à sapè, ùn ci hè micca integrazione cù Jenkins o un plugin maven [...] In principiu, ogni entusiasta puderia fà amici cù IDEA Community Edition è Jenkins, assai prufittà solu di questu.

Ebbè, dui anni dopu avemu Warnings NG Plugin, è infine sta amicizia hè ghjunta!

Source: www.habr.com

Add a comment