Oggi IntelliJ IDEA dispone del più avanzato analizzatore statico di codice Java, superando di gran lunga i "veterani" come e . Le sue numerose "ispezioni" controllano il codice sotto vari aspetti, dallo stile di codifica ai bug caratteristici.
Tuttavia, finché i risultati dell'analisi vengono visualizzati solo nell'interfaccia locale dell'IDE, sono di scarsa utilità per il processo di sviluppo. L'analisi statica come primo passo della catena di montaggio, i suoi risultati dovrebbero determinare le quality gates, e la build dovrebbe fallire se le quality gates non vengono superate. È risaputo che TeamCity CI è integrato con IDEA. Ma anche se non utilizzi TeamCity, puoi eseguire le ispezioni di IDEA su qualsiasi altro server CI. Ti mostro come farlo usando IDEA Community Edition, Jenkins e il plugin Warnings NG.
Passo 1. Avviamo l'analisi in un container e otteniamo il report
Inizialmente, l'idea di eseguire l'IDE (un'app desktop!) all'interno di un sistema CI privo di interfaccia grafica potrebbe sembrare discutibile e molto complicata. Fortunatamente, gli sviluppatori di IDEA hanno fornito la possibilità di avviare e dalla riga di comando. Inoltre, per avviare IDEA in questo modo non è necessaria una sottosistema grafico e queste attività possono essere eseguite su server con terminale testuale.
L'esecuzione delle ispezioni avviene tramite lo script bin/inspect.sh dalla directory di installazione di IDEA. I parametri richiesti sono:
- il percorso completo al progetto (i percorsi relativi non sono supportati),
- il percorso al file .xml con le impostazioni delle ispezioni (di solito si trova all'interno del progetto in .idea/inspectionProfiles/Project_Default.xml),
- il percorso completo alla cartella in cui saranno salvati i file .xml con i report sui risultati dell'analisi.
Inoltre, si prevede che
- l'IDE abbia configurato il percorso al Java SDK, altrimenti l'analisi non funzionerà. Queste impostazioni sono contenute nel file di configurazione
jdk.table.xmlnella cartella di configurazione globale di IDEA. La configurazione globale di IDEA di default si trova nella directory home dell'utente, ma questa posizione nel fileidea.properties. - il progetto analizzato deve essere un progetto valido di IDEA, per cui è necessario eseguire il commit di alcuni file che di solito vengono ignorati, in particolare:
.idea/inspectionProfiles/Project_Default.xml— impostazioni dell'analizzatore, che saranno utilizzate esplicitamente durante l'esecuzione delle ispezioni nel contenitore,.idea/modules.xml— altrimenti riceveremo un errore ‘Questo progetto non contiene moduli’,.idea/misc.xml— altrimenti riceveremo un errore ‘Il JDK non è configurato correttamente per questo progetto’,*.iml-files— altrimenti riceveremo un errore riguardante il JDK non configurato nel modulo.
Sebbene di solito questi file siano inclusi in .gitignore, non contengono alcuna informazione specifica per l'ambiente del singolo sviluppatore — a differenza, ad esempio, del file workspace.xml, dove tali informazioni sono effettivamente presenti, e quindi non deve essere eseguito il commit.
Si suggerisce di imballare il JDK insieme a IDEA Community Edition nel contenitore in una forma pronta per essere 'inviata' ai progetti analizzati. Sceglieremo un contenitore di base adatto, e ecco che tipo di Dockerfile otterremo:
Dockerfile
DA 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 -v2Utilizzando l'opzione idea.config.path abbiamo costretto IDEA a cercare la propria configurazione globale nella cartella /etc/idea, poiché la home directory dell'utente in condizioni di lavoro in CI è una cosa incerta e spesso del tutto assente.
Questo è il file copiato nel contenitore jdk.table.xml, in cui sono registrati i percorsi verso OpenJDK, installato all'interno del contenitore (può essere preso come base un file simile nella propria directory delle impostazioni di IDEA):
jdk.table.xml
Immagine pronta .
Prima di procedere, verifichiamo l'esecuzione dell'analizzatore IDEA nel contenitore:
docker run --rm -v :/var/project inponomarev/intellij-idea-analyzerL'analisi dovrebbe avere successo e nella sottocartella target/idea_inspections dovrebbero apparire numerosi file .xml con i rapporti dell'analizzatore.
Non ci sono più dubbi sul fatto che l'analizzatore IDEA possa essere eseguito offline in qualsiasi ambiente CI, e passiamo al secondo passo.
Passo 2. Visualizziamo e analizziamo il rapporto
Ottenere il rapporto in formato .xml è solo metà del lavoro, ora deve essere reso leggibile. Inoltre, i suoi risultati devono essere utilizzati nei quality gates — nella logica per determinare se una modifica proposta soddisfa o meno i criteri di qualità.
In questo ci aiuterà , il cui rilascio è avvenuto nel gennaio 2019. Con la sua apparizione, molti plugin separati per lavorare con i risultati dell'analisi statica in Jenkins (CheckStyle, FindBugs, PMD, ecc.) sono ora contrassegnati come obsoleti.
Il plugin è composto da due parti:
- numerosi raccoglitori di messaggi degli analizzatori ( include tutti gli analizzatori noti dalla scienza, da AcuCobol a ZPT Lint),
- un visualizzatore di report unificato per tutti loro.
Nel elenco delle cose che Warnings NG può analizzare ci sono anche gli avvisi del compilatore Java e gli avvisi dai log di esecuzione di Maven: anche se sono sempre in vista, raramente vengono analizzati specificamente. I report di IntelliJ IDEA fanno anche parte dei formati riconosciuti.
Essendo il plugin nuovo, interagisce bene con Jenkins Pipeline fin dall'inizio. Il passo di build che lo coinvolge apparirà come segue (diciamo semplicemente al plugin quale formato di report riconosciamo e quali file devono essere scansionati):
stage ('Analisi statica'){
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 del report appare così:

È comodo che questa interfaccia sia universale per tutti gli analizzatori riconosciuti. Contiene un diagramma interattivo che distribuisce i risultati per categorie e un grafico che mostra l'andamento del numero di risultati. Nella griglia in fondo alla pagina, è possibile eseguire ricerche rapide. L'unica cosa che non ha funzionato correttamente per le ispezioni IDEA è la possibilità di navigare nel codice direttamente in Jenkins (anche se per altri report, come Checkstyle, questo plugin riesce a farlo in modo elegante). Sembra che si tratti di un bug del parser dei report di IDEA, da sistemare.
Tra le funzionalità di Warnings NG c'è la possibilità di aggregare in un unico report risultati provenienti da diverse fonti e di programmare Quality Gates, inclusa la funzione 'ratchet' sulla build di riferimento. Alcune documentazioni sulla programmazione dei Quality Gates sono disponibili — tuttavia, non sono complete e bisogna guardare nel codice sorgente. D'altra parte, per avere un controllo completo su ciò che accade, la funzione 'ratchet' può essere realizzata anche autonomamente (vedi il mio a riguardo).
Conclusione
Prima di iniziare a preparare questo materiale, ho deciso di cercare: qualcuno ne avrà già scritto su Habr? Ho trovato solo con , dove dice:
Per quanto ne so, non ci sono integrazioni con Jenkins o plugin Maven […] In realtà, qualsiasi appassionato potrebbe collegare IDEA Community Edition e Jenkins, molti ne trarrebbero solo vantaggio.
Ebbene: dopo due anni abbiamo il Warnings NG Plugin, e finalmente questa amicizia si è concretizzata!
Fonte: habr.com
