IntelliJ IDEA har idag den mest avancerade statiska kodanalysatorn för Java, med fÀrdigheter som övertrÀffar sÄdana "veteraner" som och . Dess mÄnga "inspektioner" kontrollerar koden ur olika aspekter, frÄn kodningsstil till vanliga buggar.
Men tills resultaten av analysen visas endast i IDE:ns lokala grÀnssnitt, Àr de av liten nytta för utvecklingsprocessen. Statisk analys som det första steget i byggkedjan, dess resultat ska definiera quality gates, och bygget ska misslyckas om quality gates inte godkÀnns. Det Àr kÀnt att TeamCity CI Àr integrerat med IDEA. Men Àven om du inte anvÀnder TeamCity, kan du enkelt köra inspektioner frÄn IDEA pÄ vilken annan CI-server som helst. Jag föreslÄr att vi tittar pÄ hur detta kan göras med hjÀlp av IDEA Community Edition, Jenkins och Warnings NG-plugin.
Steg 1. Kör analysen i containern och fÄ en rapport
Till en början kan tanken pÄ att köra IDE (ett desktopprogram!) inom en CI-system utan grafiskt grÀnssnitt verka tveksam och mycket besvÀrlig. Lyckligtvis har utvecklarna av IDEA tillhandahÄllit möjligheten att köra och frÄn kommandoraden. För att köra IDEA i detta lÀge krÀvs ingen grafisk underhÄllning, och dessa uppgifter kan utföras pÄ servrar med textgrÀnssnitt.
Inspektionerna körs med skriptet bin/inspect.sh frÄn installationskatalogen för IDEA. Som parametrar krÀvs:
- den fullstÀndiga sökvÀgen till projektet (relativa stigar stöds inte),
- sökvÀgen till .xml-filen med inspektionsinstÀllningar (finns vanligtvis inuti projektet pÄ .idea/inspectionProfiles/Project_Default.xml),
- den fullstÀndiga sökvÀgen till mappen dÀr .xml-filer med analysresultat kommer att sparas.
Dessutom förvÀntas det att
- i IDE Àr sökvÀgen till Java SDK instÀlld, annars kommer analysen inte att fungera. Dessa instÀllningar Äterfinns i konfigurationsfilen
jdk.table.xmli IDEA:s globala konfigurationsmapp. SjÀlva den globala konfigurationen av IDEA ligger som standard i anvÀndarens hemmakatalog, men denna plats i filenidea.properties. - det analyserade projektet mÄste vara ett giltigt IDEA-projekt, vilket krÀver att vissa filer som vanligtvis ignoreras mÄste committas i versionskontrollen, nÀmligen:
.idea/inspectionProfiles/Project_Default.xmlâ instĂ€llningar för analysatorn, som uppenbarligen kommer att anvĂ€ndas vid körning av inspektioner i containern,.idea/modules.xmlâ annars fĂ„r vi felmeddelandet âDetta projekt innehĂ„ller inga modulerâ,.idea/misc.xmlâ annars fĂ„r vi felmeddelandet âJDK: n Ă€r inte korrekt konfigurerad för detta projektâ,*.iml-filerâ annars fĂ„r vi ett felmeddelande om en oconfigurerad JDK i modulen.
Ăven om dessa filer vanligtvis inkluderar .gitignore, innehĂ„ller de ingen information som Ă€r specifik för den enskilde utvecklaren â till skillnad frĂ„n, till exempel, filen workspace.xml, dĂ€r sĂ„dan information finns, och dĂ€rför ska vi inte checka in den.
Det föreslÄr sig nÀstan att packa in JDK tillsammans med IDEA Community Edition i containern i en form redo för att "utvecklas" pÄ analyserade projekt. LÄt oss vÀlja en lÀmplig bascontainer och hÀr Àr vÄrt resultat 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 -v2Med hjÀlp av alternativet idea.config.path har vi tvingat IDEA att söka sin globala konfiguration i mappen /etc/idea, eftersom anvÀndarens hemmamapp i CI-miljöer Àr en osÀker sak och ofta helt saknas.
SÄ hÀr ser filen ut som kopieras till containern jdk.table.xml, dÀr sökvÀgarna till OpenJDK, som Àr installerad inuti containern, Àr angivna (en liknande fil frÄn din egen IDEA-konfigurationsmapp kan anvÀndas som grund):
jdk.table.xml
Bild i fÀrdig form .
Innan vi gÄr vidare, lÄt oss kontrollera att IDEA-analysatorn körs i containern:
docker run --rm -v :/var/project inponomarev/intellij-idea-analyzerAnalysen ska genomföras framgÄngsrikt, och i undermappen target/idea_inspections kommer mÄnga .xml-filer med analyserapporter att dyka upp.
Nu finns det inga tvivel om att IDEA-analysatorn kan köras i fristÄende lÀge i vilken CI-miljö som helst, och vi gÄr vidare till steg tvÄ.
Steg 2. Visa och analysera rapporten
Att fĂ„ en rapport i form av .xml-filer Ă€r halva jobbet, nu mĂ„ste den göras lĂ€sbar för mĂ€nniskor. Dessutom ska resultaten anvĂ€ndas i quality gates â logiken för att avgöra om den accepterade Ă€ndringen uppfyller kvalitetskriterier.
Det hÀr hjÀlper oss med , vars release gjordes i januari 2019. Med dess ankomst Àr mÄnga enskilda plugins för att arbeta med resultaten frÄn statisk analys i Jenkins (CheckStyle, FindBugs, PMD osv.) nu mÀrkta som förÄldrade (obsolete).
Pluginet bestÄr av tvÄ delar:
- ett stort antal analysators meddelandesamlare ( som inkluderar alla kÀnda analysatorer frÄn AcuCobol till ZPT Lint),
- en gemensam rapportvisare för dem alla.
Bland de saker som Warnings NG kan analysera finns ocksÄ Java-kompilatorns varningar och varningar frÄn Maven-körloggar: Àven om de alltid Àr synliga, analyseras de sÀllan direkt. Rapporter frÄn IntelliJ IDEA ingÄr ocksÄ i listan över erkÀnda format.
Eftersom pluginet Àr nytt interagerar det frÄn början vÀl med Jenkins Pipeline. Byggsteget med dess deltagande kommer att se ut som följer (vi sÀger helt enkelt till pluginet vilket rapportformat vi kÀnner igen och vilka filer som ska skannas):
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')]
)
}RapportgrÀnssnittet 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 per kategori och en graf över förÀndringar i antalet fynd. I gridden lÀngst ner pÄ sidan kan man utföra snabb sökning. Det enda som inte riktigt fungerade för inspektionerna i IDEA var möjligheten att blÀddra i koden direkt i Jenkins (Àven om detta plugin kan göra det fint för andra rapporter, som Checkstyle). Det verkar vara en bugg i parsern för IDEA-rapporter som mÄste ÄtgÀrdas.
Bland funktionerna i Warnings NG finns möjligheten att aggregera fynd frĂ„n olika kĂ€llor i en rapport och programmera Quality Gates, inklusive en "ratchet" baserat pĂ„ referensbygget. Viss dokumentation om programmering av Quality Gates finns tillgĂ€nglig. â förresten, den Ă€r inte komplett, och man mĂ„ste titta i kĂ€llorna. Ă andra sidan, för att fĂ„ full kontroll över vad som hĂ€nder kan man ocksĂ„ implementera en "backande" sjĂ€lv (se min i det hĂ€r Ă€mnet).
Slutsats
Innan jag började förbereda detta material beslutade jag mig för att kolla: har nÄgon redan skrivit om detta Àmne 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 skulle vilken entusiast som helst kunna koppla ihop IDEA Community Edition och Jenkins, vilket mĂ„nga skulle dra nytta av.
SÄ vad hÀnder: efter tvÄ Är har vi Warnings NG Plugin, och Àntligen har denna vÀnskap blivit verklighet!
KĂ€lla: habr.com
