IntelliJ IDEA pārbaužu veikÅ”ana vietnē Jenkins

IntelliJ IDEA Å”odien ir vismodernākais statiskais Java kodu analizators, kas savās spējās atstāj tālu aiz muguras tādus ā€œveterānusā€ kā Pārbaudes stils Šø Spotbugs. Tās daudzās ā€œpārbaudesā€ pārbauda kodu dažādos aspektos, sākot no kodÄ“Å”anas stila lÄ«dz tipiskām kļūdām.

Tomēr, kamēr analīzes rezultāti tiek parādīti tikai izstrādātāja IDE lokālajā saskarnē, izstrādes procesā tie ir maz noderīgi. Statiskā analīze ir jāizpilda Kā pirmais būvniecības cauruļvada solis, tā rezultātiem ir jānosaka kvalitātes vārti, un būvniecībai vajadzētu neizdoties, ja kvalitātes vārti netiek izturēti. Ir zināms, ka TeamCity CI ir integrēts ar IDEA. Bet pat tad, ja neizmantojat TeamCity, varat viegli mēģināt palaist IDEA pārbaudes jebkurā citā CI serverī. Es iesaku jums redzēt, kā to var izdarīt, izmantojot IDEA Community Edition, Jenkins un Warnings NG spraudni.

1. darbÄ«ba. Palaidiet analÄ«zi konteinerā un saņemiet atskaiti

Sākumā ideja palaist IDE (darbvirsmas lietojumprogrammu!) CI sistēmā, kurai nav grafiskā interfeisa, var Ŕķist apÅ”aubāma un ļoti apgrÅ«tinoÅ”a. Par laimi, IDEA izstrādātāji ir nodroÅ”inājuÅ”i iespēju darboties koda formatÄ“Å”ana Šø pārbaudes no komandrindas. Turklāt, lai palaistu IDEA Å”ajā režīmā, grafikas apakÅ”sistēma nav nepiecieÅ”ama, un Å”os uzdevumus var veikt serveros ar teksta apvalku.

Pārbaudes tiek uzsāktas, izmantojot skriptu bin/inspect.sh no IDEA instalācijas direktorija. NepiecieŔamie parametri ir:

  • pilns ceļŔ uz projektu (radinieki netiek atbalstÄ«ti),
  • ceļŔ uz .xml failu ar pārbaudes iestatÄ«jumiem (parasti atrodas projektā .idea/inspectionProfiles/Project_Default.xml),
  • pilns ceļŔ uz mapi, kurā tiks saglabāti .xml faili ar pārskatiem par analÄ«zes rezultātiem.

Turklāt sagaidāms, ka

  • ceļŔ uz Java SDK tiks konfigurēts IDE, pretējā gadÄ«jumā analÄ«ze nedarbosies. Å ie iestatÄ«jumi ir ietverti konfigurācijas failā jdk.table.xml IDEA globālās konfigurācijas mapē. Pati IDEA globālā konfigurācija pēc noklusējuma atrodas lietotāja mājas direktorijā, bet Ŕī vieta var skaidri norādÄ«t failā idea.properties.
  • Analizētajam projektam ir jābÅ«t derÄ«gam IDEA projektam, kuram jums bÅ«s jāiekļauj daži faili, kas parasti tiek ignorēti versiju kontrolē, proti:
    • .idea/inspectionProfiles/Project_Default.xml ā€” analizatora iestatÄ«jumi, tie noteikti tiks izmantoti, veicot pārbaudes konteinerā,
    • .idea/modules.xml - pretējā gadÄ«jumā mēs saņemsim kļūdu ā€œÅ is projekts nesatur moduļusā€,
    • .idea/misc.xml - pretējā gadÄ«jumā tiks parādÄ«ts kļūdas ziņojums "JDK nav pareizi konfigurēts Å”im projektam",
    • *.iml-фŠ°Š¹Š»Ń‹ ā€” pretējā gadÄ«jumā mēs saņemsim kļūdu par nekonfigurētu JDK modulÄ«.

Lai gan Å”ie faili parasti ir iekļauti .gitignore, tie nesatur nekādu informāciju, kas raksturÄ«ga konkrēta izstrādātāja videi ā€“ atŔķirÄ«bā, piemēram, no faila workspace.xml, kur Ŕāda informācija ir ietverta, un tāpēc nav vajadzÄ«bas to izdarÄ«t.

AcÄ«mredzamais risinājums ir iepakot JDK kopā ar IDEA Community Edition konteinerā tādā formā, kas ir gatava analizētajiem projektiem. Izvēlēsimies piemērotu bāzes konteineru, un Ŕāds bÅ«s mÅ«su Dockerfile:

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

Izmantojot opciju idea.config.path mēs piespiedām IDEA meklēt savu globālo konfigurāciju mapē /etc/idea, jo lietotāja mājas mape, strādājot CI, ir neskaidra lieta un bieži vien tās pilnībā nav.

Konteinerā iekopētais fails izskatās Ŕādi: jdk.table.xml, kurā ir konteinerā instalētie ceļi uz OpenJDK (par pamatu var ņemt lÄ«dzÄ«gu failu no jÅ«su direktorija ar IDEA iestatÄ«jumiem):

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>

Gatavs attēls pieejams Docker Hub.

Pirms turpināt, pārbaudīsim, vai konteinerā darbojas IDEA analizators:

docker run --rm -v <Šæуть/Šŗ/Š²Š°ŃˆŠµŠ¼Ńƒ/ŠæрŠ¾ŠµŠŗту>:/var/project inponomarev/intellij-idea-analyzer

AnalÄ«zei vajadzētu darboties veiksmÄ«gi, un apakÅ”mapē target/idea_inspections jāparādās daudziem .xml failiem ar analizatora atskaitēm.

Tagad vairs nav Å”aubu, ka IDEA analizatoru var palaist atseviŔķi jebkurā CI vidē, un mēs pārejam pie otrā posma.

2. darbība. Parādiet un analizējiet pārskatu

Pārskata iegÅ«Å”ana .xml failu formātā ir puse no panākumiem; tagad jums tas ir jāpadara cilvēkiem lasāms. Un arÄ« tās rezultātus vajadzētu izmantot kvalitātes vārtos - loÄ£iku, lai noteiktu, vai pieņemtā maiņa pēc kvalitātes kritērijiem ir izturējusi vai neizdodas.

Tas mums palÄ«dzēs Jenkins Warnings NG spraudnis, kas tika izlaists 2019. gada janvārÄ«. LÄ«dz ar tās parādÄ«Å”anos daudzi atseviŔķi spraudņi darbam ar statiskās analÄ«zes rezultātiem pakalpojumā Jenkins (CheckStyle, FindBugs, PMD utt.) tagad ir atzÄ«mēti kā novecojuÅ”i.

Spraudnis sastāv no divām daļām:

  • daudzi analizatora ziņojumu savācēji (pilns saraksts ietver visus zinātnei zināmos analizatorus no AcuCobol lÄ«dz ZPT Lint),
  • viens pārskatu skatÄ«tājs visiem tiem.

To lietu saraksts, ko Warnings NG var analizēt, ietver brÄ«dinājumus no Java kompilatora un brÄ«dinājumus no Maven izpildes žurnāliem: lai gan tie ir pastāvÄ«gi redzami, tie reti tiek Ä«paÅ”i analizēti. AtpazÄ«to formātu sarakstā ir iekļauti arÄ« IntelliJ IDEA pārskati.

Tā kā spraudnis ir jauns, tas sākotnēji labi mijiedarbojas ar Jenkins Pipeline. BÅ«vÄ“Å”anas solis ar tā piedalÄ«Å”anos izskatÄ«sies Ŕādi (mēs vienkārÅ”i pasakām spraudnim, kādu pārskata formātu mēs atpazÄ«stam un kādi faili ir skenējami):

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

Pārskata saskarne izskatās Ŕādi:

IntelliJ IDEA pārbaužu veikÅ”ana vietnē Jenkins

Ērti Ŕī saskarne ir universāla visiem atzÄ«tajiem analizatoriem. Tajā ir interaktÄ«va diagramma par atradumu sadalÄ«jumu pa kategorijām un atradumu skaita izmaiņu dinamikas grafiks. Varat veikt ātru meklÄ“Å”anu režģī lapas apakŔā. VienÄ«gais, kas IDEA pārbaudēs nedarbojās pareizi, bija iespēja pārlÅ«kot kodu tieÅ”i Jenkins (lai gan citiem ziņojumiem, piemēram, Checkstyle, Å”is spraudnis to var izdarÄ«t lieliski). Å Ä·iet, ka Ŕī ir kļūda IDEA pārskatu parsētājā, kas ir jānovērÅ”.

Viena no Warnings NG funkcijām ir iespēja apkopot dažādu avotu konstatējumus vienā ziņojumā un ieprogrammēt Quality Gates, tostarp atsauces komplekta ā€œsprÅ«dratsā€. Ir pieejama daļa Quality Gates programmÄ“Å”anas dokumentācijas Å”eit - tomēr tas nav pilnÄ«gs, un jums ir jāskatās avota kods. No otras puses, lai pilnÄ«bā kontrolētu notiekoÅ”o, ā€œsprÅ«dratsā€ var tikt ieviests neatkarÄ«gi (skatiet manu iepriekŔējā ziņa par Å”o tēmu).

Secinājums

Pirms sāku gatavot Å”o materiālu, nolēmu pameklēt: vai kāds jau ir rakstÄ«jis par Å”o tēmu par Habrē? Es tikai atradu intervija 2017 с Lanykur viņŔ saka:

Cik es zinu, nav integrācijas ar Jenkins vai maven spraudni [ā€¦] Principā jebkurÅ” entuziasts varētu sadraudzēties ar IDEA Community Edition un Jenkins, daudzi no tā tikai iegÅ«tu.

Nu, divus gadus vēlāk mums ir Warnings NG Plugin, un beidzot Ŕī draudzÄ«ba ir piepildÄ«jusies!

Avots: www.habr.com

Pievieno komentāru