Ṣiṣe awọn ayewo IntelliJ IDEA lori Jenkins

IntelliJ IDEA loni ni olutupalẹ koodu Java aimi to ti ni ilọsiwaju julọ, eyiti ninu awọn agbara rẹ fi silẹ jinna lẹhin iru “awọn Ogbo” bii Aṣayẹwo и Spotbugs. Awọn “awọn ayewo” lọpọlọpọ rẹ ṣayẹwo koodu ni awọn aaye pupọ, lati ara ifaminsi si awọn idun aṣoju.

Bibẹẹkọ, niwọn igba ti awọn abajade itupalẹ ba han nikan ni wiwo agbegbe ti IDE idagbasoke, wọn ko ni lilo diẹ si ilana idagbasoke. Ayẹwo aimi gbọdọ ṣẹ Gẹgẹbi igbesẹ akọkọ ti opo gigun ti epo, awọn abajade rẹ yẹ ki o ṣalaye awọn ẹnubode didara, ati kọ yẹ ki o kuna ti awọn ẹnu-ọna didara ko ba kọja. O mọ pe TeamCity CI ti ṣepọ pẹlu IDEA. Ṣugbọn paapaa ti o ko ba lo TeamCity, o le ni rọọrun gbiyanju ṣiṣe awọn ayewo IDEA ni eyikeyi olupin CI miiran. Mo daba pe ki o rii bii eyi ṣe le ṣee ṣe nipa lilo IDEA Community Edition, Jenkins ati Awọn ohun itanna NG.

Igbesẹ 1. Ṣiṣe awọn itupalẹ ninu apo eiyan ati gba ijabọ kan

Ni akọkọ, imọran ti ṣiṣiṣẹ IDE kan (ohun elo tabili tabili!) Ninu eto CI kan ti ko ni wiwo ayaworan le dabi iyalẹnu ati wahala pupọ. O da, awọn olupilẹṣẹ IDEA ti pese agbara lati ṣiṣẹ koodu kika и ayewo lati laini aṣẹ. Pẹlupẹlu, lati ṣiṣẹ IDEA ni ipo yii, ko nilo eto ipilẹ awọn aworan ati pe awọn iṣẹ ṣiṣe wọnyi le ṣee ṣe lori awọn olupin pẹlu ikarahun ọrọ kan.

Awọn ayewo ti ṣe ifilọlẹ ni lilo iwe afọwọkọ kan bin/inspect.sh lati IDEA fifi sori liana. Awọn paramita ti a beere ni:

  • ọna kikun si iṣẹ akanṣe (awọn ibatan ko ni atilẹyin),
  • ọna si faili .xml pẹlu awọn eto ayewo (nigbagbogbo wa ninu iṣẹ akanṣe ni .idea/inspectionProfiles/Project_Default.xml),
  • ọna kikun si folda ninu eyiti awọn faili .xml pẹlu awọn ijabọ lori awọn abajade itupalẹ yoo wa ni ipamọ.

Ni afikun, o ti wa ni o ti ṣe yẹ wipe

  • ọna si Java SDK yoo wa ni tunto ni IDE, bibẹkọ ti awọn onínọmbà yoo ko ṣiṣẹ. Awọn eto wọnyi wa ninu faili iṣeto ni jdk.table.xml ni IDEA agbaye iṣeto ni folda. Iṣeto ni agbaye IDEA funrarẹ wa ninu itọsọna ile olumulo nipasẹ aiyipada, ṣugbọn ipo yii le ti wa ni pato pato ninu faili idea.properties.
  • Ise agbese ti a ṣe atupale gbọdọ jẹ iṣẹ akanṣe IDEA ti o wulo, fun eyiti iwọ yoo ni lati ṣe diẹ ninu awọn faili ti o jẹ igbagbogbo foju si iṣakoso ẹya, eyun:
    • .idea/inspectionProfiles/Project_Default.xml - awọn eto atunnkanka, o han gedegbe wọn yoo ṣee lo nigba ṣiṣe awọn ayewo ninu apo eiyan,
    • .idea/modules.xml - bibẹẹkọ a yoo gba aṣiṣe 'Ise agbese yii ko ni awọn modulu',
    • .idea/misc.xml - bibẹẹkọ a yoo gba aṣiṣe naa 'JDK ko ni tunto daradara fun iṣẹ akanṣe yii',
    • *.iml-файлы - bibẹẹkọ a yoo gba aṣiṣe nipa JDK ti ko tunto ninu module naa.

Botilẹjẹpe awọn faili wọnyi nigbagbogbo wa ninu .gitignore, wọn ko ni eyikeyi alaye ni pato si agbegbe ti olupilẹṣẹ kan pato - ko dabi, fun apẹẹrẹ, faili kan workspace.xml, nibiti iru alaye ba wa ninu, ati nitorinaa ko si ye lati ṣe.

Ojutu ti o han gedegbe ni lati ṣajọ JDK pẹlu IDEA Community Edition sinu apoti kan ni fọọmu ti o ṣetan lati jẹ “pitted” lori awọn iṣẹ akanṣe atupale. Jẹ ki a yan apoti ipilẹ ti o yẹ, ati pe eyi ni ohun ti Dockerfile wa yoo jẹ:

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

Lilo aṣayan idea.config.path a fi agbara mu IDEA lati wa iṣeto ni agbaye ni folda naa /etc/idea, nitori pe folda ile olumulo nigba ti o ṣiṣẹ ni CI jẹ ohun ti ko ni idaniloju ati nigbagbogbo ko si patapata.

Eyi ni ohun ti faili ti a daakọ si apoti naa dabi: jdk.table.xml, eyiti o ni awọn ọna si OpenJDK ti a fi sori ẹrọ inu apo eiyan (faili ti o jọra lati inu ilana tirẹ pẹlu awọn eto IDEA le jẹ ipilẹ):

jdk.tabili.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>

Aworan ti o pari wa lori Docker Hub.

Ṣaaju ki o to lọ siwaju, jẹ ki a ṣayẹwo pe olutupalẹ IDEA nṣiṣẹ ninu apo eiyan:

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

Onínọmbà yẹ ki o ṣiṣẹ ni aṣeyọri, ati ọpọlọpọ awọn faili .xml pẹlu awọn ijabọ atunnkanka yẹ ki o han ni ibi-afẹde/ayẹwo_inspections folda.

Bayi ko si iyemeji eyikeyi mọ pe olutupalẹ IDEA le ṣee ṣiṣẹ ni imurasilẹ ni eyikeyi agbegbe CI, ati pe a tẹsiwaju si igbesẹ keji.

Igbesẹ 2. Ṣe afihan ati itupalẹ ijabọ naa

Gbigba ijabọ ni irisi awọn faili .xml jẹ idaji ogun; ni bayi o nilo lati jẹ ki o ṣee ṣe kika eniyan. Ati pe awọn abajade rẹ tun yẹ ki o lo ni awọn ẹnu-ọna didara - ọgbọn fun ṣiṣe ipinnu boya iyipada ti o gba kọja tabi kuna ni ibamu si awọn ibeere didara.

Eyi yoo ran wa lọwọ Jenkins Ikilọ NG Plugin, eyiti o jade ni Oṣu Kini ọdun 2019. Pẹlu dide rẹ, ọpọlọpọ awọn afikun ẹni kọọkan fun ṣiṣẹ pẹlu awọn abajade itupalẹ aimi ni Jenkins (CheckStyle, FindBugs, PMD, ati bẹbẹ lọ) ti samisi bi atijo.

Ohun itanna naa ni awọn ẹya meji:

  • ọpọlọpọ awọn olugba ifiranṣẹ olutupalẹ (atokọ pipe pẹlu gbogbo awọn atunnkanka ti a mọ si imọ-jinlẹ lati AcuCobol si ZPT Lint),
  • oluwo iroyin kan fun gbogbo wọn.

Atokọ awọn nkan ti Awọn Ikilọ NG le ṣe itupalẹ pẹlu awọn ikilọ lati olupilẹṣẹ Java ati awọn ikilọ lati awọn iwe ipaniyan Maven: botilẹjẹpe wọn han nigbagbogbo, wọn kii ṣe itupalẹ ni pataki. Awọn ijabọ IntelliJ IDEA tun wa ninu atokọ ti awọn ọna kika ti a mọ.

Niwọn igba ti ohun itanna jẹ tuntun, o ni ajọṣepọ ni akọkọ pẹlu Pipeline Jenkins. Igbesẹ kikọ pẹlu ikopa rẹ yoo dabi eyi (a kan sọ fun ohun itanna kini ọna kika ijabọ ti a mọ ati kini awọn faili yẹ ki o ṣayẹwo):

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

Ni wiwo ijabọ naa dabi eyi:

Ṣiṣe awọn ayewo IntelliJ IDEA lori Jenkins

Ni irọrun, wiwo yii jẹ gbogbo agbaye fun gbogbo awọn atunnkanka ti a mọ. O ni aworan atọwọdọwọ ti pinpin awọn wiwa nipasẹ ẹka ati aworan kan ti awọn agbara ti awọn ayipada ninu nọmba awọn wiwa. O le ṣe wiwa ni iyara ni akoj ni isalẹ ti oju-iwe naa. Ohun kan ṣoṣo ti ko ṣiṣẹ ni deede fun awọn ayewo IDEA ni agbara lati ṣawari koodu taara ni Jenkins (botilẹjẹpe fun awọn ijabọ miiran, fun apẹẹrẹ Checkstyle, ohun itanna yii le ṣe eyi ni ẹwa). O dabi pe eyi jẹ kokoro kan ninu olutọpa ijabọ IDEA ti o nilo lati ṣatunṣe.

Lara awọn ẹya ara ẹrọ ti Awọn Ikilọ NG ni agbara lati ṣajọpọ awọn awari lati awọn orisun oriṣiriṣi ninu ijabọ kan ati awọn Gates Didara eto, pẹlu “ratchet” fun apejọ itọkasi. Diẹ ninu awọn iwe siseto Gates Didara wa nibi - sibẹsibẹ, ko pari, ati pe o ni lati wo koodu orisun. Ni apa keji, fun iṣakoso pipe lori ohun ti n ṣẹlẹ, “ratchet” le ṣe imuse ni ominira (wo mi ti tẹlẹ post nipa akori yii).

ipari

Ṣaaju ki o to bẹrẹ lati pese ohun elo yii, Mo pinnu lati wa: Njẹ ẹnikan ti kọ tẹlẹ lori koko yii lori Habré? Mo ti ri nikan ifọrọwanilẹnuwo 2017 с ọlẹnibiti o ti sọ pe:

Gẹgẹ bi mo ti mọ, ko si isọpọ pẹlu Jenkins tabi ohun itanna maven […] Ni ipilẹ, alara eyikeyi le ṣe awọn ọrẹ pẹlu IDEA Community Edition ati Jenkins, ọpọlọpọ yoo ni anfani nikan lati eyi.

O dara, ọdun meji lẹhinna a ni Ikilọ NG Plugin, ati nikẹhin ọrẹ yii ti wa si imuse!

orisun: www.habr.com

Fi ọrọìwòye kun