IntelliJ IDEA నేడు అత్యంత అధునాతన స్టాటిక్ జావా కోడ్ ఎనలైజర్ను కలిగి ఉంది, ఇది దాని సామర్థ్యాలలో "అనుభవజ్ఞుల" కంటే చాలా వెనుకబడి ఉంది и . దీని అనేక "తనిఖీలు" కోడింగ్ శైలి నుండి సాధారణ బగ్ల వరకు వివిధ అంశాలలో కోడ్ని తనిఖీ చేస్తాయి.
అయినప్పటికీ, విశ్లేషణ ఫలితాలు డెవలపర్ IDE యొక్క స్థానిక ఇంటర్ఫేస్లో మాత్రమే ప్రదర్శించబడేంత వరకు, అవి అభివృద్ధి ప్రక్రియకు పెద్దగా ఉపయోగపడవు. స్టాటిక్ విశ్లేషణ బిల్డ్ పైప్లైన్ యొక్క మొదటి దశగా, దాని ఫలితాలు నాణ్యమైన గేట్లను నిర్వచించాలి మరియు నాణ్యమైన గేట్లు పాస్ చేయకపోతే బిల్డ్ విఫలమవుతుంది. టీమ్సిటీ సీఐ ఐడియాతో అనుసంధానం అయిన సంగతి తెలిసిందే. మీరు TeamCityని ఉపయోగించకపోయినా, మీరు ఏదైనా ఇతర CI సర్వర్లో IDEA తనిఖీలను సులభంగా అమలు చేయడానికి ప్రయత్నించవచ్చు. IDEA కమ్యూనిటీ ఎడిషన్, జెంకిన్స్ మరియు వార్నింగ్స్ NG ప్లగిన్ని ఉపయోగించి దీన్ని ఎలా చేయవచ్చో చూడాలని నేను మీకు సూచిస్తున్నాను.
దశ 1. కంటైనర్లో విశ్లేషణను అమలు చేయండి మరియు నివేదికను పొందండి
మొదట, గ్రాఫికల్ ఇంటర్ఫేస్ లేని CI సిస్టమ్లో IDE (డెస్క్టాప్ అప్లికేషన్!)ని అమలు చేయాలనే ఆలోచన సందేహాస్పదంగా మరియు చాలా సమస్యాత్మకంగా అనిపించవచ్చు. అదృష్టవశాత్తూ, IDEA డెవలపర్లు అమలు చేయగల సామర్థ్యాన్ని అందించారు и కమాండ్ లైన్ నుండి. అంతేకాకుండా, ఈ మోడ్లో IDEAని అమలు చేయడానికి, గ్రాఫిక్స్ సబ్సిస్టమ్ అవసరం లేదు మరియు ఈ పనులు టెక్స్ట్ షెల్తో సర్వర్లలో నిర్వహించబడతాయి.
స్క్రిప్ట్ ఉపయోగించి తనిఖీలు ప్రారంభించబడతాయి bin/inspect.sh IDEA ఇన్స్టాలేషన్ డైరెక్టరీ నుండి. అవసరమైన పారామితులు:
- ప్రాజెక్ట్కి పూర్తి మార్గం (సంబంధిత వాటికి మద్దతు లేదు),
- తనిఖీ సెట్టింగ్లతో .xml ఫైల్కి మార్గం (సాధారణంగా ప్రాజెక్ట్ లోపల .idea/inspectionProfiles/Project_Default.xmlలో ఉంటుంది),
- విశ్లేషణ ఫలితాలపై నివేదికలతో .xml ఫైల్లు నిల్వ చేయబడే ఫోల్డర్కు పూర్తి మార్గం.
అదనంగా, ఇది అంచనా వేయబడింది
- జావా SDKకి మార్గం IDEలో కాన్ఫిగర్ చేయబడుతుంది, లేకుంటే విశ్లేషణ పనిచేయదు. ఈ సెట్టింగ్లు కాన్ఫిగరేషన్ ఫైల్లో ఉన్నాయి
jdk.table.xmlIDEA గ్లోబల్ కాన్ఫిగరేషన్ ఫోల్డర్లో. IDEA గ్లోబల్ కాన్ఫిగరేషన్ డిఫాల్ట్గా వినియోగదారు హోమ్ డైరెక్టరీలో ఉంది, కానీ ఈ స్థానం ఫైల్లోidea.properties. - విశ్లేషించబడిన ప్రాజెక్ట్ తప్పనిసరిగా చెల్లుబాటు అయ్యే IDEA ప్రాజెక్ట్ అయి ఉండాలి, దీని కోసం మీరు సాధారణంగా సంస్కరణ నియంత్రణకు విస్మరించబడే కొన్ని ఫైల్లను కట్టుబడి ఉండాలి, అవి:
.idea/inspectionProfiles/Project_Default.xml- ఎనలైజర్ సెట్టింగ్లు, కంటైనర్లో తనిఖీలను అమలు చేస్తున్నప్పుడు అవి స్పష్టంగా ఉపయోగించబడతాయి,.idea/modules.xml- లేకపోతే 'ఈ ప్రాజెక్ట్లో మాడ్యూల్స్ లేవు' అనే ఎర్రర్ వస్తుంది,.idea/misc.xml- లేకపోతే 'ఈ ప్రాజెక్ట్ కోసం JDK సరిగ్గా కాన్ఫిగర్ చేయబడలేదు' అనే ఎర్రర్ వస్తుంది,*.iml-файлы— లేకుంటే మాడ్యూల్లో కాన్ఫిగర్ చేయని JDK గురించి మనకు ఎర్రర్ వస్తుంది.
ఈ ఫైల్లు సాధారణంగా చేర్చబడినప్పటికీ .gitignore, అవి నిర్దిష్ట డెవలపర్ యొక్క పర్యావరణానికి సంబంధించిన నిర్దిష్ట సమాచారాన్ని కలిగి ఉండవు - ఉదాహరణకు, ఫైల్ వలె కాకుండా workspace.xml, అటువంటి సమాచారం ఉన్న చోట, కాబట్టి దానికి కట్టుబడి ఉండవలసిన అవసరం లేదు.
IDEA కమ్యూనిటీ ఎడిషన్తో పాటు JDKని విశ్లేషించబడిన ప్రాజెక్ట్లలో "పిట్" చేయడానికి సిద్ధంగా ఉన్న రూపంలో కంటైనర్లో ప్యాక్ చేయడం స్పష్టమైన పరిష్కారం. సరిఅయిన బేస్ కంటైనర్ని ఎంచుకుందాం మరియు మా డాకర్ఫైల్ ఇలా ఉంటుంది:
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 సెట్టింగ్లతో మీ స్వంత డైరెక్టరీ నుండి సారూప్య ఫైల్ను ప్రాతిపదికగా తీసుకోవచ్చు):
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>పూర్తయిన చిత్రం .
కొనసాగడానికి ముందు, కంటైనర్లో IDEA ఎనలైజర్ రన్ అవుతుందో లేదో తనిఖీ చేద్దాం:
docker run --rm -v <путь/к/вашему/проекту>:/var/project inponomarev/intellij-idea-analyzerవిశ్లేషణ విజయవంతంగా అమలు చేయాలి మరియు ఎనలైజర్ నివేదికలతో కూడిన అనేక .xml ఫైల్లు టార్గెట్/ఐడియా_ఇన్స్పెక్షన్స్ సబ్ఫోల్డర్లో కనిపిస్తాయి.
ఇప్పుడు ఏ CI వాతావరణంలోనైనా IDEA ఎనలైజర్ స్వతంత్రంగా అమలు చేయబడుతుందనడంలో సందేహం లేదు మరియు మేము రెండవ దశకు వెళ్తాము.
దశ 2. నివేదికను ప్రదర్శించండి మరియు విశ్లేషించండి
.xml ఫైల్ల రూపంలో నివేదికను పొందడం సగం యుద్ధం; ఇప్పుడు మీరు దీన్ని మానవులకు చదవగలిగేలా చేయాలి. మరియు దాని ఫలితాలను నాణ్యమైన గేట్లలో కూడా ఉపయోగించాలి - నాణ్యత ప్రమాణాల ప్రకారం ఆమోదించబడిన మార్పు పాస్ అవుతుందా లేదా విఫలమవుతుందా అని నిర్ణయించడానికి తర్కం.
ఇది మాకు సహాయం చేస్తుంది , ఇది జనవరి 2019లో విడుదలైంది. దాని ఆగమనంతో, జెంకిన్స్ (CheckStyle, FindBugs, PMD, మొదలైనవి)లో స్టాటిక్ అనాలిసిస్ ఫలితాలతో పని చేయడానికి అనేక వ్యక్తిగత ప్లగిన్లు ఇప్పుడు పాతవిగా గుర్తించబడ్డాయి.
ప్లగ్ఇన్ రెండు భాగాలను కలిగి ఉంటుంది:
- అనేక ఎనలైజర్ సందేశ కలెక్టర్లు ( AcuCobol నుండి ZPT లింట్ వరకు సైన్స్కు తెలిసిన అన్ని ఎనలైజర్లను కలిగి ఉంటుంది),
- వారందరికీ ఒకే నివేదిక వీక్షకుడు.
హెచ్చరికలు NG విశ్లేషించగల విషయాల జాబితాలో జావా కంపైలర్ నుండి హెచ్చరికలు మరియు మావెన్ ఎగ్జిక్యూషన్ లాగ్ల నుండి హెచ్చరికలు ఉన్నాయి: అవి నిరంతరం కనిపించినప్పటికీ, అవి చాలా అరుదుగా ప్రత్యేకంగా విశ్లేషించబడతాయి. IntelliJ IDEA నివేదికలు కూడా గుర్తించబడిన ఫార్మాట్ల జాబితాలో చేర్చబడ్డాయి.
ప్లగ్ఇన్ కొత్తది కాబట్టి, ఇది ప్రారంభంలో జెంకిన్స్ పైప్లైన్తో బాగా సంకర్షణ చెందుతుంది. దాని భాగస్వామ్యంతో బిల్డ్ స్టెప్ ఇలా కనిపిస్తుంది (మేము ఏ రిపోర్ట్ ఆకృతిని గుర్తించాము మరియు ఏ ఫైల్లను స్కాన్ చేయాలి అని ప్లగ్ఇన్కి తెలియజేస్తాము):
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')]
)
}నివేదిక ఇంటర్ఫేస్ ఇలా కనిపిస్తుంది:

సౌకర్యవంతంగా, ఈ ఇంటర్ఫేస్ అన్ని గుర్తింపు పొందిన ఎనలైజర్లకు సార్వత్రికమైనది. ఇది వర్గం వారీగా అన్వేషణల పంపిణీ యొక్క ఇంటరాక్టివ్ రేఖాచిత్రం మరియు అన్వేషణల సంఖ్యలో మార్పుల యొక్క డైనమిక్స్ యొక్క గ్రాఫ్ను కలిగి ఉంటుంది. మీరు పేజీ దిగువన ఉన్న గ్రిడ్లో త్వరిత శోధన చేయవచ్చు. IDEA తనిఖీల కోసం సరిగ్గా పని చేయని ఏకైక విషయం ఏమిటంటే, కోడ్ని నేరుగా జెంకిన్స్లో బ్రౌజ్ చేయగల సామర్థ్యం (ఇతర నివేదికల కోసం, ఉదాహరణకు చెక్స్టైల్, ఈ ప్లగ్ఇన్ దీన్ని అందంగా చేయగలదు). ఇది IDEA రిపోర్ట్ పార్సర్లో ఉన్న బగ్గా ఉంది, దాన్ని పరిష్కరించాల్సిన అవసరం ఉంది.
హెచ్చరికల NG యొక్క లక్షణాలలో ఒక నివేదికలో వివిధ మూలాల నుండి కనుగొన్న వాటిని సమగ్రపరచగల సామర్థ్యం మరియు రిఫరెన్స్ అసెంబ్లీ కోసం “రాట్చెట్”తో సహా క్వాలిటీ గేట్లను ప్రోగ్రామ్ చేయవచ్చు. కొన్ని క్వాలిటీ గేట్స్ ప్రోగ్రామింగ్ డాక్యుమెంటేషన్ అందుబాటులో ఉంది - అయితే, ఇది పూర్తి కాలేదు మరియు మీరు సోర్స్ కోడ్ని చూడాలి. మరోవైపు, ఏమి జరుగుతుందో పూర్తి నియంత్రణ కోసం, "రాట్చెట్" స్వతంత్రంగా అమలు చేయబడుతుంది (నా చూడండి ఈ థీమ్ గురించి).
తీర్మానం
ఈ విషయాన్ని సిద్ధం చేయడం ప్రారంభించే ముందు, నేను శోధించాలని నిర్ణయించుకున్నాను: హబ్రేలో ఈ అంశంపై ఎవరైనా ఇప్పటికే వ్రాసారా? నేను మాత్రమే కనుగొన్నాను с అతను ఎక్కడ చెప్పాడు:
నాకు తెలిసినంత వరకు, జెంకిన్స్ లేదా మావెన్ ప్లగ్ఇన్తో ఏకీకరణ లేదు […] సూత్రప్రాయంగా, ఏ ఔత్సాహికులైనా IDEA కమ్యూనిటీ ఎడిషన్ మరియు జెంకిన్స్తో స్నేహం చేయవచ్చు, చాలామంది దీని నుండి మాత్రమే ప్రయోజనం పొందుతారు.
సరే, రెండు సంవత్సరాల తర్వాత మేము హెచ్చరికల NG ప్లగిన్ని కలిగి ఉన్నాము, చివరకు ఈ స్నేహం ఫలించింది!
మూలం: www.habr.com
