Vekolînên IntelliJ IDEA li ser Jenkins bimeşînin

IntelliJ IDEA îro xwedan analyzera koda Java ya statîk a herî pêşkeftî ye, ku di warê kapasîteyên xwe de, "veteranên" wek şêwaza kontrolê и Spotbugs. Gelek "teftîşkirin"ên wê kodê di warên cihêreng de kontrol dikin, ji şêwaza kodkirinê bigire heya xeletiyên taybetmendiyê.

Lêbelê, heya ku encamên analîzê tenê di IDE-ya herêmî ya pêşdebiran de têne xuyang kirin, ew ji bo pêvajoya pêşkeftinê hindik têne bikar anîn. Analîza Statîk divê bê kirin wekî gava yekem a boriyê avakirinê, divê encamên wê dergehên kalîteyê diyar bikin, û heke deriyên kalîteyê têk biçin divê avahî têk biçe. Tê zanîn ku TeamCity CI bi IDEA re yekbûyî ye. Lê her çend hûn TeamCity bikar neynin, hûn dîsa jî dikarin ceribandinên IDEA-yê li ser serverek CI-ya din biceribînin. Ez pêşniyar dikim ku bibînim ka ev çawa dikare bi karanîna pêveka IDEA Community Edition, Jenkins û Warnings NG were kirin.

Gav 1. Analîzê di konteynirekê de bimeşînin û raporekê bistînin

Di destpêkê de, ramana meşandina IDE (serîlêdana sermaseyê!) di hundurê pergalek CI de ku xwedan navgînek grafîkî nîne, dibe ku gumanbar û pir dijwar xuya bike. Xweşbextane, pêşdebirên IDEA-yê kapasîteya xebitandinê peyda kirine formatkirina kodê и teftîşan ji rêzika fermanê. Digel vê yekê, ji bo meşandina IDEA-yê di vê modê de, binepergalek grafîkî ne hewce ye, û ev karan dikarin li ser serverên bi şêlek nivîsê werin kirin.

Vekolîn bi karanîna skrîptê têne destpêkirin bin/inspect.sh ji pelrêça sazkirinê IDEA. Parametreyên pêwîst ev in:

  • riya tevahî ya projeyê (yên têkildar nayên piştgirî kirin),
  • riya pelê .xml bi mîhengên vekolînê (bi gelemperî di hundurê projeyê de di .idea/inspectionProfiles/Project_Default.xml de cih digire),
  • riya tevahî ya peldanka ku pelên .xml bi raporên encamên analîzê re dê werin hilanîn.

Bi ser de, tê payîn ku

  • riya Java SDK-ê dê di IDE-ê de were mîheng kirin, wekî din dê analîz nexebite. Van mîhengan di pelê veavakirinê de hene. jdk.table.xml di peldanka veavakirina gerdûnî ya IDEA de. Veavakirina gerdûnî ya standard IDEA bixwe di pelrêça malê ya bikarhêner de ye, lê ev cîh dikare bi eşkereyî were danîn di dosyayê de idea.properties.
  • Projeya analîzkirî divê projeyek IDEA-ya derbasdar be, ji bo ku hin pelên ku bi gelemperî têne paşguh kirin pêdivî ye ku ji kontrola guhertoyê re were vegerandin, bi vî rengî:
    • .idea/inspectionProfiles/Project_Default.xml - Mîhengên analîzkerê, ew ê bê guman dema ku vekolînên di konteynerê de dest pê bikin werin bikar anîn,
    • .idea/modules.xml - Wekî din em xeletiya 'Ev proje modulan nahewîne' distînin,
    • .idea/misc.xml - Wekî din em xeletiya 'JDK ji bo vê projeyê bi rêkûpêk nehatiye mîheng kirin',
    • *.iml-файлы - Wekî din em ê di modulê de di derheqê JDK-ya nevehengkirî de xeletiyek bistînin.

Her çend van pelan bi gelemperî tê de hene .gitignore, ew ti agahdariya taybetî ya ji bo hawîrdora pêşdebirek taybetî - berevajî, mînakî, pelek tune workspace.xml, li ku derê agahdariya wusa, tenê, tê de heye, û ji ber vê yekê ne hewce ye ku ew were kirin.

Ji xwe, riya derketinê ji xwe re pêşniyar dike ku JDK-ê bi Weşana Civaka IDEA-yê re li konteynirek bi rengekî ku amade ye ku li ser projeyên vekolînkirî were "saz kirin" pak bike. Ka em konteynirek bingehîn a maqûl hilbijêrin, û li vir Dockerfile ye ku em digirin:

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

Vebijêrk bikar tînin idea.config.path me IDEA kir ku di peldankê de veavakirina xweya gerdûnî bibîne /etc/idea, ji ber ku peldanka malê ya bikarhêner di şert û mercên xebatê de di CI de tiştek ne diyar e û pir caran bi tevahî tune.

Pela ku li konteynerê hatiye kopîkirin bi vî rengî xuya dike jdk.table.xml, ku rêyên OpenJDK-ya ku di hundurê konteynerê de hatî saz kirin vedihewîne (ew dikare li ser pelek wusa ji pelrêça mîhengên weya IDEA-yê were damezrandin):

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>

Wêneyê qedandî li ser Docker Hub heye.

Berî ku em bimeşin, bila em parsera IDEA-yê di konteynerê de biceribînin:

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

Analîz divê bi serfirazî bixebite, û gelek pelên .xml bi raporên analîzkerê re divê di binpeldanka target/idea_inspections de xuya bibin.

Naha êdî guman tune ku analyzer IDEA dikare di her hawîrdora CI-yê de negirêdayî were xebitandin, û em diçin gava duyemîn.

Gav 2. Raporê nîşan bide û analîz bike

Danîna raporek di forma pelên .xml de nîvê şer e, naha pêdivî ye ku ew ji hêla mirovan ve were xwendin. Û her weha divê encamên wê di deriyên kalîteyê de bêne bikar anîn - mantiqa ji bo destnîşankirina ka guheztina pejirandî li gorî pîvanên kalîteyê derbas dibe an na.

Ev dê alîkariya me bike Jenkins Warnings NG Pluginku di Çile 2019 de hate berdan. Bi danasîna wê re, gelek pêvekên cihêreng ên ji bo xebitandina encamên analîza statîk ên li Jenkins (CheckStyle, FindBugs, PMD, hwd.) naha wekî qedîm têne nîşankirin.

Pêvek ji du beşan pêk tê:

  • gelek berhevkarên peyamên analîzer (navnîşa bêkêmasî hemî analîzerên ku ji zanistê re têne zanîn ji AcuCobol heya ZPT Lint vedihewîne),
  • ji bo hemî wan temaşevanek raportek yekane.

Navnîşa tiştên ku Warnings NG dikare parsek bike hişyariyên berhevkarê Java û hişyariyên ji têketinên darvekirinê yên Maven vedihewîne: her çend ew bi domdarî li ber çavan bin jî, ew kêm caran bi armanc têne analîz kirin. Raporên IntelliJ IDEA jî di navnîşa formatên naskirî de hene.

Ji ber ku pêvek nû ye, ew di destpêkê de bi Jenkins Pipeline re baş têkilî dike. Pêngava avakirinê ya bi beşdariya wî dê bi vî rengî xuya bike (em tenê ji pêvekê re vedibêjin ka kîjan formata raporê em nas dikin û kîjan pelan divê werin şelandin):

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

Têkiliya raporê wiha xuya dike:

Vekolînên IntelliJ IDEA li ser Jenkins bimeşînin

Hêsan e ku ev navber ji bo hemî parserên naskirî gerdûnî ye. Ew nexşeyek înteraktîf a belavkirina dîtinan li gorî kategorî û grafiyek dînamîkên guheztinên di hejmara dîtinan de vedihewîne. Di tora li binê rûpelê de, hûn dikarin lêgerînek bilez bikin. Tiştê ku ji bo vekolînên IDEA-yê rast nexebitî ev bû ku meriv rasterast kodê li Jenkins bigere (her çend ji bo raporên din, wek Checkstyle, ev pêvek dikare wê bi rengek xweşik bike). Wusa dixuye ku di parsera rapora IDEA de xeletiyek e ku divê were rast kirin.

Di nav taybetmendiyên Warnings NG de şiyana berhevkirina dîtinên ji çavkaniyên cihêreng di yek rapor û bernameyek Dergehên Kalîteyê de ye, tevî "ratchet" ji bo meclîsek referansê. Hin belgeyên bernameyê yên Quality Gates hene vir - lebê, ew ne temam e, û divê hûn li çavkaniyê binêrin. Ji hêla din ve, ji bo kontrolkirina bêkêmasî ya ku diqewime, "ratchet" dikare serbixwe were bicîh kirin (li min binêre posta berê li ser vê mijarê).

encamê

Berî ku ez dest bi amadekirina vê materyalê bikim, min biryar da ku binihêrim: gelo kesek berê li ser vê mijarê li ser Habré nivîsandiye? Min tenê dît hevpeyvîn 2017 с Lanyli ku dibêje:

Bi qasî ku ez dizanim, bi Jenkins an pêvekek maven re entegrasyonek tune [...] Di prensîbê de, her dildar dikare IDEA Community Edition û Jenkins bike hevalên xwe, pir kes tenê ji vê yekê sûd werdigirin.

Welê, piştî du salan me Pêveka Warnings NG heye, û di dawiyê de ev hevaltî rast hat!

Source: www.habr.com

Add a comment