IntelliJ IDEA sot sot është me analistin më të avancuar statik të kodit Java, duke lënë shumë pas "veteranët" si dhe . Inspektimet e saj të shumta kontrollojnë kodin në aspekte të ndryshme, nga stili i kodimit deri te gabimet tipike.
MegjithatĂ«, pĂ«r momentin rezultatet e analizĂ«s shfaqen vetĂ«m nĂ« ndĂ«rfaqen lokale tĂ« IDE-sĂ« sĂ« zhvilluesit, duke i bĂ«rĂ« ato pak tĂ« dobishme pĂ«r procesin e zhvillimit. Analiza statike si njĂ« hap i parĂ« i konvejers sĂ« ndĂ«rtimit, rezultatet e saj duhet tĂ« pĂ«rcaktojnĂ« quality gates, dhe ndĂ«rtimi duhet tĂ« dĂ«shtojĂ« nĂ«se quality gates nuk kalohen. ĂshtĂ« e njohur se TeamCity CI Ă«shtĂ« e integruar me IDEA. Por edhe nĂ«se nuk po pĂ«rdorni TeamCity, mund ta provoni pĂ«r tĂ« ekzekutuar inspektimet e IDEA nĂ« çdo server tjetĂ«r CI. Le tĂ« shohim se si mund ta bĂ«jmĂ« kĂ«tĂ« duke pĂ«rdorur IDEA Community Edition, Jenkins dhe Warnings NG plugin.
Hapi 1. Nisim analizën në kontejner dhe marrim raportin
Për herë të parë, ideja për të lançuar IDE (aplikacioni desktop!) brenda një sistemi CI pa ndërfaqe grafike mund të duket e dyshimtë dhe shumë e lodhshme. Fatmirësisht, zhvilluesit e IDEA ofruan mundësinë për të lançuar dhe nga linja e komandës. Për më tepër, për të lançuar IDEA në këtë mënyrë nuk kërkohet një nënstrukturë grafike dhe këto detyra mund të kryhen në serverë me një shell tekstual.
Lançimi i inspektimeve bëhet përmes skenarit bin/inspect.sh nga direktoria e instalimit të IDEA. Si parametra kërkohen:
- rruga e plotë deri në projekt (rrugët relative nuk mbështeten),
- rruga deri në skedarin .xml me konfigurimet e inspektimeve (zakonisht ndodhet brenda projektit në .idea/inspectionProfiles/Project_Default.xml),
- rruga e plotë deri në dosjen ku do të ruhet skedarët .xml me raportet e rezultateve të analizës.
Për më tepër, pritet që
- në IDE të jetë e konfiguruar rruga për Java SDK, ndryshe analiza nuk do të funksionojë. Këto konfigurime ndodhen në skedarin konfiguruese
jdk.table.xmlnë dosjen e konfigurimit global të IDEA. Konfigurimi global i IDEA, me default, ndodhet në direktorinë e shtëpisë së përdoruesit, por ky vendndodhje në skedarinidea.properties. - projekti që po analizohet duhet të jetë një projekt valid IDEA, për këtë, në kontrollin e versioneve do të jetë e nevojshme të komitohen disa skedarë që zakonisht injorohen, përkatësisht:
.idea/inspectionProfiles/Project_Default.xmlâ cilĂ«simet e analizuesit, ato do tĂ« pĂ«rdoren qartĂ« gjatĂ« ekzekutimit tĂ« inspektimeve nĂ« kontejner,.idea/modules.xmlâ pĂ«rndryshe do tĂ« marrim gabimin âKy projekt nuk pĂ«rmban moduletâ,.idea/misc.xmlâ pĂ«rndryshe do tĂ« marrim gabimin âJDK nuk Ă«shtĂ« konfiguruar siç duhet pĂ«r kĂ«tĂ« projektâ,*.iml-fajllatâ pĂ«rndryshe do tĂ« marrim gabimin pĂ«r JDK tĂ« pafunksionueshĂ«m nĂ« modulin.
MegjithatĂ«, zakonisht kĂ«to skedarĂ« pĂ«rfshihen nĂ« .gitignore, ato nuk pĂ«rmbajnĂ« ndonjĂ« informacion specifik pĂ«r ambientin e zhvilluesit konkret â nĂ« dallim nga, pĂ«r shembull, skedari workspace.xml, ku njĂ« informacion i tillĂ«, pĂ«rkatĂ«sisht, pĂ«rmban, dhe pĂ«r kĂ«tĂ« arsye, nuk duhet komituar.
Natyrshëm sugjerohet zgjidhja për të paketuar JDK së bashku me IDEA Community Edition në një kontejner në formën e gatshme për 'dërgim' në projektet që po analizohen. Do të zgjidhim një kontejner bazik të përshtatshëm, dhe ja se çfarë do të rezultojë konfigurimi i Docker-it:
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 -v2Duke me opsionin idea.config.path ne kemi bërë që IDEA të kërkojë konfigurimin e saj global në dosjen /etc/idea, sepse dosja personale e përdoruesit në kushte pune në CI është një gjë e paqartë dhe shpeshherë nuk ekziston fare.
Këtu është dokumenti i kopjuar në kontejner jdk.table.xml, në të cilin janë përcaktuar rrugët për OpenJDK, të instaluar brenda kontejnerit (mund të merret si bazë një dokument i ngjashëm nga direktoria juaj personale me konfigurimet e IDEA):
jdk.table.xml
Imazhi i gatshëm .
Para se të vazhdojmë, le të verifikojmë ekzekutimin e analizatorit IDEA në konteiner:
docker run --rm -v :/var/project inponomarev/intellij-idea-analyzerAnaliza duhet të ekzekutohet me sukses, dhe në nënfolderin target/idea_inspections duhet të shfaqen shumë skedarë .xml me raportet e analizatorit.
Tani nuk ka më dyshime që analizatori IDEA mund të ekzekutohet në mënyrë autonome në çdo mjedis CI, dhe ne kalojmë në hapin e dytë.
Hapi 2. Shfaqim dhe analizojmë raportin
Të marrësh raportin në formë skedarësh .xml është gjysmë pune, tani duhet ta bëjmë atë të lexueshëm për njerëzit. Gjithashtu, rezultatet e tij duhet të përdoren në quality gates - logjikën për të përcaktuar nëse ndryshimi i pranuar kalon ose jo kriteret e cilësisë.
Në këtë na ndihmon , i cili u publikua në janar 2019. Me shfaqjen e tij, shumë plugin të veçantë për të punuar me rezultatet e analizës statike në Jenkins (CheckStyle, FindBugs, PMD etj.) tani janë shënuar si të vjetra (obsolete).
Plugin-i përbëhet nga dy pjesë:
- mbledhësit e shumtë të mesazheve të analizatorëve ( përmban të gjithë analizatorët e njohur nga AcuCobol deri te ZPT Lint),
- një shikues të vetëm për të gjithë ata.
Në listën e gjithçkaje që mund të analizojë Warnings NG, janë përfshirë paralajmërimet e kompajlerit Java dhe paralajmërimet nga log-et e ekzekutimit Maven: megjithëse ato janë gjithmonë nën vëzhgim, rrallë analizohen në mënyrë të drejtpërdrejtë. Raportet e IntelliJ IDEA gjithashtu përfshihen në listën e formateve të njohura.
Duke qenë se plugini është i ri, ai fillimisht interakton mirë me Jenkins Pipeline. Hapi i ndërtimit me pjesëmarrjen e tij do të duket si më poshtë (ne thjesht i themi plugin-it se cilin format raporti njohim dhe cilat skedarë duhet të skanohen):
stage ('Analiza statike'){
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')]
)
}ndërfaqja e raportit duket kështu:

ĂshtĂ« e kĂ«ndshme qĂ« ky ndĂ«rfaqe Ă«shtĂ« universale pĂ«r tĂ« gjitha analizat e njohura. Ai pĂ«rmban njĂ« diagram interaktiv tĂ« shpĂ«rndarjes sĂ« gjetjeve sipas kategorive dhe njĂ« grafik tĂ« dinamikĂ«s sĂ« ndryshimeve tĂ« numrit tĂ« gjetjeve. NĂ« gridin nĂ« fund tĂ« faqes, mund tĂ« bĂ«ni njĂ« kĂ«rkim tĂ« shpejtĂ«. E vetmja gjĂ« qĂ« nuk funksionoi siç duhet pĂ«r inspektimet IDEA Ă«shtĂ« mundĂ«sia pĂ«r tĂ« shfletuar kodin direkt nĂ« Jenkins (ndonĂ«se pĂ«r raporte tĂ« tjera, si Checkstyle, ky plugin e bĂ«n kĂ«tĂ« bukur). Duket se Ă«shtĂ« njĂ« defekt i parserit tĂ« raporteve IDEA qĂ« duhet tĂ« rregullohet.
Mes mundĂ«sive tĂ« Warnings NG Ă«shtĂ« mundĂ«sia pĂ«r tĂ« agreguar nĂ« njĂ« raport gjetjet nga burime tĂ« ndryshme dhe pĂ«r tĂ« programuar Quality Gates, pĂ«rfshirĂ« â «xhiruesin» mbi ndĂ«rtimin referues. Disa dokumentacion nĂ« lidhje me programimin e Quality Gates Ă«shtĂ« i disponueshĂ«m â megjithatĂ«, ai nuk Ă«shtĂ« i plotĂ«, dhe duhet tĂ« shikoni nĂ« burimet e kodit. Nga ana tjetĂ«r, pĂ«r kontroll tĂ« plotĂ« mbi atĂ« qĂ« ndodh, «xhiruesin» mund ta realizoni edhe vetĂ« (shihni postin nĂ« kĂ«tĂ« temĂ«).
Përfundimi
Para se të filloja të përgatisja këtë material, vendosa të kërkoja: a ka shkruar ndokush tashmë për këtë temë në Habr? Gjeta vetëm me , ku ai thotë:
Sipas njohurive tĂ« mia, nuk ka integrime me Jenkins ose maven-plugin [âŠ] NĂ« parim, çdo entuziast mund tĂ« lidhte IDEA Community Edition dhe Jenkins, shumĂ« do tĂ« pĂ«rfitonin nga kjo.
ĂfarĂ« do tĂ« themi: pas dy vjetĂ«sh, kemi Warnings NG Plugin, dhe pĂ«rfundimisht kjo miqĂ«si u realizua!
Burimi: habr.com
