IntelliJ IDEA Inspections futtatása a Jenkins-en

Az IntelliJ IDEA ma a legfejlettebb statikus Java kódelemzővel rendelkezik, amely képességeit tekintve olyan "veteránokat" hagyott maga mögött, mint pl. ellenőrizze a stílust и Spotbugs. Számos "ellenőrzése" ellenőrzi a kódot különböző szempontok szerint, a kódolási stílustól a jellegzetes hibákig.

Amíg azonban az elemzés eredményei csak a fejlesztő helyi IDE-jében jelennek meg, addig nem sok hasznuk van a fejlesztési folyamatnak. Statikus elemzés végre kell hajtani Az építési folyamat első lépéseként annak eredményeinek meg kell határozniuk a minőségi kapukat, és a kivitelezésnek kudarcot kell vallania, ha a minőségi kapuk meghibásodnak. A TeamCity CI köztudottan integrálva van az IDEA-val. De még ha nem is használja a TeamCity-t, akkor is megpróbálhatja futtatni az IDEA vizsgálatokat bármely más CI-kiszolgálón. Azt javaslom, hogy nézzük meg, hogyan lehet ezt megtenni az IDEA Community Edition, a Jenkins és a Warnings NG bővítmény használatával.

1. lépés. Futtassa az elemzést egy tárolóban, és kérjen jelentést

Elsőre kétesnek és nagyon problémásnak tűnhet az ötlet, hogy egy IDE-t (asztali alkalmazást!) futtassunk egy grafikus felülettel nem rendelkező CI-rendszeren belül. Szerencsére az IDEA fejlesztői biztosították a futtatási lehetőséget kód formázás и ellenőrzések a parancssorból. Ráadásul az IDEA ebben a módban történő futtatásához nincs szükség grafikus alrendszerre, és ezeket a feladatokat szöveghéjjal rendelkező szervereken is el lehet végezni.

Az ellenőrzések script segítségével indulnak el bin/inspect.sh az IDEA telepítési könyvtárából. A szükséges paraméterek a következők:

  • a projekt teljes elérési útja (a rokonok nem támogatottak),
  • az ellenőrzési beállításokat tartalmazó .xml fájl elérési útja (általában a projekten belül található, az .idea/inspectionProfiles/Project_Default.xml fájlban),
  • annak a mappának a teljes elérési útja, ahol az elemzési eredményjelentéseket tartalmazó .xml fájlok tárolásra kerülnek.

Emellett várható, hogy

  • a Java SDK elérési útja az IDE-ben lesz konfigurálva, különben az elemzés nem fog működni. Ezeket a beállításokat a konfigurációs fájl tartalmazza. jdk.table.xml az IDEA globális konfigurációs mappájában. Maga az alapértelmezett globális IDEA konfiguráció a felhasználó saját könyvtárában található, de ez a hely kifejezetten beállítható fájlban idea.properties.
  • az elemzett projektnek érvényes IDEA projektnek kell lennie, amelyhez néhány, általában figyelmen kívül hagyott fájlt le kell kötni a verziókezelésre, nevezetesen:
    • .idea/inspectionProfiles/Project_Default.xml — az analizátor beállításai, ezeket nyilvánvalóan a konténerben történő vizsgálatok indításakor fogják használni,
    • .idea/modules.xml - ellenkező esetben "Ez a projekt nem tartalmaz modulokat" hibaüzenetet kapunk,
    • .idea/misc.xml - ellenkező esetben "A JDK nincs megfelelően konfigurálva ehhez a projekthez" hibaüzenetet kapunk,
    • *.iml-файлы - ellenkező esetben hibaüzenetet kapunk a modulban lévő konfigurálatlan JDK-ról.

Bár ezek a fájlok általában benne vannak .gitignore, nem tartalmaznak semmilyen, egy adott fejlesztő környezetére jellemző információt – ellentétben például egy fájllal workspace.xml, ahol ilyen információ, csak, található, és ezért nem szükséges elkötelezni.

A kiút önmagában is azt sugallja, hogy a JDK-t az IDEA Community Edition-nel együtt egy konténerbe kell csomagolni olyan formában, amely készen áll arra, hogy az elemzett projekteken „beállíthassa”. Válasszunk ki egy megfelelő alapkonténert, és itt van a Dockerfile, amit kapunk:

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

Az opció használata idea.config.path az IDEA-val megkerestük a globális konfigurációját a mappában /etc/idea, hiszen a felhasználó saját mappája a munkakörülmények között a CI-ben határozatlan dolog és gyakran teljesen hiányzik.

Így néz ki a tárolóba másolt fájl jdk.table.xml, amely a tárolóba telepített OpenJDK elérési útjait tartalmazza (a saját IDEA beállítási könyvtárában található hasonló fájlon alapulhat):

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>

Kész kép elérhető a Docker Hubon.

Mielőtt továbblépnénk, teszteljük az IDEA elemző futtatását a tárolóban:

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

Az elemzésnek sikeresnek kell lennie, és számos .xml fájlnak kell megjelennie az elemző jelentésekkel a target/idea_inspections almappában.

Most már nem kétséges, hogy az IDEA analizátor önálló módban futtatható bármely CI környezetben, és továbblépünk a második lépésre.

2. lépés Jelenítse meg és elemezze a jelentést

A jelentés .xml formátumú beszerzése fél siker, most már ember által olvashatóvá kell tenni. És az eredményeit a minőségi kapukban is fel kell használni - a logikát annak meghatározására, hogy az elfogadott változtatás a minőségi kritériumok szerint megfelel-e vagy sem.

Ez segíteni fog nekünk Jenkins Warnings NG pluginamely 2019 januárjában jelent meg. Bevezetésével számos külön beépülő modul a Jenkins statikus elemzési eredményeivel való munkavégzéshez (CheckStyle, FindBugs, PMD stb.) elavultként lett megjelölve.

A plugin két részből áll:

  • számos elemző üzenetgyűjtő (teljes lista tartalmazza a tudomány által ismert összes analizátort, az AcuCoboltól a ZPT Lintig),
  • egyetlen jelentésnéző mindegyikhez.

A Warnings NG által elemezni tudó dolgok listája tartalmazza a Java fordítói figyelmeztetéseket és a Maven végrehajtási naplókból származó figyelmeztetéseket: bár ezek folyamatosan láthatók, ritkán elemzik őket szándékosan. Az IntelliJ IDEA jelentések is szerepelnek az elismert formátumok listáján.

Mivel a bővítmény új, kezdetben jól működik a Jenkins Pipeline-nal. Az építési lépés az ő részvételével így fog kinézni (csak megmondjuk a bővítménynek, hogy melyik jelentésformátumot ismerjük fel, és mely fájlokat kell vizsgálni):

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

A jelentés felülete így néz ki:

IntelliJ IDEA Inspections futtatása a Jenkins-en

Kényelmes, hogy ez a felület univerzális minden felismerhető elemző számára. Tartalmazza a leletek kategóriánkénti megoszlásának interaktív diagramját, valamint a leletszám változásának dinamikájának grafikonját. Az oldal alján található rácsban gyors keresést végezhet. Az egyetlen dolog, ami nem működött megfelelően az IDEA ellenőrzéseknél, az volt, hogy közvetlenül a Jenkinsben lehetett böngészni a kódot (bár más jelentéseknél, például a Checkstyle-nál ez a beépülő modul gyönyörűen meg tudja csinálni). Úgy tűnik, hogy ez az IDEA jelentéselemző hibája, amelyet javítani kell.

A Warnings NG szolgáltatásai közé tartozik az a képesség, hogy a különböző forrásokból származó eredményeket egyetlen jelentésben összesítsék, és minőségi kapukat programozzák, beleértve a referencia-összeállításhoz szükséges „racsnis”-t is. Néhány Quality Gates programozási dokumentáció elérhető itt - azonban nem teljes, és meg kell nézni a forrást. Másrészt a történések teljes ellenőrzéséhez a „racsnis” önállóan is megvalósítható (lásd a előző poszt erről a témáról).

Következtetés

Mielőtt elkezdtem volna elkészíteni ezt az anyagot, úgy döntöttem, megnézem: írt már valaki ebben a témában a Habrén? csak találtam interjú 2017 с Lanyahol ez áll:

Amennyire én tudom, nincs integráció a Jenkins-szel vagy egy maven pluginnal [...] Elvileg minden rajongó barátságot köthetne az IDEA Community Edition-szel és a Jenkins-szel, sokaknak csak haszna származna ebből.

Nos, két év után megvan a Warnings NG Plugin, és végre ez a barátság valóra vált!

Forrás: will.com

Hozzászólás