Rhedeg Archwiliadau IDEA IntelliJ ar Jenkins

Ar hyn o bryd mae gan IntelliJ IDEA y dadansoddwr cod Java statig mwyaf datblygedig, sydd yn ei alluoedd yn gadael "cyn-filwyr" fel Arddull siec и Bygiau SbotMae ei "archwiliadau" niferus yn gwirio'r cod am wahanol agweddau, o arddull codio i fygiau nodweddiadol.

Fodd bynnag, er mai dim ond yn rhyngwyneb IDE lleol y datblygwr y mae canlyniadau'r dadansoddiad yn cael eu harddangos, nid ydynt o fawr o ddefnydd i'r broses ddatblygu. Dadansoddiad statig rhaid ei berfformio Fel y cam cyntaf yn y broses adeiladu, dylai ei ganlyniadau bennu gatiau ansawdd, a dylai'r broses adeiladu fethu os na chaiff y gatiau ansawdd eu pasio. Mae TeamCity CI yn adnabyddus am ei integreiddio ag IDEA. Ond hyd yn oed os nad ydych chi'n defnyddio TeamCity, gallwch chi redeg archwiliadau IDEA yn hawdd ar unrhyw weinydd CI arall. Awgrymaf archwilio sut y gellir gwneud hyn gan ddefnyddio IDEA Community Edition, Jenkins, a'r ategyn Warnings NG.

Cam 1. Rhedeg y dadansoddiad yn y cynhwysydd a chael adroddiad

Ar y dechrau, efallai y bydd y syniad o redeg IDE (cymhwysiad bwrdd gwaith!) y tu mewn i system CI nad oes ganddi ryngwyneb graffigol yn ymddangos yn amheus ac yn drafferthus iawn. Yn ffodus, mae datblygwyr IDEA wedi darparu'r gallu i redeg fformatio cod и arolygiadau o'r llinell orchymyn. Ar ben hynny, nid oes angen is-system graffeg i redeg IDEA yn y modd hwn, a gellir cyflawni'r tasgau hyn ar weinyddion gyda chragen sy'n seiliedig ar destun.

Lansir archwiliadau gan ddefnyddio sgript. bin/inspect.sh o'r cyfeiriadur gosod IDEA. Mae angen y paramedrau canlynol:

  • llwybr llawn i'r prosiect (nid yw llwybrau cymharol yn cael eu cefnogi),
  • llwybr i'r ffeil .xml gyda gosodiadau arolygu (fel arfer wedi'u lleoli y tu mewn i'r prosiect yn .idea/inspectionProfiles/Project_Default.xml),
  • y llwybr llawn i'r ffolder lle bydd y ffeiliau .xml sy'n cynnwys yr adroddiadau canlyniadau dadansoddi yn cael eu storio.

Yn ogystal, disgwylir y bydd

  • Bydd y llwybr i'r Java SDK yn cael ei ffurfweddu yn yr IDE, fel arall ni fydd y dadansoddiad yn gweithio. Mae'r gosodiadau hyn wedi'u cynnwys yn y ffeil ffurfweddu. jdk.table.xml yn y ffolder ffurfweddiad byd-eang IDEA. Mae'r ffurfweddiad byd-eang IDEA ei hun wedi'i leoli yng nghyfeiriadur cartref y defnyddiwr yn ddiofyn, ond y lleoliad hwn gellir ei nodi'n benodol mewn ffeil idea.properties.
  • Rhaid i'r prosiect sy'n cael ei ddadansoddi fod yn brosiect IDEA dilys, sy'n gofyn am ymrwymo rhai ffeiliau i reoli fersiynau sydd fel arfer yn cael eu hanwybyddu, sef:
    • .idea/inspectionProfiles/Project_Default.xml — gosodiadau dadansoddwr, byddant yn amlwg yn cael eu defnyddio wrth gynnal archwiliadau yn y cynhwysydd,
    • .idea/modules.xml - fel arall byddwn yn cael y gwall 'Nid oes modiwlau yn y prosiect hwn',
    • .idea/misc.xml - fel arall byddwn yn cael y gwall 'Nid yw'r JDK wedi'i ffurfweddu'n iawn ar gyfer y prosiect hwn',
    • *.iml-файлы — fel arall byddwn yn cael gwall am JDK heb ei ffurfweddu yn y modiwl.

Er bod y ffeiliau hyn fel arfer wedi'u cynnwys yn .gitignore, nid ydynt yn cynnwys unrhyw wybodaeth sy'n benodol i amgylchedd datblygwr penodol - yn wahanol i, er enghraifft, ffeil workspace.xml, lle mae gwybodaeth o'r fath wedi'i chynnwys, ac felly nid oes angen ei chyflawni.

Yr ateb amlwg yw pecynnu'r JDK ynghyd ag IDEA Community Edition i mewn i gynhwysydd, yn barod i'w ddefnyddio yn y prosiectau sy'n cael eu dadansoddi. Gadewch i ni ddewis cynhwysydd sylfaen addas, a dyma'r Dockerfile sy'n deillio o hyn:

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

Gan ddefnyddio'r opsiwn idea.config.path Fe wnaethon ni orfodi IDEA i chwilio am ei gyfluniad byd-eang yn y ffolder /etc/idea, gan fod ffolder cartref y defnyddiwr mewn amodau CI yn beth heb ei ddiffinio ac yn aml yn gwbl absennol.

Dyma sut olwg sydd ar y ffeil a gopïwyd i'r cynhwysydd. jdk.table.xml, sy'n nodi'r llwybrau i OpenJDK sydd wedi'i osod y tu mewn i'r cynhwysydd (gellir defnyddio ffeil debyg o'ch cyfeiriadur gosodiadau IDEA eich hun fel sail):

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>

Y ddelwedd orffenedig ar gael ar Docker Hub.

Cyn symud ymlaen, gadewch i ni wirio bod y dadansoddwr IDEA yn rhedeg mewn cynhwysydd:

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

Dylai'r dadansoddiad gael ei gwblhau'n llwyddiannus, a dylai nifer o ffeiliau .xml gydag adroddiadau dadansoddwr ymddangos yn yr is-ffolder target/idea_inspections.

Nawr nad oes unrhyw amheuaeth mwyach y gellir rhedeg y dadansoddwr IDEA mewn modd annibynnol mewn unrhyw amgylchedd CI, rydym yn symud ymlaen i'r ail gam.

Cam 2. Arddangos a dadansoddi'r adroddiad

Mae cael yr adroddiad fel ffeil .xml yn hanner y frwydr; nawr mae angen iddo fod yn ddarllenadwy i bobl. Dylid defnyddio ei ganlyniadau hefyd mewn gatiau ansawdd—y rhesymeg a ddefnyddir i benderfynu a yw newid a dderbynnir yn pasio neu'n methu meini prawf ansawdd.

Bydd hyn yn ein helpu ni Ategyn NG Rhybuddion Jenkins, a ryddhawyd ym mis Ionawr 2019. Gyda'i gyflwyniad, mae llawer o ategion unigol ar gyfer gweithio gyda chanlyniadau dadansoddi statig yn Jenkins (CheckStyle, FindBugs, PMD, ac ati) bellach wedi'u marcio fel rhai sydd wedi dyddio.

Mae'r ategyn yn cynnwys dwy ran:

  • nifer o ddadansoddwyr casglwyr negeseuon (rhestr gyflawn yn cynnwys yr holl ddadansoddwyr sy'n hysbys i wyddoniaeth o AcuCobol i ZPT Lint),
  • un gwyliwr adroddiadau ar gyfer pob un ohonynt.

Rhybuddion Gall NG ddadansoddi rhybuddion crynhoydd Java a rhybuddion log gweithredu Maven, sydd, er eu bod yn weladwy'n gyson, yn anaml yn cael eu dadansoddi. Mae adroddiadau IntelliJ IDEA hefyd ymhlith y fformatau cydnabyddedig.

Gan fod yr ategyn yn newydd, mae'n gweithio'n dda gyda Jenkins Pipeline yn syth o'r bocs. Byddai cam adeiladu gan ei ddefnyddio yn edrych fel hyn (rydym yn syml yn dweud wrth yr ategyn pa fformat adroddiad y mae'n ei adnabod a pha ffeiliau i'w sganio):

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

Mae rhyngwyneb yr adroddiad fel hyn:

Rhedeg Archwiliadau IDEA IntelliJ ar Jenkins

Yn gyfleus, mae'r rhyngwyneb hwn yn gyffredinol ar gyfer pob dadansoddwr cydnabyddedig. Mae'n cynnwys diagram rhyngweithiol o ddosbarthiad canfyddiadau yn ôl categori a graff sy'n dangos deinameg nifer y canfyddiadau. Mae chwiliad cyflym ar gael yn y grid ar waelod y dudalen. Yr unig broblem gydag archwiliadau IDEA nad oedd yn gweithio'n gywir oedd y gallu i bori cod yn uniongyrchol yn Jenkins (er ar gyfer adroddiadau eraill, fel Checkstyle, mae'r ategyn hwn yn gwneud hyn yn hyfryd). Ymddengys mai nam yn nansoddydd adroddiadau IDEA yw hwn y mae angen ei drwsio.

Rhybuddion Mae galluoedd NG yn cynnwys y gallu i gasglu canfyddiadau o sawl ffynhonnell mewn un adroddiad a rhaglennu Quality Gates, gan gynnwys "ratchet" cynulliad cyfeirio. Mae rhywfaint o ddogfennaeth ar raglennu Quality Gates ar gael. yma — fodd bynnag, nid yw'n gyflawn, ac mae'n rhaid i chi edrych ar y cod ffynhonnell. Ar y llaw arall, i gael rheolaeth lwyr dros yr hyn sy'n digwydd, gallwch chi weithredu'r "ratchet" eich hun (gweler fy post blaenorol ar y pwnc hwn).

Casgliad

Cyn i mi ddechrau paratoi'r deunydd hwn, penderfynais chwilio: oedd unrhyw un eisoes wedi ysgrifennu am y pwnc hwn ar Habr? Dim ond dod o hyd iddo wnes i Cyfweliad 2017 с ieir, lle mae'n dweud:

Hyd y gwn i, nid oes unrhyw integreiddio â Jenkins nac ategyn Maven […] Mewn egwyddor, gallai unrhyw selogwr wneud i IDEA Community Edition a Jenkins weithio gyda'i gilydd, a byddai llawer yn elwa ohono yn unig.

Wel, ddwy flynedd yn ddiweddarach mae gennym ni ategyn Warnings NG, ac mae'r cyfeillgarwch hwn o'r diwedd wedi dwyn ffrwyth!

Ffynhonnell: hab.com

Prynu gwesteio dibynadwy ar gyfer gwefannau sydd â diogelwch DDoS, gweinyddwyr VPS VDS 🔥 Prynu cynnal gwefannau dibynadwy gyda diogelwch DDoS, gweinyddion VPS VDS | ProHoster