Kouri enspeksyon IntelliJ IDEA sou Jenkins

IntelliJ IDEA jodi a gen pi avanse analizè kòd Java estatik, ki nan kapasite li kite byen lwen dèyè tankou "veteran" tankou Checkstyle и Spotbugs. Anpil "enspeksyon" li yo tcheke kòd la nan divès aspè, soti nan style kodaj ak pinèz tipik.

Sepandan, osi lontan ke rezilta analiz yo parèt sèlman nan koòdone lokal IDE pwomotè a, yo pa itil anpil pou pwosesis devlopman an. Analiz estatik dwe akonpli Kòm premye etap la nan tiyo konstriksyon an, rezilta li yo ta dwe defini pòtay bon jan kalite, ak bati a ta dwe echwe si pòtay yo bon jan kalite yo pa pase. Li konnen ke TeamCity CI entegre ak IDEA. Men, menm si ou pa sèvi ak TeamCity, ou ka fasilman eseye fè enspeksyon IDEA nan nenpòt lòt sèvè CI. Mwen sijere ou wè ki jan sa ka fè lè l sèvi avèk IDEA Community Edition, Jenkins ak Warnings NG plugin.

Etap 1. Kouri analiz la nan veso a epi jwenn yon rapò

Okòmansman, lide nan kouri yon IDE (aplikasyon biwo!) andedan yon sistèm CI ki pa gen yon koòdone grafik ka sanble enziyan ak trè anbarasman. Erezman, devlopè IDEA yo te bay kapasite nan kouri fòma kòd и enspeksyon soti nan liy lòd la. Anplis, pou kouri IDEA nan mòd sa a, yon sous-sistèm grafik pa obligatwa epi travay sa yo ka fèt sou sèvè ak yon koki tèks.

Enspeksyon yo lanse lè l sèvi avèk yon script bin/inspect.sh soti nan anyè enstalasyon IDEA. Paramèt ki nesesè yo se:

  • chemen konplè nan pwojè a (yo pa sipòte moun fanmi),
  • chemen nan fichye .xml ak paramèt enspeksyon (anjeneral sitiye andedan pwojè a nan .idea/inspectionProfiles/Project_Default.xml),
  • chemen konplè nan katab la kote yo pral estoke dosye .xml ak rapò sou rezilta analiz yo.

Anplis de sa, li espere ke

  • chemen an nan SDK Java a pral konfigirasyon nan IDE a, otreman analiz la pa pral travay. Paramèt sa yo genyen nan dosye konfigirasyon an jdk.table.xml nan katab konfigirasyon mondyal IDEA. Konfigirasyon mondyal IDEA a li menm sitiye nan anyè lakay itilizatè a pa default, men kote sa a ka presize klèman nan dosye idea.properties.
  • Pwojè analize a dwe yon pwojè IDEA valab, pou ki w ap oblije komèt kèk dosye ki anjeneral inyore nan kontwòl vèsyon, sètadi:
    • .idea/inspectionProfiles/Project_Default.xml — Anviwònman analizè yo, yo pral evidamman itilize lè yo fè enspeksyon nan veso a,
    • .idea/modules.xml - sinon nou pral jwenn erè a 'Pwojè sa a pa gen okenn modil',
    • .idea/misc.xml - sinon nou pral jwenn erè a 'JDK a pa konfigirasyon byen pou pwojè sa a',
    • *.iml-файлы - sinon nou pral jwenn yon erè sou yon JDK ki pa konfigirasyon nan modil la.

Malgre ke dosye sa yo anjeneral enkli nan .gitignore, yo pa genyen okenn enfòmasyon espesifik nan anviwònman an nan yon pwomotè patikilye - kontrèman ak, pou egzanp, yon dosye workspace.xml, kote enfòmasyon sa yo genyen, e se poutèt sa pa gen okenn nesesite pou komèt li.

Solisyon evidan an se pake JDK a ansanm ak IDEA Community Edition nan yon veso nan yon fòm ki pare pou yo "pitted" sou pwojè yo analize. Ann chwazi yon resipyan baz apwopriye, epi sa a se sa Dockerfile nou an pral ye:

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

Sèvi ak opsyon an idea.config.path nou fòse IDEA pou chèche konfigirasyon mondyal li nan katab la /etc/idea, paske katab lakay itilizatè a lè w ap travay nan CI se yon bagay ensèten e souvan absan konplètman.

Men sa dosye a kopye nan veso a sanble: jdk.table.xml, ki gen chemen ki mennen nan OpenJDK ki enstale andedan veso a (yo ka pran yon dosye ki sanble nan pwòp anyè ou ak paramèt IDEA yo kòm baz):

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>

Imaj la fini disponib sou Docker Hub.

Anvan w kontinye, ann tcheke si analizè IDEA a ap kouri nan veso a:

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

Analiz la ta dwe kouri avèk siksè, ak anpil dosye .xml ak rapò analizè yo ta dwe parèt nan subfolder target/idea_inspections.

Koulye a, pa gen okenn dout ankò ke analizè IDEA a ka kouri otonòm nan nenpòt anviwònman CI, epi nou deplase sou dezyèm etap la.

Etap 2. Montre ak analize rapò a

Jwenn rapò a nan fòm .xml dosye se mwatye batay la, kounye a ou bezwen fè li lizib pou moun. Epi tou rezilta li yo ta dwe itilize nan pòtay bon jan kalite - lojik la pou detèmine si chanjman an aksepte pase oswa echwe dapre kritè bon jan kalite.

Sa ap ede nou Jenkins Avètisman NG Plugin, ki te pibliye nan mwa janvye 2019. Avèk avènement li yo, anpil grefon endividyèl pou travay ak rezilta analiz estatik nan Jenkins (CheckStyle, FindBugs, PMD, elatriye) yo kounye a make kòm demode.

Plugin a konsiste de de pati:

  • anpil pèseptè mesaj analizeur (lis konplè gen ladan tout analizè ke syans konnen soti nan AcuCobol rive nan ZPT Lint),
  • yon sèl visualiseur rapò pou yo tout.

Lis bagay ke Warnings NG ka analize gen ladann avètisman ki soti nan konpilatè Java a ak avètisman ki soti nan mòso bwa egzekisyon Maven: byenke yo toujou ap vizib, yo raman analize espesyalman. Rapò IntelliJ IDEA yo enkli tou nan lis fòma rekonèt yo.

Depi Plugin a nouvo, li okòmansman byen reyaji ak Jenkins Pipeline. Etap nan bati ak patisipasyon li yo pral sanble sa a (nou tou senpleman di Plugin la ki fòma rapò nou rekonèt ak ki dosye yo ta dwe tcheke):

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

Koòdone rapò a sanble sa a:

Kouri enspeksyon IntelliJ IDEA sou Jenkins

Byen, koòdone sa a se inivèsèl pou tout analyser rekonèt. Li genyen yon dyagram entèaktif sou distribisyon jwenn pa kategori ak yon graf dinamik chanjman nan kantite jwenn. Ou ka fè yon rechèch rapid nan kadriyaj ki anba paj la. Bagay la sèlman ki pa t travay kòrèkteman pou enspeksyon IDEA se kapasite nan browse kòd dirèkteman nan Jenkins (byenke pou lòt rapò, pou egzanp Checkstyle, Plugin sa a ka fè sa trè byen). Li sanble ke sa a se yon ensèk nan analizeur rapò IDEA ki bezwen yo dwe ranje.

Pami karakteristik yo nan Avètisman NG se kapasite nan total rezilta ki soti nan diferan sous nan yon rapò ak pwogram Quality Gates, ki gen ladan yon "ratchet" pou asanble referans la. Gen kèk dokiman sou pwogram Quality Gates ki disponib isit la - sepandan, li pa konplè, epi ou dwe gade kòd sous la. Nan lòt men an, pou yon kontwòl konplè sou sa k ap pase, "ratchet la" ka aplike poukont yo (gade pòs anvan sou tèm sa a).

Konklizyon

Anvan mwen kòmanse prepare materyèl sa a, mwen deside fè rechèch: èske gen moun ki deja ekri sou sijè sa a sou Habré? Mwen sèlman jwenn entèvyou 2017 с Lanykote li di:

Dapre mwen konnen, pa gen okenn entegrasyon ak Jenkins oswa yon plugin maven […] An prensip, nenpòt amater te kapab fè zanmi ak IDEA Community Edition ak Jenkins, anpil ta sèlman benefisye de sa.

Oke, de ane pita nou gen Avètisman NG Plugin, epi finalman amitye sa a te rive reyalize!

Sous: www.habr.com

Add nouvo kòmantè