„IntelliJ IDEA“ šiandien turi pažangiausią statinį „Java“ kodų analizatorių, kuris savo galimybėmis gerokai atsilieka nuo tokių „veteranų“ kaip и . Daugybė „patikrų“ tikrina kodą įvairiais aspektais, nuo kodavimo stiliaus iki tipiškų klaidų.
Tačiau tol, kol analizės rezultatai rodomi tik vietinėje kūrėjo IDE sąsajoje, kūrimo procesui jie mažai naudingi. Statinė analizė Kaip pirmasis tiesimo dujotiekio žingsnis, jo rezultatai turėtų apibrėžti kokybės vartus, o statyba turėtų nepavykti, jei kokybės vartai nepraeina. Yra žinoma, kad TeamCity CI yra integruota su IDEA. Bet net jei nenaudojate TeamCity, galite lengvai pabandyti atlikti IDEA patikrinimus bet kuriame kitame CI serveryje. Siūlau pamatyti, kaip tai galima padaryti naudojant IDEA Community Edition, Jenkins ir Warnings NG papildinį.
1 veiksmas. Paleiskite analizę konteineryje ir gaukite ataskaitą
Iš pradžių idėja paleisti IDE (darbalaukio programą!) CI sistemoje, kurioje nėra grafinės sąsajos, gali atrodyti abejotina ir labai varginanti. Laimei, IDEA kūrėjai suteikė galimybę paleisti и iš komandinės eilutės. Be to, norint paleisti IDEA šiuo režimu, grafikos posistemis nereikalingas ir šias užduotis galima atlikti serveriuose su tekstiniu apvalkalu.
Patikrinimai pradedami naudojant scenarijų bin/inspect.sh iš IDEA diegimo katalogo. Reikalingi parametrai yra šie:
- visas kelias į projektą (giminaičiai nepalaikomi),
- kelias į .xml failą su tikrinimo nustatymais (paprastai yra projekto viduje .idea/inspectionProfiles/Project_Default.xml),
- visas kelias į aplanką, kuriame bus saugomi .xml failai su analizės rezultatų ataskaitomis.
Be to, tikimasi, kad
- kelias į Java SDK bus sukonfigūruotas IDE, kitaip analizė neveiks. Šie nustatymai yra konfigūracijos faile
jdk.table.xmlIDEA visuotinės konfigūracijos aplanke. Pati IDEA pasaulinė konfigūracija pagal numatytuosius nustatymus yra vartotojo namų kataloge, tačiau ši vieta faileidea.properties. - Analizuojamas projektas turi būti galiojantis IDEA projektas, kuriam turėsite įtraukti kai kuriuos failus, kurie paprastai yra ignoruojami versijos valdymui, būtent:
.idea/inspectionProfiles/Project_Default.xml— analizatoriaus nustatymai, jie akivaizdžiai bus naudojami atliekant indo patikras,.idea/modules.xml- priešingu atveju gausime klaidą „Šiame projekte nėra modulių“,.idea/misc.xml- priešingu atveju gausime klaidą „JDK nėra tinkamai sukonfigūruotas šiam projektui“,*.iml-файлы- kitaip gausime klaidą apie nesukonfigūruotą JDK modulyje.
Nors šie failai paprastai įtraukiami į .gitignore, juose nėra jokios informacijos, būdingos konkretaus kūrėjo aplinkai – skirtingai nei, pavyzdžiui, faile workspace.xml, kur yra tokia informacija, todėl jos pateikti nereikia.
Akivaizdus sprendimas yra supakuoti JDK kartu su IDEA Community Edition į konteinerį tokia forma, kurią būtų galima „įdėti“ į analizuojamus projektus. Išsirinkime tinkamą bazinį konteinerį ir toks bus mūsų 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 -v2Naudojant parinktį idea.config.path privertėme IDEA ieškoti savo visuotinės konfigūracijos aplanke /etc/idea, nes vartotojo namų aplankas dirbant CI yra neaiškus dalykas ir dažnai jo visai nėra.
Štai kaip atrodo į konteinerį nukopijuotas failas: jdk.table.xml, kuriame yra konteinerio viduje įdiegto OpenJDK keliai (panašus failas iš jūsų katalogo su IDEA nustatymais gali būti laikomas pagrindu):
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>Baigtas vaizdas .
Prieš tęsdami patikrinkime, ar konteineryje veikia IDEA analizatorius:
docker run --rm -v <путь/к/вашему/проекту>:/var/project inponomarev/intellij-idea-analyzerAnalizė turėtų būti atlikta sėkmingai, o daugybė .xml failų su analizatoriaus ataskaitomis turėtų būti rodomi poaplanke target/idea_inspections.
Dabar nebėra jokių abejonių, kad IDEA analizatorių galima paleisti atskirai bet kurioje CI aplinkoje, ir pereiname prie antrojo žingsnio.
2 veiksmas. Rodyti ir analizuoti ataskaitą
Ataskaitos gavimas .xml failų pavidalu yra pusė darbo. Taip pat jo rezultatai turėtų būti naudojami kokybės vartuose – logika, leidžianti nustatyti, ar priimtas pakeitimas atitinka kokybės kriterijus, ar ne.
Tai mums padės , kuris buvo išleistas 2019 m. sausio mėn. Atsiradus, daugelis atskirų įskiepių, skirtų darbui su statinės analizės rezultatais sistemoje „Jenkins“ (CheckStyle, FindBugs, PMD ir kt.), dabar pažymėti kaip pasenę.
Papildinys susideda iš dviejų dalių:
- daugybė analizatorių pranešimų rinkėjų ( apima visus mokslui žinomus analizatorius nuo AcuCobol iki ZPT Lint),
- viena ataskaitų peržiūros priemonė visiems.
Daiktų, kuriuos Warnings NG gali analizuoti, sąrašas apima įspėjimus iš „Java“ kompiliatoriaus ir įspėjimus iš „Maven“ vykdymo žurnalų: nors jie nuolat matomi, jie retai analizuojami konkrečiai. IntelliJ IDEA ataskaitos taip pat įtrauktos į pripažintų formatų sąrašą.
Kadangi papildinys yra naujas, iš pradžių jis gerai sąveikauja su Jenkins Pipeline. Kūrimo žingsnis su jo dalyvavimu atrodys taip (tiesiog pasakome papildiniui, kokį ataskaitos formatą atpažįstame ir kokius failus reikia nuskaityti):
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')]
)
}Ataskaitos sąsaja atrodo taip:

Patogiai ši sąsaja yra universali visiems pripažintiems analizatoriams. Joje pateikta interaktyvi radinių pasiskirstymo pagal kategorijas diagrama ir radinių skaičiaus kitimo dinamikos grafikas. Puslapio apačioje esančiame tinklelyje galite atlikti greitą paiešką. Vienintelis dalykas, kuris tinkamai neveikė IDEA tikrinimo metu, buvo galimybė naršyti kodą tiesiogiai „Jenkins“ (nors kitose ataskaitose, pavyzdžiui, „Checkstyle“, šis papildinys gali tai padaryti puikiai). Panašu, kad tai IDEA ataskaitų analizatoriaus klaida, kurią reikia pataisyti.
Tarp Warnings NG ypatybių yra galimybė apibendrinti išvadas iš skirtingų šaltinių vienoje ataskaitoje ir programuoti kokybės vartus, įskaitant etaloninio mazgo „reketą“. Yra keletas „Quality Gates“ programavimo dokumentų - tačiau jis nėra baigtas, ir jūs turite pažvelgti į šaltinio kodą. Kita vertus, norint visiškai kontroliuoti, kas vyksta, „reketas“ gali būti įdiegtas savarankiškai (žr. apie šią temą).
išvada
Prieš pradėdamas ruošti šią medžiagą, nusprendžiau paieškoti: ar kas nors jau rašė šia tema Habré? tik radau с kur jis sako:
Kiek žinau, nėra jokios integracijos su Jenkins ar maven įskiepiu […] Iš esmės bet kuris entuziastas galėtų susidraugauti su IDEA Community Edition ir Jenkins, daugeliui tai būtų tik naudinga.
Na, po dvejų metų turime Warnings NG Plugin ir pagaliau ši draugystė išsipildė!
Šaltinis: www.habr.com
