Ջենկինսի վրա IntelliJ IDEA-ի ստուգումներ են իրականացնում

IntelliJ IDEA-ն այսօր ունի ամենաառաջադեմ ստատիկ Java կոդերի անալիզատորը, որն իր հնարավորություններով շատ հետ է թողնում այնպիսի «վետերանների», ինչպիսիք են. Ստուգատես и Spotbugs. Դրա բազմաթիվ «ստուգումները» ստուգում են կոդը տարբեր ասպեկտներով՝ կոդավորման ոճից մինչև բնորոշ սխալներ:

Այնուամենայնիվ, քանի դեռ վերլուծության արդյունքները ցուցադրվում են միայն մշակողի IDE-ի տեղական ինտերֆեյսում, դրանք քիչ օգուտ են բերում զարգացման գործընթացին: Ստատիկ վերլուծություն պետք է կատարվի Որպես խողովակաշարի կառուցման առաջին քայլ, դրա արդյունքները պետք է սահմանեն որակյալ դարպասներ, իսկ շինարարությունը պետք է ձախողվի, եթե որակյալ դարպասները չանցնեն: Հայտնի է, որ TeamCity CI-ն ինտեգրված է IDEA-ի հետ։ Բայց նույնիսկ եթե դուք չեք օգտագործում TeamCity-ն, կարող եք հեշտությամբ փորձել IDEA-ի ստուգումներ իրականացնել ցանկացած այլ CI սերվերում: Ես առաջարկում եմ ձեզ տեսնել, թե ինչպես կարելի է դա անել՝ օգտագործելով IDEA Community Edition, Jenkins և Warnings NG հավելվածը:

Քայլ 1. Անալիզը կատարեք տարայի մեջ և ստացեք հաշվետվություն

Սկզբում IDE (desktop application!) գործարկելու գաղափարը CI համակարգի ներսում, որը չունի գրաֆիկական ինտերֆեյս, կարող է կասկածելի և շատ անհանգիստ թվալ: Բարեբախտաբար, IDEA մշակողները տրամադրել են գործարկման հնարավորություն կոդի ձևաչափում и ստուգումներ հրամանի տողից: Ավելին, IDEA-ն այս ռեժիմով գործարկելու համար գրաֆիկական ենթահամակարգ չի պահանջվում, և այդ առաջադրանքները կարող են կատարվել տեքստային կեղևով սերվերների վրա:

Ստուգումները սկսվում են սցենարի միջոցով bin/inspect.sh IDEA տեղադրման գրացուցակից: Պահանջվող պարամետրերն են.

  • նախագծի ամբողջական ուղին (հարազատները չեն աջակցվում),
  • ուղին դեպի .xml ֆայլ՝ ստուգման կարգավորումներով (սովորաբար գտնվում է նախագծի ներսում .idea/inspectionProfiles/Project_Default.xml-ում),
  • ամբողջական ճանապարհ դեպի այն թղթապանակը, որտեղ կպահվեն .xml ֆայլերը՝ վերլուծության արդյունքների վերաբերյալ հաշվետվություններով:

Բացի այդ, ակնկալվում է, որ

  • Java SDK-ի ուղին կկարգավորվի IDE-ում, հակառակ դեպքում վերլուծությունը չի աշխատի: Այս կարգավորումները պարունակվում են կազմաձևման ֆայլում jdk.table.xml IDEA գլոբալ կազմաձևման թղթապանակում: IDEA-ի գլոբալ կոնֆիգուրացիան ինքնին գտնվում է օգտագործողի հիմնական գրացուցակում լռելյայնորեն, բայց այս վայրը կարելի է հստակորեն նշել ֆայլում idea.properties.
  • Վերլուծված նախագիծը պետք է լինի վավեր IDEA նախագիծ, որի համար դուք պետք է կատարեք որոշ ֆայլեր, որոնք սովորաբար անտեսվում են տարբերակի վերահսկման համար, մասնավորապես.
    • .idea/inspectionProfiles/Project_Default.xml — անալիզատորի կարգավորումները, դրանք ակնհայտորեն կօգտագործվեն կոնտեյներով ստուգումներ իրականացնելիս,
    • .idea/modules.xml — հակառակ դեպքում մենք կստանանք «Այս նախագիծը մոդուլներ չի պարունակում» սխալը,
    • .idea/misc.xml — հակառակ դեպքում մենք կստանանք «JDK-ն ճիշտ կազմաձևված չէ այս նախագծի համար» սխալը,
    • *.iml-файлы — հակառակ դեպքում մենք սխալ կստանանք մոդուլում չկարգավորված JDK-ի մասին:

Չնայած այս ֆայլերը սովորաբար ներառված են .gitignore, դրանք կոնկրետ մշակողի միջավայրին հատուկ որևէ տեղեկատվություն չեն պարունակում՝ ի տարբերություն, օրինակ, ֆայլի workspace.xml, որտեղ նման տեղեկատվություն է պարունակվում, և, հետևաբար, այն կատարելու անհրաժեշտություն չկա:

Ակնհայտ լուծումը JDK-ն IDEA Community Edition-ի հետ միասին փաթեթավորելն է կոնտեյների մեջ այնպիսի ձևով, որը պատրաստ կլինի վերլուծված նախագծերի վրա «տեղադրվելու»: Եկեք ընտրենք հարմար բազային կոնտեյներ, և ահա թե ինչ կլինի մեր 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

Օգտագործելով տարբերակը idea.config.path մենք ստիպեցինք IDEA-ին փնտրել իր գլոբալ կոնֆիգուրացիան թղթապանակում /etc/idea, քանի որ CI-ում աշխատելիս օգտագործողի տնային թղթապանակը անորոշ բան է և հաճախ բացակայում է։

Կոնտեյների մեջ պատճենված ֆայլն այսպիսի տեսք ունի. jdk.table.xml, որը պարունակում է կոնտեյների ներսում տեղադրված OpenJDK-ի ուղիները (ձեր սեփական գրացուցակի նման ֆայլը 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>

Ավարտված պատկերը հասանելի է Docker Hub-ում.

Նախքան առաջ անցնելը, եկեք ստուգենք, որ IDEA անալիզատորը աշխատում է կոնտեյներով.

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

Վերլուծությունը պետք է հաջողությամբ աշխատի, և անալիզատորի հաշվետվություններով բազմաթիվ .xml ֆայլեր պետք է հայտնվեն target/idea_inspections ենթաթղթապանակում:

Այժմ այլևս կասկած չկա, որ IDEA անալիզատորը կարող է ինքնուրույն գործարկվել ցանկացած CI միջավայրում, և մենք անցնում ենք երկրորդ քայլին:

Քայլ 2. Ցուցադրել և վերլուծել հաշվետվությունը

Զեկույցը .xml ֆայլերի տեսքով ստանալը գործի կեսն է, այժմ դուք պետք է այն դարձնեք մարդու համար ընթեռնելի: Եվ նաև դրա արդյունքները պետք է օգտագործվեն որակի դարպասներում՝ տրամաբանությունը որոշելու, թե ընդունված փոփոխությունն անցնում է, թե ձախողվում է որակի չափանիշներով։

Սա մեզ կօգնի Jenkins Warnings NG Plugin, որը թողարկվել է 2019 թվականի հունվարին։ Իր գալուստով, Jenkins-ում ստատիկ վերլուծության արդյունքների հետ աշխատելու համար նախատեսված շատ անհատական ​​հավելումներ (CheckStyle, FindBugs, PMD և այլն) այժմ նշվում են որպես հնացած:

Փլագինը բաղկացած է երկու մասից.

  • բազմաթիվ անալիզատորի հաղորդագրությունների հավաքիչներ (լրիվ ցանկը ներառում է գիտությանը հայտնի բոլոր անալիզատորները՝ AcuCobol-ից մինչև ZPT Lint),
  • նրանց բոլորի համար մեկ զեկույց դիտող:

Այն բաների ցանկը, որոնք Warnings NG-ը կարող է վերլուծել, ներառում է նախազգուշացումներ Java կոմպիլյատորից և նախազգուշացումներ Maven-ի կատարման մատյաններից. չնայած դրանք անընդհատ տեսանելի են, դրանք հազվադեպ են հատուկ վերլուծվում: IntelliJ IDEA զեկույցները նույնպես ներառված են ճանաչված ձևաչափերի ցանկում:

Քանի որ հավելվածը նոր է, այն ի սկզբանե լավ է համագործակցում Jenkins Pipeline-ի հետ: Իր մասնակցությամբ կառուցման քայլը կունենա հետևյալ տեսքը (մենք պարզապես պլագինին ասում ենք, թե հաշվետվության ինչ ձևաչափ ենք ճանաչում և ինչ ֆայլեր պետք է սկանավորվեն).

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

Զեկույցի ինտերֆեյսն ունի հետևյալ տեսքը.

Ջենկինսի վրա IntelliJ IDEA-ի ստուգումներ են իրականացնում

Հարմարավետորեն, այս ինտերֆեյսը ունիվերսալ է բոլոր ճանաչված անալիզատորների համար: Այն պարունակում է ըստ կատեգորիաների գտածոների բաշխման ինտերակտիվ դիագրամ և գտածոների քանակի փոփոխությունների դինամիկայի գրաֆիկ։ Դուք կարող եք արագ որոնում կատարել էջի ներքևի ցանցում: Միակ բանը, որը ճիշտ չէր աշխատում IDEA-ի ստուգումների համար, կոդի ուղղակիորեն Jenkins-ում զննելու հնարավորությունն էր (չնայած այլ զեկույցների համար, օրինակ՝ Checkstyle, այս փլագինը կարող է դա անել գեղեցիկ կերպով): Կարծես թե սա IDEA զեկույցի վերլուծիչի վրիպակ է, որը պետք է շտկվի:

Warnings NG-ի առանձնահատկություններից է տարբեր աղբյուրներից ստացված արդյունքները մեկ հաշվետվության և Quality Gates ծրագրում համախմբելու հնարավորությունը, ներառյալ տեղեկատուի հավաքման համար նախատեսված «կռվան»: Որոշ Quality Gates-ի ծրագրավորման փաստաթղթեր կան այստեղ - այնուամենայնիվ, այն ամբողջական չէ, և դուք պետք է նայեք աղբյուրի կոդը: Մյուս կողմից, տեղի ունեցողի վրա լիակատար վերահսկողության համար «չարչափը» կարող է իրականացվել ինքնուրույն (տե՛ս իմ նախորդ գրառումը այս թեմայի մասին):

Ամփոփում

Նախքան այս նյութը պատրաստելը, ես որոշեցի որոնել՝ ինչ-որ մեկն արդեն գրել է այս թեմայով Habré-ում: Ես միայն գտա հարցազրույց 2017թ с Լանիորտեղ նա ասում է.

Որքան ես գիտեմ, չկա ինտեգրում Jenkins-ի կամ maven plugin-ի հետ […] Սկզբունքորեն, ցանկացած էնտուզիաստ կարող է ընկերանալ IDEA Community Edition-ի և Jenkins-ի հետ, շատերը միայն կշահեն դրանից:

Դե, երկու տարի անց մենք ունենք Warnings NG Plugin, և վերջապես այս բարեկամությունն իրականություն դարձավ:

Source: www.habr.com

Добавить комментарий