IntelliJ IDEA llum għandha l-aktar analizzatur tal-kodiċi Java statiku avvanzat, li fil-kapaċitajiet tiegħu jħalli ħafna lura tali "veterani" bħal и . Il-bosta "spezzjonijiet" tagħha jiċċekkjaw il-kodiċi f'diversi aspetti, minn stil ta 'kodifikazzjoni għal bugs tipiċi.
Madankollu, sakemm ir-riżultati tal-analiżi jintwerew biss fl-interface lokali tal-IDE tal-iżviluppatur, huma ta 'ftit użu għall-proċess tal-iżvilupp. Analiżi statika Bħala l-ewwel pass tal-pipeline tal-bini, ir-riżultati tiegħu għandhom jiddefinixxu xtiebi ta 'kwalità, u l-bini għandu jonqos jekk il-gradi ta' kwalità ma jgħaddux. Huwa magħruf li TeamCity CI huwa integrat ma 'IDEA. Imma anki jekk ma tużax TeamCity, tista' faċilment tipprova tmexxi spezzjonijiet IDEA fi kwalunkwe server CI ieħor. Nissuġġerixxi li tara kif dan jista 'jsir billi tuża IDEA Community Edition, Jenkins u Warnings NG plugin.
Pass 1. Mexxi l-analiżi fil-kontenitur u tikseb rapport
Għall-ewwel, l-idea li titħaddem IDE (applikazzjoni tad-desktop!) ġewwa sistema CI li m'għandhiex interface grafika tista 'tidher dubjuża u idejqek ħafna. Fortunatament, l-iżviluppaturi IDEA pprovdew l-abbiltà li jaħdmu и mil-linja tal-kmand. Barra minn hekk, biex titħaddem IDEA f'dan il-mod, mhix meħtieġa sottosistema tal-grafika u dawn il-kompiti jistgħu jitwettqu fuq servers b'qoxra ta 'test.
L-ispezzjonijiet huma mnedija bl-użu ta 'skript bin/inspect.sh mid-direttorju tal-installazzjoni tal-IDEA. Il-parametri meħtieġa huma:
- triq sħiħa għall-proġett (dawk relattivi mhumiex appoġġjati),
- mogħdija għall-fajl .xml b'settings ta 'spezzjoni (normalment jinsabu ġewwa l-proġett f'.idea/inspectionProfiles/Project_Default.xml),
- mogħdija sħiħa għall-folder li fih se jinħażnu fajls .xml b'rapporti dwar ir-riżultati tal-analiżi.
Barra minn hekk, huwa mistenni li
- il-mogħdija għall-SDK Java se tiġi kkonfigurata fl-IDE, inkella l-analiżi ma taħdimx. Dawn is-settings jinsabu fil-fajl tal-konfigurazzjoni
jdk.table.xmlfil-folder tal-konfigurazzjoni globali IDEA. Il-konfigurazzjoni globali IDEA nnifisha tinsab fid-direttorju tad-dar tal-utent b'mod awtomatiku, iżda dan il-post fil-fajlidea.properties. - Il-proġett analizzat għandu jkun proġett IDEA validu, li għalih ser ikollok tikkommetti xi fajls li normalment jiġu injorati għall-kontroll tal-verżjoni, jiġifieri:
.idea/inspectionProfiles/Project_Default.xml— settings tal-analizzatur, ovvjament se jintużaw meta jsiru spezzjonijiet fil-kontenitur,.idea/modules.xml- inkella se nġibu l-iżball "Dan il-proġett ma fih l-ebda moduli",.idea/misc.xml- inkella jkollna l-iżball "Il-JDK mhux ikkonfigurat sew għal dan il-proġett",*.iml-файлы— inkella jkollna żball dwar JDK mhux ikkonfigurat fil-modulu.
Għalkemm dawn il-fajls huma ġeneralment inklużi fil .gitignore, ma fihom ebda informazzjoni speċifika għall-ambjent ta 'żviluppatur partikolari - b'differenza, pereżempju, fajl workspace.xml, fejn tali informazzjoni tkun tinsab, u għalhekk m'hemmx bżonn li tiġi impenjata.
Is-soluzzjoni ovvja hija li l-JDK jiġi ppakkjat flimkien mal-IDEA Community Edition f'kontenitur f'forma lesta biex tiġi "pitted" fuq il-proġetti analizzati. Ejja nagħżlu kontenitur bażi adattat, u dan huwa dak li se jkun Dockerfile tagħna:
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 -v2Bl-użu tal-għażla idea.config.path sfurzajna IDEA tfittex il-konfigurazzjoni globali tagħha fil-folder /etc/idea, Minħabba li l-folder tad-dar tal-utent meta jaħdem f'CI huwa ħaġa inċerta u ħafna drabi kompletament assenti.
Dan huwa kif jidher il-fajl ikkupjat fil-kontenitur: jdk.table.xml, li fih il-mogħdijiet għal OpenJDK installati ġewwa l-kontenitur (fajl simili mid-direttorju tiegħek stess b'settings IDEA jista' jittieħed bħala bażi):
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-immaġni lest .
Qabel ma nkomplu, ejja niċċekkjaw li l-analizzatur IDEA qed jaħdem fil-kontenitur:
docker run --rm -v <путь/к/вашему/проекту>:/var/project inponomarev/intellij-idea-analyzerL-analiżi għandha taħdem b'suċċess, u bosta fajls .xml b'rapporti tal-analizzaturi għandhom jidhru fis-subfolder target/idea_inspections.
Issa m'għadx hemm ebda dubju li l-analizzatur IDEA jista 'jinħadem waħdu fi kwalunkwe ambjent CI, u ngħaddu għat-tieni pass.
Pass 2. Uri u janalizza r-rapport
Li tikseb ir-rapport fil-forma ta 'fajls .xml hija nofs il-battalja issa trid tagħmilha tinqara mill-bniedem. U wkoll ir-riżultati tagħha għandhom jintużaw fil-gradi tal-kwalità - il-loġika biex jiġi ddeterminat jekk il-bidla aċċettata tgħaddix jew tonqos skont kriterji ta 'kwalità.
Dan se jgħinna , li ġiet rilaxxata f'Jannar 2019. Bil-miġja tagħha, ħafna plugins individwali biex jaħdmu b'riżultati ta 'analiżi statika f'Jenkins (CheckStyle, FindBugs, PMD, eċċ.) issa huma mmarkati bħala skaduti.
Il-plugin jikkonsisti f'żewġ partijiet:
- kolletturi numerużi ta' messaġġi analizzaturi ( jinkludi l-analizzaturi kollha magħrufa fix-xjenza minn AcuCobol sa ZPT Lint),
- telespettatur tar-rapport wieħed għalihom kollha.
Il-lista ta 'affarijiet li Warnings NG jista' janalizza tinkludi twissijiet mill-kompilatur Java u twissijiet minn zkuk ta 'eżekuzzjoni ta' Maven: għalkemm huma viżibbli b'mod kostanti, rari jiġu analizzati speċifikament. Ir-rapporti ta' IntelliJ IDEA huma inklużi wkoll fil-lista ta' formati rikonoxxuti.
Peress li l-plugin huwa ġdid, inizjalment jinteraġixxi tajjeb ma 'Jenkins Pipeline. Il-pass tal-bini bil-parteċipazzjoni tiegħu se jidher bħal dan (sempliċement ngħidu lill-plugin liema format tar-rapport nagħrfu u liema fajls għandhom jiġu skennjati):
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-interface tar-rapport tidher bħal din:

B'mod konvenjenti, din l-interface hija universali għall-analizzaturi rikonoxxuti kollha. Fiha dijagramma interattiva tad-distribuzzjoni tas-sejbiet skont il-kategorija u graff tad-dinamika tal-bidliet fin-numru ta 'sejbiet. Tista 'twettaq tfittxija malajr fil-grilja fil-qiegħ tal-paġna. L-unika ħaġa li ma ħadmitx b'mod korrett għall-ispezzjonijiet IDEA kienet l-abbiltà li jibbrawżjaw il-kodiċi direttament f'Jenkins (għalkemm għal rapporti oħra, pereżempju Checkstyle, dan il-plugin jista 'jagħmel dan b'mod sabiħ). Jidher li dan huwa bug fil-parser tar-rapport IDEA li jeħtieġ li jiġi ffissat.
Fost il-karatteristiċi ta 'Twissijiet NG hemm il-kapaċità li sejbiet aggregati minn sorsi differenti f'rapport wieħed u l-programm Quality Gates, inkluż "ratchet" għall-assemblaġġ ta' referenza. Xi dokumentazzjoni tal-programmazzjoni ta' Quality Gates hija disponibbli - madankollu, mhuwiex komplut, u trid tħares lejn il-kodiċi tas-sors. Min-naħa l-oħra, għal kontroll sħiħ fuq dak li qed jiġri, il-“ratchet” jista’ jiġi implimentat b’mod indipendenti (ara tiegħi dwar din it-tema).
Konklużjoni
Qabel ma bdejt nipprepara dan il-materjal, iddeċidejt li nfittex: diġà kiteb xi ħadd dwar dan is-suġġett fuq Habré? sibt biss с fejn jgħid:
Safejn naf jien, m'hemm l-ebda integrazzjoni ma 'Jenkins jew plugin maven [...] Fil-prinċipju, kull dilettant jista' jagħmel ħbieb ma 'IDEA Community Edition u Jenkins, ħafna jibbenefikaw biss minn dan.
Ukoll, sentejn wara għandna Warnings NG Plugin, u fl-aħħar din il-ħbiberija waslet għall-frott!
Sors: www.habr.com
