IntelliJ IDEA oggi dispone dell'analizzatore statico di codice Java più avanzato, superando di gran lunga "veterani" come e . Le sue numerose "ispezioni" controllano il codice in vari aspetti, dallo stile di codifica ai bug caratteristici.
Tuttavia, al momento i risultati dell'analisi vengono visualizzati solo nell'interfaccia locale dell'IDE dello sviluppatore, e sono poco utili per il processo di sviluppo. L'analisi statica come primo passo della pipeline di build, i suoi risultati devono determinare i quality gates, e la build deve fallire se i quality gates non vengono superati. È noto che TeamCity CI è integrato con IDEA. Ma anche se non utilizzi TeamCity, puoi comunque provare a eseguire le ispezioni di IDEA in qualsiasi altro server CI. Propongo di vedere come farlo utilizzando l'IDEA Community Edition, Jenkins e il plugin Warnings NG.
Passo 1. Avvia l'analisi in un contenitore e ricevi un report
Inizialmente, l'idea di avviare l'IDE (un'applicazione desktop!) all'interno di un sistema CI privo di interfaccia grafica può sembrare discutibile e molto complicata. Fortunatamente, gli sviluppatori di IDEA hanno fornito la possibilità di eseguire e dalla riga di comando. Infatti, per avviare IDEA in questo modo non è necessaria una sottosistema grafico e queste operazioni possono essere eseguite su server con shell testuale.
L'esecuzione delle ispezioni avviene tramite lo script bin/inspect.sh dalla directory di installazione di IDEA. Sono richiesti i seguenti parametri:
- il percorso completo del progetto (non sono supportati i percorsi relativi),
- 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 della cartella in cui saranno salvati i file .xml con i report dei risultati dell'analisi.
Inoltre, si prevede che
- in IDEA sia impostato il percorso al Java SDK, altrimenti l'analisi non funzionerà. Queste impostazioni si trovano nel file di configurazione
jdk.table.xmlnella cartella di configurazione globale di IDEA. La configurazione globale di IDEA si trova per impostazione predefinita nella directory home dell'utente, ma questa posizione nel fileidea.properties. - il progetto in fase di analisi deve essere un progetto valido di IDEA, per il quale nei sistemi di controllo versioni sarà necessario commettere alcuni file che di solito vengono ignorati, ovvero:
.idea/inspectionProfiles/Project_Default.xml— le impostazioni dell'analizzatore verranno sicuramente utilizzate durante l'avvio delle ispezioni nel contenitore,.idea/modules.xml— altrimenti otterremo un errore ‘Questo progetto non contiene moduli’,.idea/misc.xml— altrimenti otterremo un errore ‘Il JDK non è configurato correttamente per questo progetto’,*.iml-fili— altrimenti otterremo un errore riguardante il JDK non configurato nel modulo.
Anche se di solito questi file vengono inclusi in .gitignore, non contengono alcuna informazione specifica per l'ambiente del singolo sviluppatore — a differenza, ad esempio, del file workspace.xml, dove tale informazione è presente, e quindi non deve essere commesso.
Naturalmente, si propone di confezionare il JDK insieme a IDEA Community Edition in un contenitore in un formato pronto per essere ‘inviato’ ai progetti da analizzare. Scegliamo un contenitore di base appropriato, ecco quale sarà il nostro 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 -v2Utilizzando l'opzione idea.config.path abbiamo costretto IDEA a cercare la sua configurazione globale nella cartella /etc/idea, poiché la home directory dell'utente in condizioni di lavoro CI è una cosa incerta e spesso del tutto assente.
Ecco come appare il file copiato nel contenitore jdk.table.xml, che specifica i percorsi verso OpenJDK installato all'interno del contenitore (può essere utilizzato un file simile dalla tua propria directory con le impostazioni di IDEA):
jdk.table.xml
Immagine in formato pronto .
Prima di andare avanti, verifichiamo l'avvio dell'analizzatore IDEA nel contenitore:
docker run --rm -v :/var/project inponomarev/intellij-idea-analyzerL'analisi dovrebbe completarsi con successo e nella sottocartella target/idea_inspections dovrebbero apparire numerosi file .xml con i rapporti dell'analizzatore.
Non ci sono più dubbi 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, la logica che determina se le modifiche accettate soddisfano i criteri di qualità.
In questo ci aiuterà , il cui rilascio è avvenuto nel gennaio 2019. Con il suo arrivo, molti plugin separati per lavorare con i risultati dell'analisi statica in Jenkins (CheckStyle, FindBugs, PMD, ecc.) sono ora segnati come obsoleti.
Il plugin è composto da due parti:
- numerosi raccoglitori di messaggi degli analizzatori ( include tutti gli analizzatori conosciuti dalla scienza, da AcuCobol a ZPT Lint),
- un visualizzatore di rapporti unico per tutti loro.
Nel repertorio di ciò che Warnings NG è in grado di analizzare ci sono, tra l'altro, avvisi del compilatore Java e avvisi dai log di esecuzione di Maven: sebbene siano sempre in vista, raramente vengono analizzati deliberatamente. Anche i rapporti di IntelliJ IDEA rientrano tra i formati riconosciuti.
Poiché il plugin è nuovo, interagisce bene con Jenkins Pipeline. Un passo di costruzione con il suo coinvolgimento apparirà nel seguente modo (stiamo semplicemente dicendo al plugin quale formato di rapporto riconosciamo e quali file devono essere scansionati):
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 del rapporto appare in questo modo:

È utile che questa interfaccia sia universale per tutti gli analizzatori riconosciuti. Contiene un grafico interattivo di distribuzione delle scoperte per categorie e un grafico sull'andamento del numero di scoperte. Nella griglia in fondo alla pagina è possibile effettuare ricerche rapide. L'unica cosa che le ispezioni IDEA non riuscivano a fare correttamente è la possibilità di navigare nel codice direttamente in Jenkins (anche se per altri rapporti, ad esempio Checkstyle, questo plugin è in grado di farlo in modo elegante). Sembra essere un bug nel parser dei rapporti IDEA, che dovrà essere corretto.
Tra le capacità di Warnings NG c'è la possibilità di aggregare in un unico rapporto scoperte da fonti diverse e di programmare Quality Gates, incluso un "ratchet" su una build di riferimento. Alcune documentazioni sulla programmazione di Quality Gates sono disponibili. — tuttavia, non è completa e bisogna guardare nei sorgenti. D'altra parte, per avere un controllo completo su ciò che accade, è possibile implementare il "ratchet" anche autonomamente (vedi il mio su questo argomento).
Conclusione
Prima di iniziare a preparare questo materiale, ho deciso di cercare: qualcuno ha già scritto qualcosa su questo argomento su Habr? Ho trovato solo con , dove dice:
Per quanto ne so, non esiste un'integrazione con Jenkins o un plugin Maven […] In linea di principio, chiunque sia appassionato potrebbe collegare l'IDEA Community Edition e Jenkins, molti ne trarrebbero solo giovamento.
Cosa abbiamo: dopo due anni abbiamo il Warnings NG Plugin e finalmente questa amicizia si è realizzata!
Fonte: habr.com
