Ngajalankeun pamariksaan IntelliJ IDEA on Jenkins

IntelliJ IDEA ayeuna gaduh analisa kode statik Java anu paling canggih, anu dina kamampuanna ngantunkeun "veteran" sapertos kitu. Gaya cek и Spotbugs. 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 kudu dicumponan 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 pormat kode и pamariksaan 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.xml dina folder konfigurasi global IDEA. Konfigurasi global IDEA sorangan ayana dina diréktori imah pamaké sacara standar, tapi lokasi ieu bisa sacara eksplisit dieusian dina file idea.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 -v2

Ngagunakeun 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 sadia on Docker Hub.

Sateuacan ngaléngkah, hayu urang pariksa yén analisa IDEA dijalankeun dina wadahna:

docker run --rm -v <путь/к/вашему/проекту>:/var/project inponomarev/intellij-idea-analyzer

Analisis 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 Jenkins Warnings NG Plugin, 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 (daptar lengkep 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:

Ngajalankeun pamariksaan IntelliJ IDEA on Jenkins

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 di dieu - 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 pos saméméhna 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 wawancara 2017 с lannydimana 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

Mésér hosting anu dipercaya pikeun situs anu gaduh panyalindungan DDoS, server VPS VDS 🔥 Meser hosting situs wéb anu tiasa dipercaya nganggo panyalindungan DDoS, server VPS VDS | ProHoster