Jenkinsda IntelliJ IDEA tekshiruvlarini ishga tushiring

IntelliJ IDEA bugungi kunda eng ilg'or statik Java kod analizatoriga ega bo'lib, u o'z imkoniyatlariga ko'ra "faxriylarni" ortda qoldiradi. Tekshirish uslubi и Spotbuglar. Uning ko'p sonli "tekshirishlari" kodni turli jihatlarda, kodlash uslubidan tortib odatiy xatolargacha tekshiradi.

Biroq, tahlil natijalari faqat ishlab chiquvchi IDE ning mahalliy interfeysida ko'rsatilsa, ular ishlab chiqish jarayonida unchalik foydali bo'lmaydi. Statik tahlil bajarilishi kerak Qurilish quvurining birinchi bosqichi sifatida uning natijalari sifatli eshiklarni belgilashi kerak va agar sifatli eshiklar o'tkazilmasa, qurilish muvaffaqiyatsiz bo'lishi kerak. Ma'lumki, TeamCity CI IDEA bilan integratsiyalashgan. Ammo TeamCity-dan foydalanmasangiz ham, IDEA tekshiruvlarini boshqa istalgan CI serverida osonlik bilan bajarishga urinib ko'rishingiz mumkin. Men buni IDEA Community Edition, Jenkins va Warnings NG plaginlari yordamida qanday amalga oshirish mumkinligini ko'rishni taklif qilaman.

Qadam 1. Konteynerda tahlilni o'tkazing va hisobot oling

Dastlab, grafik interfeysga ega bo'lmagan CI tizimida IDE (ish stoli ilovasi!) ni ishga tushirish g'oyasi shubhali va juda muammoli ko'rinishi mumkin. Yaxshiyamki, IDEA ishlab chiquvchilari ishlash imkoniyatini taqdim etdilar kodni formatlash и tekshiruvlar buyruq satridan. Bundan tashqari, IDEA-ni ushbu rejimda ishga tushirish uchun grafik quyi tizim talab qilinmaydi va bu vazifalar matn qobig'i bo'lgan serverlarda bajarilishi mumkin.

Tekshiruvlar skript yordamida boshlanadi bin/inspect.sh IDEA o'rnatish katalogidan. Kerakli parametrlar:

  • loyihaga to'liq yo'l (qarindoshlari qo'llab-quvvatlanmaydi),
  • tekshirish sozlamalari bilan .xml fayliga yo'l (odatda loyiha ichida .idea/inspectionProfiles/Project_Default.xml ichida joylashgan),
  • tahlil natijalari bo'yicha hisobotlar bilan .xml fayllar saqlanadigan papkaga to'liq yo'l.

Bundan tashqari, kutilmoqda

  • Java SDK ga yo'l IDEda sozlanadi, aks holda tahlil ishlamaydi. Ushbu sozlamalar konfiguratsiya faylida mavjud jdk.table.xml IDEA global konfiguratsiya papkasida. IDEA global konfiguratsiyasining o'zi sukut bo'yicha foydalanuvchining uy katalogida joylashgan, ammo bu joy aniq belgilanishi mumkin faylda idea.properties.
  • Tahlil qilinayotgan loyiha haqiqiy IDEA loyihasi bo'lishi kerak, buning uchun siz odatda versiya boshqaruviga e'tibor berilmaydigan ba'zi fayllarni topshirishingiz kerak bo'ladi, xususan:
    • .idea/inspectionProfiles/Project_Default.xml - analizator sozlamalari, ular konteynerda tekshirish paytida qo'llanilishi aniq;
    • .idea/modules.xml — aks holda biz “Ushbu loyihada modul yoʻq” xatosi paydo boʻladi,
    • .idea/misc.xml — aks holda biz “JDK ushbu loyiha uchun toʻgʻri sozlanmagan” xatosini olamiz,
    • *.iml-файлы — aks holda biz modulda sozlanmagan JDK haqida xatolikka duch kelamiz.

Ushbu fayllar odatda kiritilgan bo'lsa-da .gitignore, ularda, masalan, fayldan farqli o'laroq, ma'lum bir ishlab chiquvchining muhitiga xos bo'lgan ma'lumotlar mavjud emas workspace.xml, agar bunday ma'lumotlar mavjud bo'lsa va shuning uchun uni bajarishga hojat yo'q.

Aniq yechim JDK ni IDEA Community Edition bilan birgalikda tahlil qilinayotgan loyihalarda “chuqurlikdan chiqarish” uchun tayyor shakldagi konteynerga joylashtirishdir. Keling, mos keladigan asosiy konteynerni tanlaylik va bizning Dockerfile shunday bo'ladi:

Docker fayli

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

Variantdan foydalanish idea.config.path biz IDEA ni o'zining global konfiguratsiyasini papkadan izlashga majbur qildik /etc/idea, chunki CIda ishlaganda foydalanuvchining uy papkasi noaniq narsa va ko'pincha umuman yo'q.

Konteynerga ko'chirilgan fayl shunday ko'rinadi: jdk.table.xml, konteyner ichida o'rnatilgan OpenJDK ga yo'llarni o'z ichiga oladi (asos sifatida IDEA sozlamalari bilan shaxsiy katalogingizdan shunga o'xshash fayl olinishi mumkin):

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>

Tayyor rasm Docker Hub-da mavjud.

Davom etishdan oldin IDEA analizatorining konteynerda ishlayotganligini tekshirib ko'ramiz:

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

Tahlil muvaffaqiyatli bajarilishi kerak va maqsad/idea_inspections pastki papkasida analizator hisobotlari bilan ko'p sonli .xml fayllar paydo bo'lishi kerak.

Endi IDEA analizatorining har qanday CI muhitida mustaqil ishlashiga shubha yo'q va biz ikkinchi bosqichga o'tamiz.

Qadam 2. Hisobotni ko'rsatish va tahlil qilish

Hisobotni .xml fayllari ko'rinishida olish - bu kurashning yarmi; endi siz uni odamlar o'qiy oladigan qilib qo'yishingiz kerak. Va shuningdek, uning natijalari sifat eshiklarida qo'llanilishi kerak - qabul qilingan o'zgarish sifat mezonlariga muvofiq o'tish yoki muvaffaqiyatsizligini aniqlash mantig'i.

Bu bizga yordam beradi Jenkins Warnings NG plagini2019 yil yanvar oyida chiqarilgan. Uning paydo bo'lishi bilan Jenkins'dagi statik tahlil natijalari bilan ishlash uchun ko'plab individual plaginlar (CheckStyle, FindBugs, PMD va boshqalar) endi eskirgan deb belgilangan.

Plagin ikki qismdan iborat:

  • ko'plab analizator xabar yig'uvchilar (to'liq ro'yxat AcuCoboldan ZPT Lintgacha fanga ma'lum bo'lgan barcha analizatorlarni o'z ichiga oladi),
  • ularning barchasi uchun bitta hisobot ko'rish vositasi.

Warnings NG tahlil qilishi mumkin bo'lgan narsalar ro'yxati Java kompilyatoridan ogohlantirishlarni va Maven ijro jurnallaridan ogohlantirishlarni o'z ichiga oladi: ular doimo ko'rinadigan bo'lsa-da, ular kamdan-kam hollarda maxsus tahlil qilinadi. IntelliJ IDEA hisobotlari ham tan olingan formatlar ro'yxatiga kiritilgan.

Plagin yangi bo'lgani uchun dastlab Jenkins Pipeline bilan yaxshi o'zaro ta'sir qiladi. Uning ishtirokida qurish bosqichi quyidagicha ko'rinadi (biz plaginga qaysi hisobot formatini taniymiz va qaysi fayllarni skanerlash kerakligini aytamiz):

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')]
    )
}

Hisobot interfeysi quyidagicha ko'rinadi:

Jenkinsda IntelliJ IDEA tekshiruvlarini ishga tushiring

Qulaylik bilan, ushbu interfeys barcha tan olingan analizatorlar uchun universaldir. Unda topilmalarning toifalar bo‘yicha taqsimlanishining interaktiv diagrammasi va topilmalar sonining o‘zgarish dinamikasi grafigi mavjud. Siz sahifaning pastki qismidagi katakchada tezkor qidiruvni amalga oshirishingiz mumkin. IDEA tekshiruvlari uchun to'g'ri ishlamagan yagona narsa bu kodni to'g'ridan-to'g'ri Jenkins-da ko'rib chiqish qobiliyati edi (garchi boshqa hisobotlar uchun, masalan, Checkstyle, ushbu plagin buni juda yaxshi qila oladi). Bu IDEA hisobot tahlilchisida tuzatilishi kerak bo'lgan xato kabi ko'rinadi.

Warnings NG ning xususiyatlari orasida turli manbalardan olingan ma'lumotlarni bitta hisobotda va "Sifat Gates" dasturida jamlash, shu jumladan mos yozuvlar yig'ilishi uchun "ratchet" mavjud. Ba'zi Quality Gates dasturlash hujjatlari mavjud shu yerda - ammo, u to'liq emas va siz manba kodiga qarashingiz kerak. Boshqa tomondan, nima sodir bo'layotganini to'liq nazorat qilish uchun "ratchet" mustaqil ravishda amalga oshirilishi mumkin (qarang. predudushchiy post bu mavzu haqida).

xulosa

Ushbu materialni tayyorlashni boshlashdan oldin, men qidirishga qaror qildim: kimdir Habré-da ushbu mavzu bo'yicha allaqachon yozganmi? Men faqat topdim intervyu 2017 с lanyqaerda u aytadi:

Men bilishimcha, Jenkins yoki maven plaginlari bilan integratsiya yo'q [...] Aslida, har qanday ishqiboz IDEA Community Edition va Jenkins bilan do'stlasha oladi, ko'pchilik bundan faqat foyda ko'radi.

Ikki yildan so'ng bizda Warnings NG Plugin bor va nihoyat bu do'stlik amalga oshdi!

Manba: www.habr.com

a Izoh qo'shish