IntelliJ IDEA har för nÀrvarande den mest avancerade statiska Java-kodanalysatorn, som i sin kapacitet har lÀmnat sÄdana "veteraner" som О . Dess mÄnga "inspektioner" kontrollerar koden för olika aspekter, frÄn kodningsstil till vanliga buggar.
Men sÄ lÀnge som analysresultaten endast visas i det lokala grÀnssnittet för utvecklarens IDE, Àr de till liten nytta för utvecklingsprocessen. Statisk analys Som det första steget i byggpipelinen bör dess resultat avgöra kvalitetsgrindar, och bygget bör misslyckas om kvalitetsgrindarna inte passeras. Det Àr kÀnt att TeamCity CI Àr integrerat med IDEA. Men Àven om du inte anvÀnder TeamCity kan du fortfarande prova att köra IDEA-inspektioner pÄ vilken annan CI-server som helst. Jag föreslÄr att du tittar pÄ hur detta kan göras med IDEA Community Edition, Jenkins och Warnings NG plugin.
Steg 1. Kör analysen i behÄllaren och hÀmta rapporten
Till en början kan idén att köra en IDE (en skrivbordsapplikation!) inuti ett CI-system som inte har ett grafiskt grÀnssnitt verka tvivelaktig och mycket besvÀrlig. Lyckligtvis har IDEA-utvecklarna gett möjligheten att köra О frÄn kommandoraden. För att köra IDEA i detta lÀge krÀvs dessutom inget grafiskt delsystem och dessa uppgifter kan utföras pÄ servrar med ett textskal.
Inspektioner startas med hjÀlp av ett skript bin/inspect.sh frÄn IDEA-installationskatalogen. Följande parametrar krÀvs:
- fullstÀndig sökvÀg till projektet (relativa sökvÀgar stöds inte),
- sökvÀg till .xml-filen med inspektionsinstÀllningar (vanligtvis placerad i projektet i .idea/inspectionProfiles/Project_Default.xml),
- den fullstÀndiga sökvÀgen till mappen dÀr .xml-filerna med analysresultatrapporterna kommer att lagras.
Dessutom förvÀntas det
- SökvÀgen till Java SDK kommer att konfigureras i IDE, annars fungerar inte analysen. Dessa instÀllningar finns i konfigurationsfilen.
jdk.table.xmli IDEA globala konfigurationsmappen. SjÀlva den globala IDEA-konfigurationen finns som standard i anvÀndarens hemkatalog, men den hÀr platsen i filidea.properties. - det analyserade projektet mÄste vara ett giltigt IDEA-projekt, för vilket du mÄste överlÄta vissa filer till versionskontroll som vanligtvis ignoreras, nÀmligen:
.idea/inspectionProfiles/Project_Default.xmlâ analysatorinstĂ€llningar, de kommer uppenbarligen att anvĂ€ndas vid inspektioner i behĂ„llaren,.idea/modules.xml- annars fĂ„r vi felet 'Detta projekt innehĂ„ller inga moduler',.idea/misc.xml- annars fĂ„r vi felet "JDK Ă€r inte korrekt konfigurerad för detta projekt",*.iml-ŃаĐčĐ»Ńâ annars fĂ„r vi ett felmeddelande om att JDK inte Ă€r konfigurerad i modulen.
Ăven om dessa filer vanligtvis ingĂ„r i .gitignore, innehĂ„ller de ingen information som Ă€r specifik för miljön för en viss utvecklare - till skillnad frĂ„n till exempel en fil workspace.xml, dĂ€r sĂ„dan information finns och det dĂ€rför inte finns nĂ„got behov av att begĂ„ den.
Den uppenbara lösningen Àr att packa JDK tillsammans med IDEA Community Edition i en container i en form redo att "stÀllas in pÄ" de projekt som analyseras. LÄt oss vÀlja en lÀmplig basbehÄllare, och sÄ hÀr kommer vÄr Dockerfile att se ut:
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 -v2AnvÀnder alternativet idea.config.path vi fick IDEA att leta efter dess globala konfiguration i mappen /etc/idea, eftersom anvÀndarens hemmapp i CI-förhÄllanden Àr en odefinierad sak och ofta helt frÄnvarande.
SÄ hÀr ser en fil som kopierats till en behÄllare ut jdk.table.xml, som anger sökvÀgarna till OpenJDK installerat i behÄllaren (en liknande fil frÄn din egen katalog med IDEA-instÀllningar kan anvÀndas som bas):
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>Den fÀrdiga bilden .
Innan vi gÄr vidare, lÄt oss kontrollera lanseringen av IDEA-analysatorn i behÄllaren:
docker run --rm -v <ĐżŃŃŃ/Đș/ĐČаŃĐ”ĐŒŃ/ĐżŃĐŸĐ”ĐșŃŃ>:/var/project inponomarev/intellij-idea-analyzerAnalysen ska slutföras framgĂ„ngsrikt, och mĂ„nga .xml-filer med analysrapporter bör visas i undermappen target/idea_inspections.
Nu rÄder det ingen tvekan om att IDEA-analysatorn kan köras i fristÄende lÀge i vilken CI-miljö som helst, och vi gÄr vidare till det andra steget.
Steg 2. Visa och analysera rapporten
Att fÄ en rapport i form av .xml-filer Àr halva striden, nu mÄste den göras lÀsbar för mÀnniskor. Och dess resultat bör ocksÄ anvÀndas i kvalitetsgrindar - logiken för att avgöra om en accepterad förÀndring godkÀnns eller misslyckas enligt kvalitetskriterier.
Detta kommer att hjÀlpa oss , som slÀpptes i januari 2019. Med sin introduktion Àr mÄnga individuella plugins för att arbeta med statiska analysresultat i Jenkins (CheckStyle, FindBugs, PMD, etc.) nu markerade som förÄldrade.
Insticksprogrammet bestÄr av tvÄ delar:
- mÄnga meddelandeinsamlare analysatorer ( inkluderar alla kÀnda vetenskapliga analysatorer frÄn AcuCobol till ZPT Lint),
- en enda rapportvisare för dem alla.
Listan över saker som Warnings NG kan analysera inkluderar Java-kompilatorvarningar och varningar frÄn Mavens exekveringsloggar: Àven om de Àr stÀndigt synliga, analyseras de sÀllan med avsikt. IntelliJ IDEA-rapporter ingÄr ocksÄ i listan över erkÀnda format.
Eftersom plugin-programmet Àr nytt interagerar det initialt bra med Jenkins Pipeline. Byggsteget som involverar det kommer att se ut sÄ hÀr (vi berÀttar bara för plugin 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 bekvÀmt att detta grÀnssnitt Àr universellt för alla erkÀnda analysatorer. Den innehÄller ett interaktivt diagram över fyndfördelningen per kategori och en graf över dynamiken i förÀndringar i antalet fynd. Du kan göra en snabb sökning i rutnÀtet lÀngst ner pÄ sidan. Det enda som inte fungerade korrekt för IDEA-inspektioner var möjligheten att blÀddra i kod direkt i Jenkins (Àven om för andra rapporter, som Checkstyle, kan detta plugin göra det bra). Det ser ut som att detta Àr en bugg i IDEA:s rapportparser som mÄste fixas.
Varningar NG-funktioner inkluderar möjligheten att samla resultat frÄn olika kÀllor i en rapport och programmera Quality Gates, inklusive en "spÀrr" för referensenheten. Viss dokumentation om programmering av Quality Gates finns tillgÀnglig - den Àr dock inte komplett, och du mÄste titta pÄ kÀllkoden. à andra sidan, för fullstÀndig kontroll över vad som hÀnder, kan "spÀrren" implementeras oberoende (se min om detta Àmne).
Slutsats
Innan jag började förbereda det hĂ€r materialet bestĂ€mde jag mig för att söka: har nĂ„gon redan skrivit om detta Ă€mne pĂ„ Habr? Jag hittade bara Ń , dĂ€r han sĂ€ger:
SĂ„ vitt jag vet finns det ingen integration med Jenkins eller maven plugin [âŠ] I princip kan vilken entusiast som helst fĂ„ vĂ€nner mellan IDEA Community Edition och Jenkins, mĂ„nga skulle bara dra nytta av detta.
Tja, tvÄ Är senare har vi Warnings NG Plugin, och Àntligen har denna vÀnskap blivit sann!
KĂ€lla: will.com
