Ջենկինսի վրա 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 կարգավորումներով կարող է հիմք ընդունվել).
Նախքան առաջ անցնելը, եկեք ստուգենք, որ 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-ի հետ: Իր մասնակցությամբ կառուցման քայլը կունենա հետևյալ տեսքը (մենք պարզապես պլագինին ասում ենք, թե հաշվետվության ինչ ձևաչափ ենք ճանաչում և ինչ ֆայլեր պետք է սկանավորվեն).
Հարմարավետորեն, այս ինտերֆեյսը ունիվերսալ է բոլոր ճանաչված անալիզատորների համար: Այն պարունակում է ըստ կատեգորիաների գտածոների բաշխման ինտերակտիվ դիագրամ և գտածոների քանակի փոփոխությունների դինամիկայի գրաֆիկ։ Դուք կարող եք արագ որոնում կատարել էջի ներքևի ցանցում: Միակ բանը, որը ճիշտ չէր աշխատում IDEA-ի ստուգումների համար, կոդի ուղղակիորեն Jenkins-ում զննելու հնարավորությունն էր (չնայած այլ զեկույցների համար, օրինակ՝ Checkstyle, այս փլագինը կարող է դա անել գեղեցիկ կերպով): Կարծես թե սա IDEA զեկույցի վերլուծիչի վրիպակ է, որը պետք է շտկվի:
Warnings NG-ի առանձնահատկություններից է տարբեր աղբյուրներից ստացված արդյունքները մեկ հաշվետվության և Quality Gates ծրագրում համախմբելու հնարավորությունը, ներառյալ տեղեկատուի հավաքման համար նախատեսված «կռվան»: Որոշ Quality Gates-ի ծրագրավորման փաստաթղթեր կան այստեղ - այնուամենայնիվ, այն ամբողջական չէ, և դուք պետք է նայեք աղբյուրի կոդը: Մյուս կողմից, տեղի ունեցողի վրա լիակատար վերահսկողության համար «չարչափը» կարող է իրականացվել ինքնուրույն (տե՛ս իմ նախորդ գրառումը այս թեմայի մասին):
Ամփոփում
Նախքան այս նյութը պատրաստելը, ես որոշեցի որոնել՝ ինչ-որ մեկն արդեն գրել է այս թեմայով Habré-ում: Ես միայն գտա հարցազրույց 2017թ с Լանիորտեղ նա ասում է.
Որքան ես գիտեմ, չկա ինտեգրում Jenkins-ի կամ maven plugin-ի հետ […] Սկզբունքորեն, ցանկացած էնտուզիաստ կարող է ընկերանալ IDEA Community Edition-ի և Jenkins-ի հետ, շատերը միայն կշահեն դրանից:
Դե, երկու տարի անց մենք ունենք Warnings NG Plugin, և վերջապես այս բարեկամությունն իրականություն դարձավ: