Өнөөдөр IntelliJ IDEA нь хамгийн дэвшилтэт статик Java кодын анализатортой бөгөөд энэ нь чадвараараа "ахмад дайчдыг" хол орхидог.
Гэсэн хэдий ч шинжилгээний үр дүнг зөвхөн хөгжүүлэгчийн IDE-ийн локал интерфэйс дээр харуулсан л бол хөгжүүлэлтийн процесст төдийлөн ашиггүй болно. Статик шинжилгээ
Алхам 1. Шинжилгээг саванд хийж, тайлан аваарай
Эхлээд график интерфэйсгүй CI систем дотор IDE (ширээний програм!) ажиллуулах санаа нь эргэлзээтэй бөгөөд маш их асуудалтай мэт санагдаж магадгүй юм. Аз болоход IDEA хөгжүүлэгчид ажиллуулах боломжийг олгосон
Хяналт шалгалтыг скрипт ашиглан эхлүүлдэг bin/inspect.sh
IDEA суулгах лавлахаас. Шаардлагатай параметрүүд нь:
- төсөлд хүрэх бүрэн зам (хамаатан садан нь дэмжигдээгүй),
- Хяналтын тохиргоотой .xml файлын зам (ихэвчлэн .idea/inspectionProfiles/Project_Default.xml доторх төслийн дотор байрладаг),
- шинжилгээний үр дүнгийн тайлан бүхий .xml файлууд хадгалагдах хавтас руу очих бүрэн зам.
Үүнээс гадна, энэ нь хүлээгдэж байна
- Java SDK-д хүрэх замыг IDE-д тохируулах болно, эс тэгвээс шинжилгээ ажиллахгүй. Эдгээр тохиргоонууд нь тохиргооны файлд агуулагддаг
jdk.table.xml
IDEA глобал тохиргооны хавтсанд. IDEA глобал тохиргоо нь өөрөө хэрэглэгчийн гэрийн лавлахад анхдагчаар байрладаг боловч энэ байршилтодорхой зааж өгч болно файлдidea.properties
. - Шинжилгээнд хамрагдсан төсөл нь хүчинтэй IDEA төсөл байх ёстой бөгөөд үүний тулд та хувилбарын удирдлагад ихэвчлэн үл тоомсорлодог зарим файлуудыг оруулах шаардлагатай болно, тухайлбал:
.idea/inspectionProfiles/Project_Default.xml
- анализаторын тохиргоо, тэдгээрийг саванд шалгалт хийх үед ашиглах нь ойлгомжтой..idea/modules.xml
- эс тэгвээс бид "Энэ төсөлд модуль байхгүй" гэсэн алдаа гарах болно,.idea/misc.xml
- эс тэгвээс бид "JDK нь энэ төсөлд зөв тохируулагдаагүй байна" гэсэн алдаа гарна,*.iml-файлы
- эс тэгвээс бид модульд тохируулагдаагүй JDK-ийн талаар алдаа авах болно.
Хэдийгээр эдгээр файлууд нь ихэвчлэн багтдаг .gitignore
, тэдгээр нь тодорхой хөгжүүлэгчийн орчинд хамаарах ямар ч мэдээлэл агуулаагүй болно - жишээлбэл, файлаас ялгаатай workspace.xml
, ийм мэдээлэл агуулагдаж байгаа тул үүнийг хийх шаардлагагүй болно.
Тодорхой шийдэл бол JDK-г IDEA Community Edition-ийн хамт задлан шинжилж буй төслүүд дээр "цохиход" бэлэн хэлбэрээр саванд хийх явдал юм. Тохиромжтой суурь савыг сонгоцгооё, манай 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
Шинжилгээ амжилттай хийгдэх ёстой бөгөөд зорилтот/idea_inspections дэд хавтсанд анализаторын тайлантай олон .xml файл гарч ирэх ёстой.
Одоо IDEA анализаторыг ямар ч CI орчинд дангаар нь ажиллуулах боломжтой гэдэгт эргэлзэх зүйлгүй болсон бөгөөд бид хоёр дахь алхам руу шилжиж байна.
Алхам 2. Тайланг үзүүлж, дүн шинжилгээ хийх
Тайланг .xml файл хэлбэрээр авах нь тулааны тал хувь юм, одоо та үүнийг хүн унших боломжтой болгох хэрэгтэй. Мөн түүнчлэн түүний үр дүнг чанарын хаалгануудад ашиглах ёстой - чанарын шалгуурын дагуу хүлээн зөвшөөрөгдсөн өөрчлөлт нь дамжих эсвэл бүтэлгүйтэх эсэхийг тодорхойлох логик юм.
Энэ нь бидэнд туслах болно
Plugin нь хоёр хэсгээс бүрдэнэ:
- олон тооны анализатор мессеж цуглуулагч (
бүрэн жагсаалт AcuCobol-аас ZPT Lint хүртэлх шинжлэх ухаанд мэдэгдэж байгаа бүх анализаторууд орно), - бүгдэд зориулсан нэг тайлан үзүүлэгч.
Warnings NG-ийн дүн шинжилгээ хийх зүйлсийн жагсаалтад Java хөрвүүлэгчийн анхааруулга болон Maven-ийн гүйцэтгэлийн бүртгэлээс авсан анхааруулга багтсан болно: хэдийгээр тэдгээр нь байнга харагдах боловч тусгайлан задлан шинжилдэггүй. IntelliJ IDEA тайлангууд нь хүлээн зөвшөөрөгдсөн форматуудын жагсаалтад багтсан болно.
Plugin нь шинэ учраас эхлээд Jenkins Pipeline-тай сайн харьцдаг. Түүний оролцоотойгоор бүтээх алхам нь иймэрхүү харагдах болно (бид ямар тайлангийн форматыг таних, ямар файлуудыг сканнердах ёстойг залгахад л хэлэх болно):
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 шалгалтын хувьд зөв ажиллаагүй цорын ганц зүйл бол кодыг Женкинсээс шууд үзэх чадвар байсан (хэдийгээр бусад тайлангийн хувьд, жишээ нь Checkstyle, энэ залгаас үүнийг маш сайн хийж чадна). Энэ нь IDEA тайлан задлагчийн алдаа бөгөөд засах шаардлагатай байна.
Warnings NG-ийн онцлогуудын нэг нь өөр өөр эх сурвалжаас олж авсан үр дүнг нэг тайланд нэгтгэж, Чанарын Хаалга, түүний дотор лавлагааны угсралтад зориулсан "ратчет" програмыг багтаах чадвар юм. Чанарын Гейтсийн зарим програмчлалын баримт бичиг байдаг
дүгнэлт
Энэ материалыг бэлдэж эхлэхээсээ өмнө би хайлт хийхээр шийдсэн: хэн нэгэн Хабре дээр энэ сэдвээр аль хэдийн бичсэн үү? Би зөвхөн олсон
Миний мэдэж байгаагаар, Jenkins эсвэл maven залгаастай нэгдмэл байх боломжгүй [...] Зарчмын хувьд аливаа сонирхогч IDEA Community Edition болон Jenkins-тэй нөхөрлөх боломжтой, олон хүн үүнээс л ашиг хүртэх болно.
Хоёр жилийн дараа бид Warnings NG Plugin-тэй болсон бөгөөд эцэст нь энэ нөхөрлөл биелэлээ оллоо!
Эх сурвалж: www.habr.com