Ke holo nei i nā mākaʻikaʻi IntelliJ IDEA ma Jenkins

Loaʻa i ka IntelliJ IDEA i kēia lā ka mea hoʻoponopono code Java static maikaʻi loa, i kona hiki ke waiho i hope o nā "veterans" e like me Kaila nānā и Spotbugs. ʻO kāna mau "nānā" he nui e nānā i ke code ma nā ʻano like ʻole, mai ke ʻano coding a hiki i nā pōpoki maʻamau.

Eia nō naʻe, ʻoiai ke hōʻike ʻia nei nā hopena loiloi ma ka ʻaoʻao kūloko o ka IDE o ka mea hoʻomohala, ʻaʻole ia e hoʻohana i ke kaʻina hana. ʻIkepili paʻa pono e hookoia Ma ke ʻano he hana mua o ka pipeline kūkulu, pono e wehewehe nā hopena i nā ʻīpuka maikaʻi, a pono e hāʻule ke kūkulu inā ʻaʻole i hala nā ʻīpuka maikaʻi. Ua ʻike ʻia ua hui pū ʻia ʻo TeamCity CI me IDEA. Akā inā ʻaʻole ʻoe e hoʻohana i ka TeamCity, hiki iā ʻoe ke hoʻāʻo maʻalahi e holo i nā nānā IDEA ma kekahi kikowaena CI ʻē aʻe. Manaʻo wau e ʻike ʻoe pehea e hana ʻia ai me ka hoʻohana ʻana i ka IDEA Community Edition, Jenkins a me Warnings NG plugin.

KaʻAnuʻu Hana 1. E holo i ka anamanaʻo i loko o ka ipu a loaa i ka hoike

I ka wā mua, ʻo ka manaʻo o ka holo ʻana i kahi IDE (palapala pākaukau!) i loko o kahi ʻōnaehana CI ʻaʻole i loaʻa kahi kiʻi kiʻi e like me ka kānalua a pilikia loa. ʻO ka mea pōmaikaʻi, ua hāʻawi nā mea hoʻomohala IDEA i ka hiki ke holo hoʻopalapala code и nā nānā ʻana mai ka laina kauoha. Eia kekahi, no ka holo ʻana i ka IDEA ma kēia ʻano, ʻaʻole koi ʻia kahi subsystem kiʻi a hiki ke hana ʻia kēia mau hana ma nā kikowaena me kahi pūpū kikokikona.

Hoʻomaka ʻia ka nānā ʻana me ka hoʻohana ʻana i kahi palapala bin/inspect.sh mai ka papa kuhikuhi hoʻonohonoho IDEA. ʻO nā ʻāpana e pono ai:

  • ala piha i ka papahana (ʻaʻole kākoʻo ʻia nā ʻohana),
  • ala i ka waihona .xml me nā hoʻonohonoho nānā (ʻike mau i loko o ka papahana ma .idea/inspectionProfiles/Project_Default.xml),
  • ʻO ke ala piha i ka waihona kahi e mālama ʻia ai nā faila .xml me nā hōʻike e pili ana i nā hualoaʻa.

Eia hou, ua manaoia

  • e hoʻonohonoho ʻia ke ala i ka Java SDK i ka IDE, inā ʻaʻole e holo ka loiloi. Aia kēia mau hoʻonohonoho i ka faila hoʻonohonoho jdk.table.xml i loko o ka waihona hoʻonohonoho honua IDEA. Aia ka IDEA hoʻonohonoho honua ponoʻī ma ka papa kuhikuhi home o ka mea hoʻohana ma ka paʻamau, akā ʻo kēia wahi hiki ke hoakaka pono ma ka waihona idea.properties.
  • Pono ka papahana i kālailai ʻia he papahana IDEA kūpono, kahi āu e hana ai i kekahi mau faila i mālama ʻole ʻia i ka mana mana, ʻo ia hoʻi:
    • .idea/inspectionProfiles/Project_Default.xml - nā hoʻonohonoho analyer, e hoʻohana ʻia lākou i ka wā e holo ana i ka nānā ʻana i ka ipu,
    • .idea/modules.xml - inā ʻaʻole e loaʻa iā mākou ka hewa 'ʻAʻohe modules kēia papahana',
    • .idea/misc.xml - inā ʻaʻole e loaʻa iā mākou ka hewa 'ʻAʻole i hoʻonohonoho pono ʻia ka JDK no kēia papahana',
    • *.iml-файлы - inā ʻaʻole e loaʻa iā mākou kahi hewa e pili ana i kahi JDK i hoʻonohonoho ʻole ʻia i ka module.

ʻOiai ua hoʻokomo pinepine ʻia kēia mau faila i .gitignore, ʻaʻohe o lākou ʻike kikoʻī i ke kaiapuni o kahi mea hoʻomohala - ʻaʻole like, no ka laʻana, kahi faila workspace.xml, kahi i loaʻa ai ia ʻike, a no laila ʻaʻole pono e hana.

ʻO ka hopena maopopo ʻo ia ka hoʻopili ʻana i ka JDK me ka IDEA Community Edition i loko o kahi pahu i kahi ʻano mākaukau e "pitted" ma nā papahana i kālailai ʻia. E koho mākou i kahi pahu waihona kūpono, a ʻo ia kā mākou Dockerfile:

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

Ke hoʻohana nei i ke koho idea.config.path ua koi mākou i ka IDEA e ʻimi i kāna hoʻonohonoho honua i ka waihona /etc/idea, no ka mea, ʻo ka waihona home o ka mea hoʻohana i ka wā e hana ana ma CI he mea maopopo ʻole a ʻaʻole pinepine.

ʻO kēia ke ʻano o ka faila i kope ʻia i ka ipu: jdk.table.xml, aia nā ala i OpenJDK i hoʻokomo ʻia i loko o ka pahu (hiki ke lawe ʻia kahi faila like mai kāu papa kuhikuhi ponoʻī me nā hoʻonohonoho IDEA):

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>

ʻO ke kiʻi i hoʻopauʻia loaʻa ma Docker Hub.

Ma mua o ka neʻe ʻana, e nānā kāua e holo ana ka mea loiloi IDEA i ka ipu:

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

Pono e holo maikaʻi ka hoʻopaʻa ʻana, a ʻike ʻia nā faila .xml he nui me nā hōʻike loiloi i loko o ka subfolder target/idea_inspections.

I kēia manawa, ʻaʻohe mea kānalua e hiki ke holo kaʻawale ka mea kālailai IDEA ma kekahi wahi CI, a neʻe mākou i ka lua.

KaʻAnuʻu Hana 2. Hōʻike a kālailai i ka hōʻike

ʻO ka loaʻa ʻana o ka hōʻike ma ke ʻano o nā faila .xml ka hapalua o ke kaua i kēia manawa pono ʻoe e hoʻolilo iā ia i hiki ke heluhelu ʻia e ke kanaka. A pono e hoʻohana ʻia kāna mau hopena i nā ʻīpuka maikaʻi - ʻo ke kumu no ka hoʻoholo ʻana i ka hala a i ʻole ka hāʻule ʻana o ka hoʻololi i ʻae ʻia e like me nā koina maikaʻi.

E kōkua kēia iā mākou ʻO Jenkins Warnings NG Plugin, i hoʻokuʻu ʻia ma Ianuali 2019. Me kona hiki ʻana mai, nui nā plugins pilikino no ka hana ʻana me nā hopena loiloi static ma Jenkins (CheckStyle, FindBugs, PMD, a me nā mea ʻē aʻe) i hōʻailona ʻia i ka wā kahiko.

Aia ka plugin i ʻelua ʻāpana:

  • nui nā mea hōʻiliʻili memo loiloi (piha piha e pili ana i nā mea anaana a pau i ʻike ʻia i ka ʻepekema mai AcuCobol a ZPT Lint),
  • he mea nana hoike hookahi no lakou a pau.

ʻO ka papa inoa o nā mea a Warnings NG hiki ke nānā i nā ʻōlelo aʻo mai ka Java compiler a me nā ʻōlelo aʻo mai nā lāʻau hoʻokō Maven: ʻoiai ke ʻike mau ʻia lākou, ʻaʻole i nānā pono ʻia. Hoʻokomo pū ʻia nā hōʻike IntelliJ IDEA i ka papa inoa o nā palapala i ʻike ʻia.

No ka mea he mea hou ka plugin, ua hui mua ia me Jenkins Pipeline. E like ke ʻano o ke kūkulu ʻana me kona komo ʻana (e haʻi wale mākou i ka plugin i ke ʻano hōʻike a mākou e ʻike ai a me nā faila e nānā ʻia):

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

Penei ke ano o ka interface hoike:

Ke holo nei i nā mākaʻikaʻi IntelliJ IDEA ma Jenkins

ʻO ka maʻalahi, ʻo kēia interface ka mea āpau no nā mea loiloi i ʻike ʻia. Loaʻa iā ia kahi kiʻi pāʻani o ka māhele ʻana o nā mea i loaʻa ma ka ʻāpana a me kahi pakuhi o ka hoʻololi ʻana i ka helu o nā mea i loaʻa. Hiki iā ʻoe ke hana i kahi hulina wikiwiki ma ka mākia ma lalo o ka ʻaoʻao. ʻO ka mea wale nō i hana pono ʻole no ka nānā ʻana i ka IDEA, ʻo ia ka hiki ke nānā pono i ka code ma Jenkins (ʻoiai no nā hōʻike ʻē aʻe, no ka laʻana ʻo Checkstyle, hiki i kēia plugin ke hana i kēia nani). Me he mea lā he kuhi kēia i ka parser hōʻike IDEA pono e hoʻoponopono ʻia.

Ma waena o nā hiʻohiʻona o Warnings NG ka hiki ke hōʻuluʻulu i nā ʻike mai nā kumu like ʻole i hoʻokahi hōʻike a me ka papahana Quality Gates, me kahi "ratchet" no ka hui kuhikuhi. Loaʻa kekahi mau palapala hoʻolālā Quality Gates maanei - akā naʻe, ʻaʻole i pau, a pono ʻoe e nānā i ke kumu kumu. Ma ka ʻaoʻao ʻē aʻe, no ka mana piha o ka mea e hana nei, hiki ke hoʻokō kūʻokoʻa ka "ratchet" (e ʻike i kaʻu pou mua e pili ana i kēia kumuhana).

hopena

Ma mua o ka hoʻomaka ʻana e hoʻomākaukau i kēia mea, ua hoʻoholo wau e ʻimi: ua kākau kekahi ma kēia kumuhana ma Habré? Ua loaʻa wale iaʻu nīnauele 2017 с lanykahi āna i ʻōlelo ai:

E like me kaʻu i ʻike ai, ʻaʻohe hoʻohui me Jenkins a i ʻole kahi plugin maven […] Ma ke kumu, hiki i nā mea hoihoi ke hoʻolauna me IDEA Community Edition a me Jenkins, nui wale ka poʻe e pōmaikaʻi mai kēia.

ʻAe, ʻelua makahiki ma hope mai ua loaʻa iā mākou ʻo Warnings NG Plugin, a i ka hopena ua hoʻokō ʻia kēia pilina!

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka