Женкинс дээр IntelliJ IDEA шалгалт явуулж байна

Өнөөдөр IntelliJ IDEA нь хамгийн дэвшилтэт статик Java кодын анализатортой бөгөөд энэ нь чадвараараа "ахмад дайчдыг" хол орхидог. Шалгалтын хэв маяг и Спатбаг. Түүний олон тооны "шалгалтууд" нь кодчилолын хэв маягаас эхлээд ердийн алдаанууд хүртэл кодыг янз бүрийн талаас нь шалгадаг.

Гэсэн хэдий ч шинжилгээний үр дүнг зөвхөн хөгжүүлэгчийн IDE-ийн локал интерфэйс дээр харуулсан л бол хөгжүүлэлтийн процесст төдийлөн ашиггүй болно. Статик шинжилгээ биелэгдэх ёстой Барилга дамжуулах хоолойн эхний алхам бол түүний үр дүн нь чанарын хаалгыг тодорхойлох ёстой бөгөөд хэрэв чанарын хаалгыг даваагүй бол угсралт амжилтгүй болно. TeamCity CI нь IDEA-тай нэгтгэгдсэн гэдгийг мэддэг. Гэхдээ та TeamCity ашигладаггүй байсан ч бусад CI сервер дээр IDEA шалгалтыг хялбархан ажиллуулж болно. Үүнийг IDEA Community Edition, Jenkins болон Warnings NG залгаасыг ашиглан хэрхэн хийхийг танд санал болгож байна.

Алхам 1. Шинжилгээг саванд хийж, тайлан аваарай

Эхлээд график интерфэйсгүй CI систем дотор IDE (ширээний програм!) ажиллуулах санаа нь эргэлзээтэй бөгөөд маш их асуудалтай мэт санагдаж магадгүй юм. Аз болоход IDEA хөгжүүлэгчид ажиллуулах боломжийг олгосон код форматлах и шалгалтууд тушаалын мөрөөс. Түүнчлэн 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>

Дууссан зураг Docker Hub дээр ашиглах боломжтой.

Үргэлжлүүлэхийн өмнө IDEA анализатор саванд ажиллаж байгаа эсэхийг шалгацгаая.

docker run --rm -v <путь/к/вашему/проекту>:/var/project inponomarev/intellij-idea-analyzer

Шинжилгээ амжилттай хийгдэх ёстой бөгөөд зорилтот/idea_inspections дэд хавтсанд анализаторын тайлантай олон .xml файл гарч ирэх ёстой.

Одоо IDEA анализаторыг ямар ч CI орчинд дангаар нь ажиллуулах боломжтой гэдэгт эргэлзэх зүйлгүй болсон бөгөөд бид хоёр дахь алхам руу шилжиж байна.

Алхам 2. Тайланг үзүүлж, дүн шинжилгээ хийх

Тайланг .xml файл хэлбэрээр авах нь тулааны тал хувь юм, одоо та үүнийг хүн унших боломжтой болгох хэрэгтэй. Мөн түүнчлэн түүний үр дүнг чанарын хаалгануудад ашиглах ёстой - чанарын шалгуурын дагуу хүлээн зөвшөөрөгдсөн өөрчлөлт нь дамжих эсвэл бүтэлгүйтэх эсэхийг тодорхойлох логик юм.

Энэ нь бидэнд туслах болно Jenkins Warnings NG Plugin2019 оны XNUMX-р сард гарсан. Энэ нь бий болсноор Jenkins (CheckStyle, FindBugs, PMD гэх мэт) дээр статик шинжилгээний үр дүнтэй ажиллахад зориулагдсан олон тусдаа залгаасууд хуучирсан гэж тэмдэглэгдсэн байна.

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')]
    )
}

Тайлангийн интерфейс дараах байдалтай байна.

Женкинс дээр IntelliJ IDEA шалгалт явуулж байна

Тохиромжтойгоор энэ интерфейс нь хүлээн зөвшөөрөгдсөн бүх анализаторуудад түгээмэл байдаг. Энэ нь олдворуудыг ангиллаар нь хуваарилах интерактив диаграм, олдворын тооны өөрчлөлтийн динамикийн графикийг агуулдаг. Та хуудасны доод хэсэгт байрлах сүлжээнд хурдан хайлт хийж болно. IDEA шалгалтын хувьд зөв ажиллаагүй цорын ганц зүйл бол кодыг Женкинсээс шууд үзэх чадвар байсан (хэдийгээр бусад тайлангийн хувьд, жишээ нь Checkstyle, энэ залгаас үүнийг маш сайн хийж чадна). Энэ нь IDEA тайлан задлагчийн алдаа бөгөөд засах шаардлагатай байна.

Warnings NG-ийн онцлогуудын нэг нь өөр өөр эх сурвалжаас олж авсан үр дүнг нэг тайланд нэгтгэж, Чанарын Хаалга, түүний дотор лавлагааны угсралтад зориулсан "ратчет" програмыг багтаах чадвар юм. Чанарын Гейтсийн зарим програмчлалын баримт бичиг байдаг энд - Гэсэн хэдий ч энэ нь бүрэн биш бөгөөд та эх кодыг харах хэрэгтэй. Нөгөө талаас, юу болж байгааг бүрэн хянахын тулд "ратчет" -ийг бие даан хэрэгжүүлж болно (миний мэдээллийг үзнэ үү. өмнөх нийтлэл Энэ сэдвийн талаар).

дүгнэлт

Энэ материалыг бэлдэж эхлэхээсээ өмнө би хайлт хийхээр шийдсэн: хэн нэгэн Хабре дээр энэ сэдвээр аль хэдийн бичсэн үү? Би зөвхөн олсон ярилцлага 2017 с Ланитэр хаана хэлэхдээ:

Миний мэдэж байгаагаар, Jenkins эсвэл maven залгаастай нэгдмэл байх боломжгүй [...] Зарчмын хувьд аливаа сонирхогч IDEA Community Edition болон Jenkins-тэй нөхөрлөх боломжтой, олон хүн үүнээс л ашиг хүртэх болно.

Хоёр жилийн дараа бид Warnings NG Plugin-тэй болсон бөгөөд эцэст нь энэ нөхөрлөл биелэлээ оллоо!

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх