IntelliJ IDEA ayeuna gaduh analisa kode statik Java anu paling canggih, anu dina kamampuanna ngantunkeun "veteran" sapertos kitu. и . Loba "inspeksi" na pariksa kode dina sagala rupa aspék, ti gaya coding ka bug has.
Sanajan kitu, salami hasil analisa ngan dipintonkeun dina panganteur lokal tina IDE pamekar, aranjeunna tina saeutik gunana pikeun prosés ngembangkeun. Analisis statik Salaku hambalan kahiji tina pipa ngawangun, hasilna kudu nangtukeun Gerbang kualitas, sarta ngawangun kedah gagal lamun Gerbang kualitas teu lulus. Perlu dipikanyaho yén TeamCity CI terpadu sareng IDEA. Tapi sanajan anjeun teu make TeamCity, anjeun bisa kalayan gampang coba ngajalankeun pamariksaan IDEA dina sagala server CI séjén. Abdi nyarankeun anjeun ningali kumaha ieu tiasa dilakukeun nganggo IDEA Community Edition, Jenkins sareng Warnings NG plugin.
Lengkah 1. Jalankeun analisa dina wadahna sareng kéngingkeun laporan
Mimitina, ideu pikeun ngajalankeun IDE (aplikasi desktop!) di jero sistem CI anu henteu ngagaduhan antarmuka grafis sigana sigana curiga sareng nyusahkeun pisan. Untungna, pamekar IDEA geus disadiakeun kamampuhan pikeun ngajalankeun и ti garis paréntah. Sumawona, pikeun ngajalankeun IDEA dina modeu ieu, subsistem grafik henteu diperyogikeun sareng tugas-tugas ieu tiasa dilaksanakeun dina server anu nganggo cangkang téks.
Pamariksaan diluncurkeun nganggo naskah bin/inspect.sh ti diréktori instalasi IDEA. Parameter anu diperyogikeun nyaéta:
- jalur pinuh ka proyék (relatif teu didukung),
- jalur ka file .xml kalawan setélan inspeksi (biasana lokasina di jero proyék di .ide/inspectionProfiles/Project_Default.xml),
- jalur pinuh ka folder nu file .xml kalawan laporan hasil analisis bakal disimpen.
Sajaba ti éta, diperkirakeun yén
- jalur ka Java SDK bakal ngonpigurasi dina IDE, disebutkeun analisis iyeu moal jalan mun. Setelan ieu dikandung dina file konfigurasi
jdk.table.xmldina folder konfigurasi global IDEA. Konfigurasi global IDEA sorangan ayana dina diréktori imah pamaké sacara standar, tapi lokasi ieu dina fileidea.properties. - Proyék anu dianalisis kedah janten proyék IDEA anu sah, dimana anjeun kedah ngalakukeun sababaraha file anu biasana teu dipaliré kana kontrol vérsi, nyaéta:
.idea/inspectionProfiles/Project_Default.xml- Setélan analisa, éta écés bakal dianggo nalika ngajalankeun pamariksaan dina wadahna,.idea/modules.xml- Upami teu kitu, urang bakal nampi kasalahan 'Proyék ieu henteu aya modul',.idea/misc.xml- Upami teu kitu, urang bakal nampi kasalahan 'JDK henteu dikonpigurasi leres pikeun proyék ieu',*.iml-файлы- disebutkeun urang bakal meunang kasalahan ngeunaan hiji JDK unconfigured dina modul.
Sanajan file ieu biasana kaasup kana .gitignore, aranjeunna henteu ngandung inpormasi khusus pikeun lingkungan pamekar khusus - henteu sapertos, contona, file workspace.xml, dimana inpormasi sapertos kitu dikandung, sareng ku kituna henteu kedah ngalakukeunana.
Solusi anu jelas nyaéta ngarangkep JDK sareng IDEA Community Edition kana wadahna dina bentuk anu siap "diadu" dina proyék anu dianalisis. Hayu urang milih wadah dasar anu cocog, sareng ieu mangrupikeun Dockerfile kami:
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 -v2Ngagunakeun pilihan idea.config.path urang kapaksa IDEA néangan konfigurasi global na dina folder /etc/idea, sabab polder imah pangguna nalika damel di CI mangrupikeun hal anu teu pasti sareng sering teu aya.
Ieu mangrupikeun file anu disalin kana wadahna sapertos kieu: jdk.table.xml, anu ngandung jalur ka OpenJDK anu dipasang di jero wadahna (file anu sami tina diréktori anjeun nyalira sareng setélan IDEA tiasa dicandak salaku dasar):
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>Gambar rengse .
Sateuacan ngaléngkah, hayu urang pariksa yén analisa IDEA dijalankeun dina wadahna:
docker run --rm -v <путь/к/вашему/проекту>:/var/project inponomarev/intellij-idea-analyzerAnalisis kedah suksés dijalankeun, sareng seueur file .xml sareng laporan analisa kedah muncul dina subfolder target / idea_inspections.
Ayeuna teu aya deui ragu yén analisa IDEA tiasa dijalankeun mandiri di lingkungan CI mana waé, sareng urang teraskeun kana léngkah anu kadua.
Lengkah 2. Témbongkeun jeung analisa laporan
Kéngingkeun laporan dina bentuk file .xml nyaéta satengah perangna ayeuna anjeun kedah tiasa dibaca ku manusa. Sareng ogé hasilna kedah dianggo dina gerbang kualitas - logika pikeun nangtoskeun naha parobahan anu ditampi pas atanapi gagal dumasar kana kriteria kualitas.
Ieu bakal nulungan urang , anu dirilis dina Januari 2019. Jeung Advent anak, loba plugins individu pikeun gawé bareng hasil analisis statik di Jenkins (CheckStyle, FindBugs, PMD, jsb) ayeuna ditandaan salaku leungit.
Plugin diwangun ku dua bagian:
- seueur kolektor pesen analyzer ( ngawengku sadaya analis anu dipikanyaho ku élmu ti AcuCobol ka ZPT Lint),
- a panempo laporan tunggal pikeun sakabéh éta.
Daptar hal anu Warnings NG bisa nganalisis ngawengku warnings ti compiler Java sarta warnings ti log palaksanaan Maven: sanajan aranjeunna terus katempo, aranjeunna jarang husus dianalisis. Laporan IntelliJ IDEA ogé kalebet dina daptar format anu diakui.
Kusabab plugin anyar, éta mimitina berinteraksi sareng Jenkins Pipeline. Léngkah ngawangun sareng partisipasina bakal sapertos kieu (urang ngan saukur nyarioskeun ka plugin naon format laporan anu kami kenal sareng file naon anu kedah diseken):
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')]
)
}Antarmuka laporan sapertos kieu:

Merenah, panganteur ieu universal pikeun sakabéh analis dipikawanoh. Ieu ngandung hiji diagram interaktif sebaran papanggihan dumasar kategori sarta grafik dinamika parobahan jumlah kapanggih. Anjeun tiasa milarian gancang dina grid di handapeun halaman. Hiji-hijina hal anu henteu tiasa dianggo leres pikeun pamariksaan IDEA nyaéta kamampuan pikeun ngotéktak kode langsung di Jenkins (sanaos pikeun laporan anu sanés, contona Checkstyle, plugin ieu tiasa ngalakukeun ieu kalayan saé). Sigana mah ieu bug dina parser laporan IDEA anu kedah dilereskeun.
Diantara fitur Warnings NG nyaéta kamampuhan pikeun ngumpulkeun papanggihan tina sumber béda dina hiji laporan sarta program Quality Gates, kaasup "ratchet" pikeun assembly rujukan. Sababaraha dokuméntasi programming Quality Gates sadia - kumaha oge, teu lengkep, jeung anjeun kudu kasampak dina kode sumber. Di sisi anu sanésna, pikeun kontrol lengkep dina naon anu lumangsung, "ratchet" tiasa dilaksanakeun sacara mandiri (tingali abdi ngeunaan téma ieu).
kacindekan
Sateuacan ngamimitian nyiapkeun bahan ieu, kuring mutuskeun milarian: saha waé anu parantos nyerat dina topik ieu dina Habré? Kuring ngan kapanggih с dimana anjeunna nyebutkeun:
Sajauh anu kuring terang, teu aya integrasi sareng Jenkins atanapi plugin maven [...] Sacara prinsip, peminat naon waé tiasa janten babaturan sareng IDEA Community Edition sareng Jenkins, seueur anu ngan ukur bakal nguntungkeun tina ieu.
Nya, dua taun ti harita urang gaduh Warnings NG Plugin, sareng tungtungna silaturahim ieu parantos hasil!
sumber: www.habr.com
