Извођење ИнтеллиЈ ИДЕА инспекција на Џенкинсу

ИнтеллиЈ ИДЕА данас има најнапреднији статички Јава анализатор кода, који у својим могућностима оставља далеко иза себе такве „ветеране“ као што су Цхецкстиле и Спотбугс. Његове бројне „инспекције“ проверавају код у различитим аспектима, од стила кодирања до типичних грешака.

Међутим, све док се резултати анализе приказују само у локалном интерфејсу развојног ИДЕ-а, они су од мале користи за развојни процес. Статичка анализа мора бити испуњен Као први корак у процесу изградње, његови резултати би требало да дефинишу капије квалитета, а изградња би требало да пропадне ако се не прођу капије квалитета. Познато је да је ТеамЦити ЦИ интегрисан са ИДЕА-ом. Али чак и ако не користите ТеамЦити, можете лако покушати да покренете ИДЕА инспекције на било ком другом ЦИ серверу. Предлажем да видите како се то може урадити користећи ИДЕА Цоммунити Едитион, Јенкинс и Варнингс НГ додатак.

Корак 1. Покрените анализу у контејнеру и добијте извештај

У почетку, идеја о покретању ИДЕ (десктоп апликације!) унутар ЦИ система који нема графички интерфејс може изгледати сумњиво и веома проблематично. На срећу, ИДЕА програмери су обезбедили могућност покретања форматирање кода и инспекције из командне линије. Штавише, за покретање ИДЕА-е у овом режиму није потребан графички подсистем и ови задаци се могу обављати на серверима са текстуалном шкољком.

Инспекције се покрећу помоћу скрипте bin/inspect.sh из ИДЕА инсталационог директоријума. Потребни параметри су:

  • пун пут до пројекта (релативни нису подржани),
  • путања до .кмл датотеке са подешавањима инспекције (обично се налази унутар пројекта у .идеа/инспецтионПрофилес/Пројецт_Дефаулт.кмл),
  • пуна путања до фасцикле у којој ће се чувати .кмл фајлови са извештајима о резултатима анализе.

Осим тога, очекује се да

  • путања до Јава СДК-а ће бити конфигурисана у ИДЕ-у, иначе анализа неће радити. Ова подешавања се налазе у конфигурационој датотеци jdk.table.xml у ИДЕА глобалној конфигурационој фасцикли. Сама глобална конфигурација ИДЕА се подразумевано налази у кућном директоријуму корисника, али ова локација може се експлицитно навести у фајлу idea.properties.
  • пројекат који се анализира мора бити важећи ИДЕА пројекат, за који ћете морати да урезујете неке датотеке које се обично игноришу у контроли верзија, и то:
    • .idea/inspectionProfiles/Project_Default.xml — подешавања анализатора, они ће се очигледно користити приликом обављања инспекција у контејнеру,
    • .idea/modules.xml - у супротном ћемо добити грешку 'Овај пројекат не садржи модуле',
    • .idea/misc.xml - у супротном ћемо добити грешку „ЈДК није правилно конфигурисан за овај пројекат“,
    • *.iml-файлы — иначе ћемо добити грешку о неконфигурисаном ЈДК-у у модулу.

Иако су ове датотеке обично укључене у .gitignore, не садрже никакве информације специфичне за окружење одређеног програмера - за разлику од, на пример, датотеке workspace.xml, где су такве информације садржане, па стога нема потребе да се то обавеже.

Очигледно решење је да се ЈДК заједно са ИДЕА Цоммунити Едитион-ом упакује у контејнер у облику спремном за „убацивање“ у анализиране пројекте. Хајде да изаберемо одговарајући основни контејнер, а ово ће бити наш Доцкерфиле:

Доцкерфиле

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 натерали смо ИДЕА-у да потражи своју глобалну конфигурацију у фасцикли /etc/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 run --rm -v <путь/к/вашему/проекту>:/var/project inponomarev/intellij-idea-analyzer

Анализа би требало да се покрене успешно, а бројне .кмл датотеке са извештајима анализатора треба да се појаве у поддиректоријуму таргет/идеа_инспецтионс.

Сада више нема сумње да ИДЕА анализатор може да се покреће самостално у било ком ЦИ окружењу, и прелазимо на други корак.

Корак 2. Прикажите и анализирајте извештај

Добијање извештаја у облику .кмл датотека је пола битке; сада морате да га учините читљивим за људе. И такође, њени резултати треба да се користе у капијама квалитета – логици за утврђивање да ли прихваћена промена пролази или не успева према критеријумима квалитета.

Ово ће нам помоћи Јенкинс Варнингс НГ додатак, који је објављен у јануару 2019. Са његовом појавом, многи појединачни додаци за рад са резултатима статичке анализе у Џенкинсу (ЦхецкСтиле, ФиндБугс, ПМД, итд.) су сада означени као застарели.

Додатак се састоји од два дела:

  • бројни сакупљачи порука анализатора (Комплетна листа укључује све анализаторе познате науци од АцуЦобола до ЗПТ Линт),
  • један прегледач извештаја за све њих.

Листа ствари које Варнингс НГ може да анализира укључује упозорења из Јава компајлера и упозорења из Мавен дневника извршавања: иако су стално видљива, ретко се посебно анализирају. ИнтеллиЈ ИДЕА извештаји су такође укључени у листу признатих формата.

Пошто је додатак нов, у почетку добро сарађује са Јенкинс Пипелине-ом. Корак израде са његовим учешћем ће изгледати овако (једноставно кажемо додатку који формат извештаја препознајемо и које датотеке треба скенирати):

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

Интерфејс извештаја изгледа овако:

Извођење ИнтеллиЈ ИДЕА инспекција на Џенкинсу

Погодно, овај интерфејс је универзалан за све признате анализаторе. Садржи интерактивни дијаграм дистрибуције налаза по категоријама и графикон динамике промене броја налаза. Можете извршити брзу претрагу у мрежи на дну странице. Једина ствар која није функционисала исправно за ИДЕА инспекције била је могућност да се код директно прегледа у Џенкинсу (иако за друге извештаје, на пример Цхецкстиле, овај додатак то може лепо да уради). Изгледа да је ово грешка у ИДЕА анализатору извештаја коју треба поправити.

Међу карактеристикама Варнингс НГ је и могућност обједињавања налаза из различитих извора у једном извештају и програмирање капија квалитета, укључујући „чегрлицу“ за референтни склоп. Доступна је нека програмска документација Куалити Гатес-а овде - међутим, није комплетан, и морате погледати изворни код. С друге стране, за потпуну контролу над оним што се дешава, „чегрта“ се може применити независно (погледајте мој предидусиј пост о овој теми).

Закључак

Пре него што почнем да припремам овај материјал, одлучио сам да потражим: да ли је неко већ писао о овој теми на Хабреу? Само сам нашао интервју 2017 с девојкагде каже:

Колико ја знам, не постоји интеграција са Џенкинсом или мавен додатком […] У принципу, сваки ентузијаста би могао да се спријатељи са ИДЕА Цоммунити Едитион и Џенкинсом, многи би од овога имали само користи.

Па, две године касније имамо Варнингс НГ Плугин, и коначно је ово пријатељство дошло до плода!

Извор: ввв.хабр.цом

Додај коментар