Khiav IntelliJ IDEA tshuaj xyuas ntawm Jenkins

IntelliJ IDEA hnub no muaj qhov zoo tshaj plaws zoo li Java code analyzer, uas nyob rau hauv nws lub peev xwm tawm mus deb li "cov qub tub rog" xws li Checkstyle ΠΈ Spotbugs. Nws ntau "kev tshuaj xyuas" xyuas cov cai hauv ntau yam, los ntawm coding style mus rau kab laum.

Txawm li cas los xij, tsuav yog cov txiaj ntsig kev soj ntsuam tsuas yog tso tawm hauv lub zos interface ntawm tus tsim tawm IDE, lawv tsis tshua siv rau txoj kev txhim kho. Kev soj ntsuam zoo li qub yuav tsum ua kom tiav Raws li thawj kauj ruam ntawm kev tsim cov kav dej, nws cov txiaj ntsig yuav tsum txhais cov rooj vag zoo, thiab kev tsim yuav tsum ua tsis tiav yog tias cov rooj vag zoo tsis dhau. Nws paub tias TeamCity CI koom nrog IDEA. Tab sis txawm tias koj tsis siv TeamCity, koj tuaj yeem yooj yim sim khiav IDEA kev tshuaj xyuas hauv lwm tus CI server. Kuv xav kom koj pom tias qhov no tuaj yeem ua tiav li cas siv IDEA Community Edition, Jenkins thiab Warnings NG plugin.

Kauj Ruam 1. Khiav qhov kev tshuaj ntsuam hauv lub thawv thiab tau txais daim ntawv qhia

Thaum xub thawj, lub tswv yim ntawm kev khiav ib qho IDE (daim ntawv thov desktop!) hauv CI system uas tsis muaj graphical interface yuav zoo li dubious thiab teeb meem heev. Hmoov zoo, IDEA cov neeg tsim khoom tau muab lub peev xwm los khiav code formatting ΠΈ kev tshuaj xyuas los ntawm kab hais kom ua. Tsis tas li ntawd, txhawm rau khiav IDEA hauv hom no, tsis tas yuav muaj cov duab kos duab thiab cov haujlwm no tuaj yeem ua tiav ntawm cov servers nrog lub plhaub ntawv.

Kev tshuaj xyuas yog pib siv ib tsab ntawv bin/inspect.sh los ntawm IDEA installation directory. Cov parameter yuav tsum yog:

  • tag nrho txoj kev mus rau qhov project (cov txheeb ze tsis txaus siab),
  • txoj hauv kev mus rau cov ntaub ntawv .xml nrog kev tshuaj ntsuam xyuas (feem ntau nyob hauv qhov project hauv .idea/inspectionProfiles/Project_Default.xml),
  • tag nrho txoj hauv kev mus rau cov ntawv tais ceev tseg uas .xml cov ntaub ntawv nrog cov ntawv ceeb toom ntawm kev txheeb xyuas cov txiaj ntsig yuav muab khaws cia.

Tsis tas li ntawd, nws xav tias

  • txoj kev mus rau Java SDK yuav raug teeb tsa hauv IDE, txwv tsis pub qhov kev tshuaj ntsuam yuav tsis ua haujlwm. Cov chaw no muaj nyob rau hauv cov ntaub ntawv configuration jdk.table.xml nyob rau hauv IDEA ntiaj teb no configuration folder. Lub IDEA ntiaj teb no configuration nws tus kheej nyob rau hauv tus neeg siv lub tsev directory los ntawm lub neej ntawd, tab sis qhov chaw no tuaj yeem qhia meej meej hauv cov ntaub ntawv idea.properties.
  • qhov project raug tshuaj xyuas yuav tsum yog ib txoj haujlwm IDEA siv tau, uas koj yuav tau ua qee cov ntaub ntawv uas feem ntau tsis quav ntsej txog kev tswj hwm, uas yog:
    • .idea/inspectionProfiles/Project_Default.xml - ntsuas qhov ntsuas, lawv yuav pom tseeb siv thaum khiav kev tshuaj xyuas hauv lub thawv,
    • .idea/modules.xml - txwv tsis pub peb yuav tau txais qhov yuam kev 'Qhov project no tsis muaj modules',
    • .idea/misc.xml - txwv tsis pub peb yuav tau txais qhov yuam kev 'JDK tsis tau teeb tsa kom raug rau qhov project no',
    • *.iml-Ρ„Π°ΠΉΠ»Ρ‹ - txwv tsis pub peb yuav tau txais qhov yuam kev txog qhov tsis tau teeb tsa JDK hauv qhov module.

Txawm hais tias cov ntaub ntawv no feem ntau suav nrog .gitignore, lawv tsis muaj cov ntaub ntawv tshwj xeeb rau ib puag ncig ntawm ib tus neeg tsim khoom tshwj xeeb - tsis zoo li, piv txwv li, cov ntaub ntawv workspace.xml, qhov twg cov ntaub ntawv no muaj, thiab yog li tsis tas yuav tsum tau ua nws.

Txoj kev daws teeb meem yog txhawm rau ntim JDK nrog rau IDEA Community Edition rau hauv ib lub thawv rau hauv ib daim ntawv npaj "pitted" ntawm cov haujlwm txheeb xyuas. Cia peb xaiv lub thawv tsim nyog, thiab qhov no yog qhov peb Dockerfile yuav yog:

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

Siv qhov kev xaiv idea.config.path peb yuam IDEA mus nrhiav nws lub ntiaj teb configuration nyob rau hauv daim nplaub tshev /etc/idea, vim hais tias tus neeg siv lub tsev nplaub tshev thaum ua haujlwm hauv CI yog qhov tsis paub tseeb thiab feem ntau tsis tuaj.

Nov yog yam ntaub ntawv theej rau lub thawv zoo li: jdk.table.xml, uas muaj cov kev mus rau OpenJDK ntsia hauv lub thawv (cov ntaub ntawv zoo sib xws los ntawm koj tus kheej cov npe nrog IDEA teeb tsa tuaj yeem coj los ua lub hauv paus):

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>

Daim duab tiav muaj nyob rau ntawm Docker Hub.

Ua ntej yuav mus, cia peb xyuas seb tus IDEA analyzer khiav hauv lub thawv:

docker run --rm -v <ΠΏΡƒΡ‚ΡŒ/ΠΊ/Π²Π°ΡˆΠ΅ΠΌΡƒ/ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ>:/var/project inponomarev/intellij-idea-analyzer

Kev tsom xam yuav tsum tau ua tiav, thiab ntau cov ntaub ntawv .xml nrog cov ntaub ntawv txheeb xyuas yuav tsum tshwm sim hauv lub hom phiaj/idea_inspections subfolder.

Tam sim no tsis muaj qhov tsis ntseeg tias IDEA tus neeg soj ntsuam tuaj yeem khiav ib leeg hauv ib puag ncig CI, thiab peb mus rau theem thib ob.

Kauj Ruam 2. Tso saib thiab txheeb xyuas daim ntawv tshaj tawm

Tau txais daim ntawv tshaj tawm nyob rau hauv daim ntawv ntawm .xml cov ntaub ntawv yog ib nrab ntawm kev sib ntaus sib tua; tam sim no koj yuav tsum ua kom nws tib neeg nyeem. Thiab tseem nws cov txiaj ntsig yuav tsum tau siv rau hauv cov rooj vag zoo - lub logic rau kev txiav txim siab seb qhov kev lees paub dhau los lossis tsis ua raws li cov txheej txheem zoo.

Qhov no yuav pab tau peb Jenkins Warnings NG Plugin, uas tau tso tawm thaum Lub Ib Hlis 2019. Nrog nws qhov tshwm sim, ntau tus neeg plugins rau kev ua haujlwm nrog cov txiaj ntsig zoo li qub hauv Jenkins (CheckStyle, FindBugs, PMD, thiab lwm yam) tam sim no tau cim tias tsis siv lawm.

Lub plugin muaj ob ntu:

  • ntau tus kws tshuaj ntsuam xyuas cov lus sau (cov npe ua tiav suav nrog txhua tus kws tshuaj ntsuam xyuas paub txog kev tshawb fawb los ntawm AcuCobol rau ZPT Lint),
  • ib daim ntawv qhia saib rau txhua tus ntawm lawv.

Cov npe ntawm tej yam uas Warnings NG tuaj yeem txheeb xyuas suav nrog cov lus ceeb toom los ntawm Java compiler thiab cov lus ceeb toom los ntawm Maven tua cov cav: txawm hais tias lawv tau pom tas li, lawv tsis tshua muaj kev tshuaj xyuas tshwj xeeb. Cov ntawv ceeb toom IntelliJ IDEA kuj suav nrog hauv cov npe ntawm cov ntawv pom zoo.

Txij li thaum lub plugin tshiab, nws pib cuam tshuam zoo nrog Jenkins Pipeline. Cov kauj ruam tsim nrog nws txoj kev koom tes yuav zoo li qhov no (peb tsuas yog qhia lub plugin seb hom ntawv tshaj tawm peb paub thiab cov ntaub ntawv dab tsi yuav tsum tau tshuaj xyuas):

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

Daim ntawv qhia interface zoo li no:

Khiav IntelliJ IDEA tshuaj xyuas ntawm Jenkins

Conveniently, qhov no interface yog universal rau tag nrho cov paub soj ntsuam. Nws muaj cov duab sib tham sib ntawm kev faib cov kev tshawb pom los ntawm qeb thiab ib daim duab ntawm cov kev hloov pauv ntawm cov kev tshawb pom. Koj tuaj yeem ua qhov kev tshawb nrhiav ceev hauv daim phiaj hauv qab ntawm nplooj ntawv. Qhov tsuas yog qhov uas tsis ua haujlwm raug rau kev tshuaj xyuas IDEA yog lub peev xwm los xauj cov lej ncaj qha hauv Jenkins (txawm hais tias rau lwm cov ntawv ceeb toom, piv txwv li Checkstyle, cov plugin no tuaj yeem ua qhov no zoo nkauj). Nws zoo li qhov no yog kab laum hauv IDEA daim ntawv qhia parser uas yuav tsum tau kho.

Ntawm cov yam ntxwv ntawm Kev Ceeb Toom NG yog lub peev xwm los sau cov kev tshawb pom los ntawm ntau qhov chaw hauv ib daim ntawv tshaj tawm thiab cov kev pab cuam Zoo Gates, suav nrog "ratchet" rau kev sib sau ua ke. Muaj qee cov ntaub ntawv hais txog Quality Gates programming no - Txawm li cas los xij, nws tsis tiav, thiab koj yuav tsum tau saib ntawm qhov chaws. Ntawm qhov tod tes, txhawm rau tswj kom tiav qhov tshwm sim, "ratchet" tuaj yeem siv nws tus kheej (saib kuv yav dhau los ncej txog lub ntsiab lus no).

xaus

Ua ntej pib npaj cov ntaub ntawv no, kuv txiav txim siab mus tshawb: puas muaj leej twg tau sau cov ncauj lus no ntawm Habré? Kuv tsuas pom kev xam phaj 2017 с lajqhov twg nws hais tias:

Raws li kuv paub, tsis muaj kev koom ua ke nrog Jenkins lossis maven plugin […] Hauv txoj cai, txhua tus neeg nyiam tuaj yeem ua phooj ywg nrog IDEA Community Edition thiab Jenkins, ntau tus tsuas yog tau txais txiaj ntsig los ntawm qhov no.

Zoo, ob xyoos tom qab ntawd peb muaj Warnings NG Plugin, thiab thaum kawg no kev phooj ywg tau los ua tiav!

Tau qhov twg los: www.hab.com

Ntxiv ib saib