Ruith Sgrùdaidhean IntelliJ IDEA air Jenkins

Tha an anailis còd Java statach as adhartaiche aig IntelliJ IDEA an-diugh, a tha, a thaobh a chomasan, air fhàgail fada air dheireadh air na “seann shaighdearan” mar Stoidhle seic и Spotbugs. Bidh na “sgrùdaidhean” iomadach aige a’ sgrùdadh a’ chòd ann an diofar thaobhan, bho stoidhle còdaidh gu bugaichean caractar.

Ach, fhad's a tha toraidhean an sgrùdaidh air an taisbeanadh a-mhàin ann an IDE ionadail an leasaiche, chan eil iad gu mòran feum don phròiseas leasachaidh. Mion-sgrùdadh Statach feumar a dhèanamh mar a’ chiad cheum den loidhne-phìoban togail, feumaidh na toraidhean aige na geataichean càileachd a dhearbhadh, agus feumaidh an togail fàiligeadh ma dh’ fhailicheas na geataichean càileachd. Tha fios gu bheil TeamCity CI ceangailte ri IDEA. Ach eadhon mura h-eil thu a’ cleachdadh TeamCity, faodaidh tu fhathast feuchainn ri sgrùdaidhean IDEA a ruith air frithealaiche CI sam bith eile. Tha mi a’ moladh faicinn mar a ghabhas seo a dhèanamh a’ cleachdadh IDEA Community Edition, Jenkins agus Warnings NG plugan.

Ceum 1. Run an anailis ann an container agus faigh aithisg

An toiseach, is dòcha gu bheil am beachd a bhith a’ ruith IDE (tagradh deasg!) Taobh a-staigh siostam CI aig nach eil eadar-aghaidh grafaigeach a ’coimhead amharasach agus gu math trioblaideach. Gu fortanach, tha luchd-leasachaidh IDEA air comas ruith a thoirt seachad cruth còd и sgrùdaidhean bhon loidhne-àithne. A bharrachd air an sin, gus IDEA a ruith sa mhodh seo, chan eil feum air fo-shiostam grafaigeach, agus faodar na gnìomhan sin a choileanadh air frithealaichean le slige teacsa.

Thèid sgrùdaidhean a chuir air bhog a’ cleachdadh sgriobt bin/inspect.sh bhon chlàr stàlaidh IDEA. Is iad na paramadairean a tha a dhìth:

  • slighe slàn chun phròiseact (chan eil taic aig feadhainn càirdeach),
  • slighe chun fhaidhle .xml le roghainnean sgrùdaidh (mar as trice suidhichte taobh a-staigh a’ phròiseict ann an .idea/inspectionProfiles/Project_Default.xml),
  • slighe slàn chun phasgan far am bi faidhlichean .xml le aithisgean toraidhean anailis air an stòradh.

A bharrachd air an sin, thathar an dùil gum bi

  • thèid an t-slighe gu Java SDK a rèiteachadh san IDE, air neo cha obraich am mion-sgrùdadh. Tha na roghainnean sin anns an fhaidhle rèiteachaidh. jdk.table.xml ann am pasgan rèiteachaidh cruinne IDEA. Tha an rèiteachadh bunaiteach IDEA cruinneil fhèin ann an eòlaire dachaigh an neach-cleachdaidh, ach an t-àite seo faodar a shuidheachadh gu soilleir ann am faidhle idea.properties.
  • feumaidh am pròiseact sgrùdaichte a bhith na phròiseact IDEA dligheach, airson am feum cuid de na faidhlichean nach tèid an leigeil seachad a bhith dealasach a thaobh smachd dreach, is iad sin:
    • .idea/inspectionProfiles/Project_Default.xml - suidheachaidhean anailisiche, tha e follaiseach gun tèid an cleachdadh nuair a thèid sgrùdaidhean a chuir air bhog ann an soitheach,
    • .idea/modules.xml - air neo gheibh sinn a’ mhearachd ‘Chan eil modalan sa phròiseact seo’,
    • .idea/misc.xml - air neo gheibh sinn a’ mhearachd ‘Chan eil an JDK air a rèiteachadh ceart airson a’ phròiseict seo’,
    • *.iml-файлы - air neo gheibh sinn mearachd mu JDK neo-ullaichte sa mhodal.

Ged a tha na faidhlichean sin mar as trice air an toirt a-steach .gitignore, chan eil fiosrachadh sam bith ann a tha sònraichte do àrainneachd leasaiche sònraichte - eu-coltach ri, mar eisimpleir, faidhle workspace.xml, far a bheil am fiosrachadh sin, dìreach, air a ghabhail a-steach, agus mar sin nach eil feum air a ghealltainn.

Leis fhèin, tha an t-slighe a-mach ga mholadh fhèin a bhith a’ pacadh an JDK còmhla ri IDEA Community Edition ann an soitheach ann an cruth deiseil airson a bhith “air a shuidheachadh” air na pròiseactan sgrùdaichte. Taghamaid soitheach bunaiteach iomchaidh, agus seo an Dockerfile a gheibh sinn:

Faidhle docker

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

A 'cleachdadh an roghainn idea.config.path thug sinn air IDEA coimhead airson a rèiteachadh cruinneil sa phasgan /etc/idea, leis gu bheil pasgan dachaigh an neach-cleachdaidh anns na suidheachaidhean obrach ann an CI na rud neo-chinnteach agus gu tric gu tur às-làthair.

Seo mar a tha am faidhle a chaidh a chopaigeadh chun t-soithich coltach jdk.table.xml, anns a bheil na slighean chun an OpenJDK a chaidh a chuir a-steach am broinn an t-soithich (faodaidh e a bhith stèidhichte air faidhle coltach ris bhon eòlaire roghainnean IDEA agad fhèin):

jdk.clàr.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>

Dealbh crìochnaichte ri fhaighinn air Docker Hub.

Mus gluais sinn air adhart, dèanamaid deuchainn air ruith am parser IDEA anns a’ ghobhar:

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

Bu chòir don anailis obrachadh gu soirbheachail, agus bu chòir grunn fhaidhlichean .xml le aithisgean anailisiche nochdadh anns an fho-phasgan targaid/idea_inspections.

A-nis chan eil teagamh sam bith gum faodar an anailisiche IDEA a ruith ann am modh leis fhèin ann an àrainneachd CI sam bith, agus gluaisidh sinn air adhart chun dàrna ceum.

Ceum 2. Taisbeanadh agus mion-sgrùdadh air an aithisg

Is e leth a 'bhlàir a bhith a' faighinn aithisg ann an cruth faidhlichean .xml, a-nis feumaidh e a bhith air a leughadh le daoine. Agus cuideachd bu chòir na toraidhean aige a chleachdadh ann an geataichean càileachd - an loidsig airson a bhith a’ dearbhadh a bheil an t-atharrachadh ris an deach gabhail seachad no nach eil a’ dol seachad a rèir slatan-tomhais càileachd.

Cuidichidh seo sinn Rabhaidhean Jenkins NG Plugina chaidh fhoillseachadh san Fhaoilleach 2019. Leis an ro-ràdh aige, tha mòran plug-ins fa leth airson a bhith ag obair le toraidhean mion-sgrùdadh statach ann an Jenkins (CheckStyle, FindBugs, PMD, msaa) a-nis air an comharrachadh mar a dhol à bith.

Tha dà phàirt anns a’ plugan:

  • grunn luchd-cruinneachaidh teachdaireachd anailisiche (làn liosta a’ toirt a-steach a h-uile anailisiche a tha aithnichte do shaidheans bho AcuCobol gu ZPT Lint),
  • aon neach-coimhead aithisg dhaibh uile.

Tha an liosta de rudan a dh’ fhaodas Rabhaidh NG a pharsadh a’ toirt a-steach rabhaidhean cruinneachaidh Java agus rabhaidhean bho logaichean cur gu bàs Maven: ged a tha iad an-còmhnaidh ann an sealladh, is ann ainneamh a thèid an sgrùdadh a dh’aona ghnothach. Tha aithisgean IntelliJ IDEA cuideachd air an toirt a-steach don liosta de chruthan aithnichte.

Leis gu bheil am plugan ùr, bidh e ag eadar-obrachadh gu math an toiseach le Jenkins Pipeline. Bidh an ceum togail le a chom-pàirteachadh a’ coimhead mar seo (bidh sinn dìreach ag innse don plugan dè an cruth aithris a tha sinn ag aithneachadh agus dè na faidhlichean a bu chòir a sganadh):

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

Tha eadar-aghaidh na h-aithisg a’ coimhead mar seo:

Ruith Sgrùdaidhean IntelliJ IDEA air Jenkins

Tha e goireasach gu bheil an eadar-aghaidh seo uile-choitcheann airson a h-uile parsair aithnichte. Tha clàr eadar-ghnìomhach ann de chuairteachadh lorgaidhean a rèir gnè agus graf de dhianamics nan atharrachaidhean anns an àireamh de lorgan. Anns a 'ghriod aig bonn na duilleige, faodaidh tu rannsachadh luath a dhèanamh. B 'e an aon rud nach do dh'obraich gu ceart airson sgrùdaidhean IDEA an comas a bhith a' brobhsadh a 'chòd gu dìreach ann an Jenkins (ged a tha e airson aithisgean eile, leithid Checkstyle, faodaidh am plugan seo a dhèanamh gu h-àlainn). Tha e coltach gur e buga a th’ ann am parser aithisg IDEA a dh’ fheumar a chàradh.

Am measg nam feartan aig Warnings NG tha an comas co-dhùnaidhean bho dhiofar thùsan a chruinneachadh ann an aon aithisg agus prògram Quality Gates, a’ toirt a-steach ratchet airson co-chruinneachadh fiosrachaidh. Tha cuid de sgrìobhainnean prògramadh Quality Gates rim faighinn an seo - ge-tà, chan eil e coileanta, agus feumaidh tu coimhead air an stòr. Air an làimh eile, airson smachd iomlan air na tha a’ tachairt, faodar an “ratchet” a chuir an gnìomh gu neo-eisimeileach (faic mo post roimhe mun chuspair seo).

co-dhùnadh

Mus do thòisich mi ag ullachadh an stuth seo, chuir mi romhpa coimhead: a bheil duine air sgrìobhadh mu thràth air a 'chuspair seo air Habré? Cha do lorg mi ach agallamh 2017 с lanaidhfar a bheil e ag ràdh:

Cho fad 's as aithne dhomh, chan eil amalachadh le Jenkins no plugan maven [...] Ann am prionnsabal, dh'fhaodadh neach-dealasach sam bith caraidean IDEA Community Edition agus Jenkins a dhèanamh, cha bhiodh mòran a 'faighinn buannachd ach às an seo.

Uill, às deidh dà bhliadhna tha an Warnings NG Plugin againn, agus mu dheireadh tha an càirdeas seo air tighinn gu buil!

Source: www.habr.com

Cuir beachd ann