Kuendesha ukaguzi wa IntelliJ IDEA kwenye Jenkins

IntelliJ IDEA leo ina kichanganuzi cha hali ya juu zaidi cha msimbo wa Java, ambacho kwa uwezo wake kinaacha nyuma sana "maveterani" kama vile. Mtindo wa kuangalia ΠΈ Spotbugs. "Kaguzi" zake nyingi hukagua msimbo katika vipengele mbalimbali, kutoka kwa mtindo wa usimbaji hadi hitilafu za kawaida.

Hata hivyo, mradi tu matokeo ya uchanganuzi yanaonyeshwa tu katika kiolesura cha ndani cha IDE ya msanidi programu, hayana manufaa kidogo kwa mchakato wa usanidi. Uchambuzi tuli lazima yatimizwe Kama hatua ya kwanza ya bomba la ujenzi, matokeo yake yanapaswa kufafanua milango ya ubora, na ujenzi unapaswa kushindwa ikiwa milango ya ubora haijapitishwa. Inajulikana kuwa TeamCity CI imeunganishwa na IDEA. Lakini hata kama hutumii TeamCity, unaweza kujaribu kwa urahisi kufanya ukaguzi wa IDEA kwenye seva nyingine yoyote ya CI. Ninapendekeza uone jinsi hii inaweza kufanywa kwa kutumia Toleo la Jumuiya ya IDEA, Jenkins na programu-jalizi ya Maonyo NG.

Hatua ya 1. Fanya uchambuzi kwenye chombo na upate ripoti

Mwanzoni, wazo la kuendesha IDE (programu ya kompyuta ya mezani!) Ndani ya mfumo wa CI ambao hauna kiolesura cha picha inaweza kuonekana kuwa mbaya na ngumu sana. Kwa bahati nzuri, wasanidi wa IDEA wametoa uwezo wa kuendesha uundaji wa msimbo ΠΈ ukaguzi kutoka kwa mstari wa amri. Zaidi ya hayo, ili kuendesha IDEA katika hali hii, mfumo mdogo wa graphics hauhitajiki na kazi hizi zinaweza kufanywa kwenye seva zilizo na shell ya maandishi.

Ukaguzi unazinduliwa kwa kutumia hati bin/inspect.sh kutoka kwa saraka ya usakinishaji wa IDEA. Vigezo vinavyohitajika ni:

  • njia kamili ya mradi (jamaa hazitumiki),
  • njia ya faili ya .xml iliyo na mipangilio ya ukaguzi (kawaida iko ndani ya mradi katika .idea/inspectionProfiles/Project_Default.xml),
  • njia kamili ya folda ambayo faili za .xml zilizo na ripoti za matokeo ya uchambuzi zitahifadhiwa.

Aidha, inatarajiwa kwamba

  • njia ya SDK ya Java itasanidiwa katika IDE, vinginevyo uchambuzi hautafanya kazi. Mipangilio hii iko kwenye faili ya usanidi jdk.table.xml kwenye folda ya usanidi ya IDEA ya kimataifa. Usanidi wa kimataifa wa IDEA yenyewe iko kwenye saraka ya nyumbani ya mtumiaji kwa chaguo-msingi, lakini eneo hili inaweza kubainishwa kwa uwazi katika faili idea.properties.
  • Mradi uliochanganuliwa lazima uwe mradi halali wa IDEA, ambao itabidi utoe faili kadhaa ambazo kawaida hupuuzwa kwa udhibiti wa toleo, ambazo ni:
    • .idea/inspectionProfiles/Project_Default.xml - mipangilio ya kichanganuzi, bila shaka itatumika wakati wa kufanya ukaguzi kwenye chombo,
    • .idea/modules.xml - la sivyo tutapata kosa 'Mradi huu hauna moduli',
    • .idea/misc.xml - la sivyo tutapata hitilafu 'JDK haijasanidiwa ipasavyo kwa mradi huu',
    • *.iml-Ρ„Π°ΠΉΠ»Ρ‹ - la sivyo tutapata hitilafu kuhusu JDK ambayo haijasanidiwa kwenye moduli.

Ingawa faili hizi kawaida hujumuishwa kwenye .gitignore, hazina habari yoyote maalum kwa mazingira ya msanidi fulani - tofauti, kwa mfano, faili workspace.xml, ambapo habari hiyo iko, na kwa hiyo hakuna haja ya kuifanya.

Suluhisho dhahiri ni kufunga JDK pamoja na Toleo la Jumuiya ya IDEA kwenye kontena katika fomu iliyo tayari "kupigwa" kwenye miradi iliyochanganuliwa. Wacha tuchague chombo cha msingi kinachofaa, na hii ndio Dockerfile yetu itakuwa:

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

Kutumia chaguo idea.config.path tulilazimisha IDEA kutafuta usanidi wake wa kimataifa kwenye folda /etc/idea, kwa sababu folda ya nyumbani ya mtumiaji wakati wa kufanya kazi katika CI ni jambo lisilo na uhakika na mara nyingi haipo kabisa.

Hivi ndivyo faili iliyonakiliwa kwenye kontena inaonekana kama: jdk.table.xml, ambayo ina njia za OpenJDK iliyosanikishwa ndani ya kontena (faili sawa kutoka kwa saraka yako mwenyewe iliyo na mipangilio ya IDEA inaweza kuchukuliwa kama msingi):

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>

Picha iliyokamilika inapatikana kwenye Docker Hub.

Kabla ya kuendelea, hebu tuangalie ikiwa kichanganuzi cha IDEA kinaendelea kwenye kontena:

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

Uchanganuzi unapaswa kutekelezwa kwa ufanisi, na faili nyingi za .xml zilizo na ripoti za kichanganuzi zinapaswa kuonekana katika folda ya target/idea_inspections.

Sasa hakuna shaka tena kwamba kichanganuzi cha IDEA kinaweza kuendeshwa kivyake katika mazingira yoyote ya CI, na tunaendelea hadi hatua ya pili.

Hatua ya 2. Onyesha na uchanganue ripoti

Kupata ripoti katika mfumo wa faili za .xml ni nusu ya vita; sasa unahitaji kuifanya isomeke na binadamu. Na pia matokeo yake yatumike katika mageti ya ubora - mantiki ya kuamua iwapo mabadiliko yanayokubalika yanapita au kushindwa kulingana na vigezo vya ubora.

Hii itatusaidia Jenkins Maonyo NG programu-jalizi, ambayo ilitolewa Januari 2019. Pamoja na ujio wake, programu-jalizi nyingi za kibinafsi za kufanya kazi na matokeo ya uchanganuzi tuli katika Jenkins (CheckStyle, FindBugs, PMD, n.k.) sasa zimetiwa alama kuwa hazitumiki.

Programu-jalizi ina sehemu mbili:

  • wakusanyaji wengi wa ujumbe wa analyzer (orodha kamili inajumuisha wachambuzi wote wanaojulikana kwa sayansi kutoka AcuCobol hadi ZPT Lint),
  • mtazamaji mmoja wa ripoti kwa wote.

Orodha ya mambo ambayo Maonyo NG inaweza kuchanganua ni pamoja na maonyo kutoka kwa mkusanyaji wa Java na maonyo kutoka kwa kumbukumbu za utekelezaji za Maven: ingawa yanaonekana kila mara, ni nadra kuchanganuliwa haswa. Ripoti za IntelliJ IDEA pia zimejumuishwa katika orodha ya miundo inayotambulika.

Kwa kuwa programu-jalizi ni mpya, hapo awali inaingiliana vizuri na Jenkins Bomba. Hatua ya ujenzi na ushiriki wake itaonekana kama hii (tunaambia tu programu-jalizi ni umbizo gani la ripoti tunalotambua na ni faili gani zinapaswa kuchanganuliwa):

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

Kiolesura cha ripoti kinaonekana kama hii:

Kuendesha ukaguzi wa IntelliJ IDEA kwenye Jenkins

Kwa urahisi, kiolesura hiki ni cha wote kwa wachanganuzi wote wanaotambulika. Ina mchoro unaoingiliana wa usambazaji wa matokeo kwa kategoria na grafu ya mienendo ya mabadiliko katika idadi ya matokeo. Unaweza kufanya utafutaji wa haraka katika gridi ya taifa chini ya ukurasa. Kitu pekee ambacho hakikufanya kazi kwa usahihi kwa ukaguzi wa IDEA ilikuwa uwezo wa kuvinjari nambari moja kwa moja katika Jenkins (ingawa kwa ripoti zingine, kwa mfano Checkstyle, programu-jalizi hii inaweza kufanya hivi kwa uzuri). Inaonekana kama hii ni hitilafu katika kichanganuzi cha ripoti ya IDEA ambayo inahitaji kurekebishwa.

Miongoni mwa vipengele vya Maonyo NG ni uwezo wa kujumlisha matokeo kutoka kwa vyanzo tofauti katika ripoti moja na mpango wa Quality Gates, ikijumuisha "ratchet" ya mkusanyiko wa marejeleo. Baadhi ya nyaraka za programu za Quality Gates zinapatikana hapa - hata hivyo, haijakamilika, na unapaswa kuangalia msimbo wa chanzo. Kwa upande mwingine, kwa udhibiti kamili wa kile kinachotokea, "ratchet" inaweza kutekelezwa kwa kujitegemea (tazama yangu chapisho lililopita kuhusu mada hii).

Hitimisho

Kabla ya kuanza kuandaa nyenzo hii, niliamua kutafuta: kuna mtu yeyote tayari ameandika juu ya mada hii juu ya Habre? Nimepata tu mahojiano 2017 с laniambapo anasema:

Nijuavyo, hakuna muunganisho na Jenkins au programu-jalizi ya maven […] Kimsingi, mshabiki yeyote anaweza kufanya urafiki na Toleo la Jumuiya ya IDEA na Jenkins, wengi wangefaidika tu na hili.

Naam, miaka miwili baadaye tuna Maonyo NG Programu-jalizi, na hatimaye urafiki huu umetimia!

Chanzo: mapenzi.com

Kuongeza maoni