Jenkins üzərində IntelliJ IDEA yoxlamalarının aparılması

IntelliJ IDEA bu ​​gün ən qabaqcıl statik Java kod analizatoruna malikdir və bu, öz imkanlarına görə belə "veteranları" çox geridə qoyur. Yoxlama tərzi и Spotbugs. Onun çoxsaylı “təftişləri” kodu kodlaşdırma tərzindən tutmuş tipik səhvlərə qədər müxtəlif aspektlərdə yoxlayır.

Bununla belə, təhlil nəticələri yalnız tərtibatçının IDE-nin yerli interfeysində göstərildiyi müddətcə, onların inkişaf prosesinə çox az faydası var. Statik analiz yerinə yetirilməlidir Tikinti boru kəmərinin ilk addımı olaraq, onun nəticələri keyfiyyət qapılarını müəyyənləşdirməlidir və keyfiyyət qapıları keçməzsə, tikinti uğursuz olmalıdır. Məlumdur ki, TeamCity CI IDEA ilə inteqrasiya olunub. Ancaq TeamCity-dən istifadə etməsəniz belə, istənilən digər CI serverində IDEA yoxlamalarını həyata keçirməyə cəhd edə bilərsiniz. Bunun IDEA Community Edition, Jenkins və Warnings NG plaginindən istifadə edərək necə edilə biləcəyini görməyi təklif edirəm.

Addım 1. Konteynerdə təhlili aparın və hesabat alın

Əvvəlcə qrafik interfeysi olmayan CI sistemində IDE (masaüstü proqram!) işlətmək fikri şübhəli və çox əziyyətli görünə bilər. Xoşbəxtlikdən, IDEA tərtibatçıları işləmək qabiliyyətini təmin etdilər kodun formatlaşdırılması и müayinə komanda xəttindən. Üstəlik, IDEA-nın bu rejimdə işləməsi üçün qrafik alt sistemi tələb olunmur və bu tapşırıqlar mətn qabığı olan serverlərdə yerinə yetirilə bilər.

Yoxlamalar bir skriptdən istifadə etməklə başlanır bin/inspect.sh IDEA quraşdırma kataloqundan. Tələb olunan parametrlər bunlardır:

  • layihəyə tam yol (qohum olanlar dəstəklənmir),
  • yoxlama parametrləri ilə .xml faylına gedən yol (adətən layihənin daxilində .idea/inspectionProfiles/Project_Default.xml-də yerləşir),
  • təhlil nəticələrinə dair hesabatları olan .xml fayllarının saxlanacağı qovluğa gedən tam yol.

Bundan əlavə, gözlənilir

  • Java SDK-ya gedən yol IDE-də konfiqurasiya ediləcək, əks halda təhlil işləməyəcək. Bu parametrlər konfiqurasiya faylında var jdk.table.xml IDEA qlobal konfiqurasiya qovluğunda. IDEA qlobal konfiqurasiyasının özü standart olaraq istifadəçinin ev kataloqunda yerləşir, lakin bu yer açıq şəkildə müəyyən edilə bilər faylda idea.properties.
  • Təhlil edilən layihə etibarlı IDEA layihəsi olmalıdır, bunun üçün siz adətən versiya nəzarətinə məhəl qoyulmayan bəzi faylları qəbul etməli olacaqsınız, yəni:
    • .idea/inspectionProfiles/Project_Default.xml — analizator parametrləri, onlar açıq şəkildə konteynerdə yoxlama apararkən istifadə olunacaq,
    • .idea/modules.xml - əks halda "Bu layihədə modul yoxdur" xətası alacağıq,
    • .idea/misc.xml - əks halda "JDK bu layihə üçün düzgün konfiqurasiya edilməyib" xətası alacağıq,
    • *.iml-файлы — əks halda modulda konfiqurasiya edilməmiş JDK haqqında xəta alacağıq.

Baxmayaraq ki, bu fayllar adətən daxil edilir .gitignore, onlar, məsələn, bir fayldan fərqli olaraq, müəyyən bir inkişaf etdiricinin mühitinə xas olan heç bir məlumatı ehtiva etmirlər workspace.xml, bu cür məlumatların olduğu yerdə və buna görə də onu törətməyə ehtiyac yoxdur.

Açıq həll yolu, JDK-nı IDEA Community Edition ilə birlikdə təhlil edilən layihələrdə “çıxmaq” üçün hazır formada konteynerə yığmaqdır. Gəlin uyğun bir baza konteyneri seçək və Dockerfile belə olacaq:

Docker faylı

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

Seçimdən istifadə etməklə idea.config.path biz IDEA-nı qovluqda qlobal konfiqurasiyasını axtarmağa məcbur etdik /etc/idea, çünki CI-də işləyərkən istifadəçinin ev qovluğu qeyri-müəyyən bir şeydir və çox vaxt tamamilə yoxdur.

Konteynerə kopyalanan fayl belə görünür: jdk.table.xml, konteynerin içərisində quraşdırılmış OpenJDK-ya gedən yolları ehtiva edir (IDEA parametrləri ilə öz kataloqunuzdan oxşar fayl əsas götürülə bilər):

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>

Bitmiş görüntü Docker Hub-da mövcuddur.

Davam etməzdən əvvəl IDEA analizatorunun konteynerdə işlədiyini yoxlayaq:

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

Təhlil uğurla aparılmalı və hədəf/idea_inspections alt qovluğunda analizator hesabatları olan çoxsaylı .xml faylları görünməlidir.

İndi artıq heç bir şübhə yoxdur ki, IDEA analizatoru istənilən CI mühitində müstəqil işləyə bilər və biz ikinci mərhələyə keçirik.

Addım 2. Hesabatı göstərin və təhlil edin

Hesabatı .xml faylları şəklində əldə etmək işin yarısıdır, indi siz onu insanların oxuya biləcəyi hala gətirməlisiniz. Həm də onun nəticələri keyfiyyət qapılarında istifadə edilməlidir - qəbul edilmiş dəyişikliyin keyfiyyət meyarlarına uyğun olaraq keçib-keçmədiyini müəyyən etmək üçün məntiq.

Bu bizə kömək edəcək Jenkins Warnings NG Plugin, 2019-cu ilin yanvar ayında buraxıldı. Onun yaranması ilə Jenkins-də statik analiz nəticələri ilə işləmək üçün bir çox fərdi plaginlər (CheckStyle, FindBugs, PMD və s.) artıq köhnəlmiş kimi qeyd olunur.

Plugin iki hissədən ibarətdir:

  • çoxsaylı analizator mesaj kollektorları (tam siyahı AcuCoboldan ZPT Lint-ə qədər elmə məlum olan bütün analizatorlar daxildir),
  • hamısı üçün vahid hesabat görüntüləyicisi.

Warnings NG-nin təhlil edə biləcəyi şeylərin siyahısına Java tərtibçisindən gələn xəbərdarlıqlar və Maven icra qeydlərindən gələn xəbərdarlıqlar daxildir: onlar daim görünsə də, nadir hallarda xüsusi olaraq təhlil edilir. IntelliJ IDEA hesabatları da tanınmış formatlar siyahısına daxildir.

Plugin yeni olduğu üçün əvvəlcə Jenkins Pipeline ilə yaxşı qarşılıqlı əlaqədə olur. Onun iştirakı ilə qurulma addımı belə görünəcək (sadəcə plaqinə hansı hesabat formatını tanıdığımızı və hansı faylları skan etmək lazım olduğunu söyləyirik):

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

Hesabat interfeysi belə görünür:

Jenkins üzərində IntelliJ IDEA yoxlamalarının aparılması

Rahat olaraq, bu interfeys bütün tanınmış analizatorlar üçün universaldır. O, tapıntıların kateqoriyalar üzrə paylanmasının interaktiv diaqramını və tapıntıların sayında dəyişiklik dinamikasının qrafikini ehtiva edir. Siz səhifənin altındakı şəbəkədə sürətli axtarış edə bilərsiniz. IDEA yoxlamaları üçün düzgün işləməyən yeganə şey birbaşa Jenkins-də koda baxmaq imkanı idi (baxmayaraq ki, digər hesabatlar üçün, məsələn Checkstyle, bu plagin bunu gözəl edə bilər). Deyəsən, bu, IDEA hesabat analizatorunda düzəldilməli olan səhvdir.

Warnings NG-nin xüsusiyyətləri arasında müxtəlif mənbələrdən əldə edilən tapıntıları bir hesabatda və Keyfiyyət Qapıları proqramında, o cümlədən istinad montajı üçün “ratchet”də cəmləşdirmək imkanı var. Bəzi Quality Gates proqramlaşdırma sənədləri mövcuddur burada - lakin tam deyil və mənbə koduna baxmaq lazımdır. Digər tərəfdən, baş verənlərə tam nəzarət etmək üçün "ratchet" müstəqil olaraq həyata keçirilə bilər (bax. предыдущий post bu mövzu haqqında).

Nəticə

Bu materialı hazırlamağa başlamazdan əvvəl axtarmağa qərar verdim: Habré-də bu mövzuda artıq kimsə yazıb? yalnız tapdım müsahibə 2017 с Lanyharada deyir:

Bildiyimə görə, Jenkins və ya maven plagini ilə heç bir inteqrasiya yoxdur [...] Prinsipcə, hər hansı bir həvəskar IDEA Community Edition və Jenkins ilə dostluq edə bilər, çoxları bundan yalnız faydalanacaq.

Yaxşı, iki ildən sonra Warnings NG Plugin-imiz var və nəhayət, bu dostluq nəticə verdi!

Mənbə: www.habr.com

Добавить комментарий