IntelliJ IDEA hà oghje l'analizzatore di codice Java staticu più avanzatu, chì in e so capacità lascia assai daretu à tali "veterani" cum'è и . 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 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 и 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.xmlin 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 in u schedariuidea.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 -v2Utilizendu 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 .
Prima di passà, verificate chì l'analizzatore IDEA funziona in u cuntinuu:
docker run --rm -v <путь/к/вашему/проекту>:/var/project inponomarev/intellij-idea-analyzerL'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à , 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 ( 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ì:

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 - 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 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 с induve 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
