IntelliJ IDEA har idag den mest avancerade statiska kodanalysatorn för Java, vilket lÀmnar lÄngt bakom sig sÄdana "veteraner" som och . Dess mÄnga "inspektioner" kontrollerar koden ur olika aspekter, frÄn kodstil till typiska buggar.
Men hittills visas analysresultaten bara i utvecklarens lokala IDE-grÀnssnitt, vilket gör dem ganska ineffektiva för utvecklingsprocessen. Statisk analys som det första steget i byggprocessen; dess resultat bör definiera quality gates, och bygget bör misslyckas om quality gates inte uppfylls. Det Àr kÀnt att TeamCity CI Àr integrerat med IDEA. Men Àven om du inte anvÀnder TeamCity kan du helt enkelt försöka köra inspektioner i IDEA pÄ vilken annan CI-server som helst. LÄt oss titta pÄ hur detta kan göras med hjÀlp av IDEA Community Edition, Jenkins och Warnings NG-plugin.
Steg 1. Starta analysen i containern och fÄ en rapport
Till en början kan det verka tveksamt och mycket besvÀrligt att starta IDE (ett skrivbordsprogram!) inuti en CI-system utan grafiskt grÀnssnitt. Lyckligtvis har utvecklarna av IDEA gett möjlighet att köra och frÄn kommandoraden. För att starta IDEA i detta lÀge krÀvs ingen grafisk subsystem, och dessa uppgifter kan utföras pÄ servrar med textgrÀnssnitt.
Inspektionerna startas med hjÀlp av skriptet bin/inspect.sh frÄn installationsmappen för IDEA. Som parametrar behövs:
- fullstÀndig sökvÀg till projektet (relativa sökvÀgar stöds inte),
- sökvÀg till .xml-filen med inspektionsinstÀllningarna (som vanligtvis finns i projektmappen i .idea/inspectionProfiles/Project_Default.xml),
- fullstÀndig sökvÀg till mappen dÀr .xml-filer med analysresultatens rapporter ska lagras.
Dessutom förvÀntas
- i IDE:s instÀllningar finnas en referens till Java SDK, annars kommer analysen inte att fungera. Dessa instÀllningar finns i konfigurationsfilen
jdk.table.xmli IDEA:s globala konfigurationsmapp. SjÀlva den globala konfigurationen för IDEA ligger som standard i anvÀndarens hemkatalog, men denna plats i filenidea.properties. - det analyserade projektet mÄste vara ett giltigt IDEA-projekt, vilket innebÀr att vissa filer som normalt ignoreras mÄste kommittas till kontrollsystemet, nÀmligen:
.idea/inspectionProfiles/Project_Default.xmlâ konfiguration av analysatorn, de kommer uppenbarligen att anvĂ€ndas nĂ€r inspektioner körs i containern,.idea/modules.xmlâ annars fĂ„r vi felet 'Detta projekt innehĂ„ller inga moduler',.idea/misc.xmlâ annars fĂ„r vi felet 'JDK:n Ă€r inte korrekt konfigurerad för detta projekt',*.iml-filerâ annars fĂ„r vi ett fel om att JDK inte Ă€r instĂ€llt i modulen.
Ăven om dessa filer vanligtvis inkluderar .gitignore, innehĂ„ller de ingen information som Ă€r specifik för den enskilde utvecklarens miljö â till skillnad frĂ„n, till exempel, filen workspace.xml, dĂ€r sĂ„dan information faktiskt finns, och dĂ€rför bör vi inte commita den.
Det föreslÄr sig sjÀlvt att packa JDK tillsammans med IDEA Community Edition i en container i en form som Àr redo för att anvÀnds pÄ analyserade projekt. Vi vÀljer en lÀmplig grundcontainer, och hÀr Àr vad vi fÄr i 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 -v2Genom att anvÀnda alternativet idea.config.path tvingade vi IDEA att söka efter sin globala konfiguration i mappen /etc/idea, eftersom anvÀndarens hemkatalog i CI-arbetsmiljöer Àr osÀker och ofta helt saknas.
SÄ hÀr ser filen ut som kopieras till containern, jdk.table.xml, dÀr sökvÀgarna till OpenJDK, installerad inuti containern, Àr angivna (en liknande fil kan tas som utgÄngspunkt frÄn din egen konfigurationskatalog för IDEA):
jdk.table.xml
Bild i fÀrdig form .
Innan vi gÄr vidare, lÄt oss kontrollera att IDE-analyzern körs i containern:
docker run --rm -v :/var/project inponomarev/intellij-idea-analyzerAnalysen ska köras utan problem och i undermappen target/idea_inspections ska det finnas mÄnga .xml-filer med analysrapporter.
Nu finns det inga tvivel om att IDE-analyzern kan köras offline i vilket CI-miljö som helst, och vi gÄr vidare till steg tvÄ.
Steg 2. Visar och analyserar rapporten
Att fĂ„ rapporten i form av .xml-filer Ă€r en del av arbetet, nu mĂ„ste den göras lĂ€sbar för mĂ€nniskor. Dessutom mĂ„ste resultaten anvĂ€ndas i quality gates â logiken för att avgöra om den accepterade Ă€ndringen uppfyller kvalitetskriterierna.
Det hÀr hjÀlper oss med , vars release skedde i januari 2019. Med dess ankomst har mÄnga enskilda plugins för att arbeta med resultat frÄn statisk analys i Jenkins (CheckStyle, FindBugs, PMD, etc.) nu markerats som förÄldrade.
Pluginet bestÄr av tvÄ delar:
- ett stort antal meddelandeaggregatorer frÄn analysatorer ( inklusive alla kÀnda analysatorer frÄn AcuCobol till ZPT Lint),
- en gemensam rapportvisare för alla dessa.
Bland det som Warnings NG kan analysera finns Àven Java-kompilatorns varningar och varningar frÄn Maven-körloggar: Àven om de stÀndigt Àr synliga, analyseras de sÀllan med avsikt. Rapporter frÄn IntelliJ IDEA ingÄr ocksÄ i listan över erkÀnda format.
Eftersom pluginet Àr nytt fungerar det frÄn början bra med Jenkins Pipeline. Steget för byggprocessen ser ut som följande (vi berÀttar bara för pluginet vilket rapportformat vi kÀnner igen och vilka filer som ska skannas):
stage ('Statisk analys'){
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')]
)
}Rapportens grÀnssnitt ser ut sÄ hÀr:

Det Àr praktiskt att detta grÀnssnitt Àr universellt för alla erkÀnda analysatorer. Det innehÄller ett interaktivt diagram som visar fördelningen av fynd efter kategorier och en graf som visar hur antalet fynd förÀndras över tid. I rutan lÀngst ner pÄ sidan kan snabb sökning utföras. Det enda som inte fungerade korrekt för IDEA-inspektionerna var möjligheten att blÀddra i koden direkt i Jenkins (Àven om denna plugin kan göra det snyggt för andra rapporter, till exempel Checkstyle). Det verkar vara en bugg i parsern för IDEA-rapporter som behöver fixas.
Bland möjligheterna i Warnings NG finns möjlighet att aggregatera fynd frĂ„n olika kĂ€llor i en rapport och att programmera Quality Gates, inklusive â en "ratchet" baserad pĂ„ referensbyggnaden. Viss dokumentation om programmering av Quality Gates finns tillgĂ€nglig. â men den Ă€r inte fullstĂ€ndig, och man fĂ„r titta i kĂ€llorna. Ă andra sidan, för full kontroll över vad som hĂ€nder kan "vĂ€xeln" ocksĂ„ implementeras sjĂ€lv (se min i detta Ă€mne).
Slutsats
Innan jag började förbereda detta material, bestÀmde jag mig för att se om nÄgon redan skrivit om detta pÄ Habré. Jag hittade endast med , dÀr han sÀger:
SĂ„vitt jag vet finns det ingen integration med Jenkins eller maven-plugin [âŠ] I princip kunde vilken entusiast som helst koppla ihop IDEA Community Edition och Jenkins, mĂ„nga skulle bara vinna pĂ„ det.
SÄ vad hÀnder: efter tvÄ Är har vi Warnings NG Plugin, och Àntligen har denna vÀnskap blivit verklighet!
KĂ€lla: habr.com
