Jenkins боюнча IntelliJ IDEA текшерүүлөрүн жүргүзүү

IntelliJ IDEA бүгүнкү күндө эң өнүккөн статикалык Java код анализаторуна ээ, ал өзүнүн мүмкүнчүлүктөрү боюнча «ардагерлерди» артта калтырат. Текшерүү стили и Spotbugs. Анын көп сандаган "текшерүүлөрү" кодду коддоо стилинен баштап типтүү мүчүлүштүктөргө чейин ар кандай аспектилерде текшерет.

Бирок, талдоо натыйжалары иштеп чыгуучунун 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

Талдоо ийгиликтүү жүргүзүлүшү керек жана талдоочу отчеттору бар көптөгөн .xml файлдары target/idea_inspections подпапкасында пайда болушу керек.

Эми IDEA анализаторун каалаган CI чөйрөсүндө өз алдынча иштетүүгө боло тургандыгына эч кандай шек жок жана биз экинчи кадамга өтөбүз.

Кадам 2. Отчетту көрсөтүү жана талдоо

.xml файлдары түрүндө отчет алуу - азыр аны адам окуй турган кылуу керек. Жана ошондой эле анын натыйжалары сапат дарбазаларында колдонулушу керек - кабыл алынган өзгөртүү сапат критерийлерине ылайык өтүп же өтпөй калганын аныктоо логикасы.

Бул бизге жардам берет Jenkins Warnings NG Plugin, ал 2019-жылдын январында чыгарылган. Анын пайда болушу менен Jenkins (CheckStyle, FindBugs, PMD, ж.

Плагин эки бөлүктөн турат:

  • көптөгөн анализатор кабар жыйноочулар (толук тизмеси AcuCobolдан ZPT Lintке чейин илимге белгилүү болгон бардык анализаторлорду камтыйт),
  • алардын бардыгы үчүн бир отчетту көрүүчү.

Warnings NG талдай ала турган нерселердин тизмеси Java компиляторунун эскертүүлөрүн жана Maven аткаруу журналдарынын эскертүүлөрүн камтыйт: алар дайыма көрүнүп турса да, алар сейрек гана талданышат. IntelliJ IDEA отчеттору да таанылган форматтардын тизмесине киргизилген.

Плагин жаңы болгондуктан, алгач 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')]
    )
}

Отчеттун интерфейси төмөнкүдөй көрүнөт:

Jenkins боюнча IntelliJ IDEA текшерүүлөрүн жүргүзүү

Ыңгайлуу, бул интерфейс бардык таанылган анализаторлор үчүн универсалдуу. Анда табылгандардын категориялар боюнча бөлүштүрүлүшүнүн интерактивдүү диаграммасы жана табылгалардын санынын өзгөрүү динамикасынын графиги камтылган. Сиз беттин ылдый жагындагы торчодо тез издөөнү аткара аласыз. IDEA текшерүүлөрү үчүн туура иштебеген бир гана нерсе, кодду түз Дженкинсте карап чыгуу мүмкүнчүлүгү болгон (бирок башка отчеттор үчүн, мисалы Checkstyle, бул плагин муну эң сонун кыла алат). Бул IDEA отчеттук анализдөөчүсүндөгү мүчүлүштүк, аны оңдоо керек окшойт.

Warnings NG өзгөчөлүктөрүнүн арасында ар кандай булактардан алынган жыйынтыктарды бир отчетто жана Quality Gates программасында, анын ичинде маалымдама жыйыны үчүн "ратчет" менен бириктирүү мүмкүнчүлүгү бар. Кээ бир Quality Gates программалоо документтери бар бул жерде - бирок, ал толук эмес, жана сиз баштапкы кодду карашыңыз керек. Башка жагынан алганда, эмне болуп жатканын толук көзөмөлдөө үчүн, "ратчет" өз алдынча ишке ашырылышы мүмкүн (караңыз менин мурунку пост Бул тема жөнүндө).

жыйынтыктоо

Бул материалды даярдоону баштоодон мурун, мен издөөнү чечтим: кимдир бирөө Habréде бул темада жазылганбы? Мен гана таптым интервью 2017 с lanyал жерде мындай дейт:

Менин билишимче, Дженкинс же maven плагини менен интеграция жок [...] Негизи, ар бир энтузиаст IDEA Community Edition жана Jenkins менен достошсо болот, көптөр мындан пайда көрүшөт.

Эки жылдан кийин бизде Warnings NG Plugin бар жана акыры бул достук ишке ашты!

Source: www.habr.com

DDoS коргоосу, VPS VDS серверлери бар сайттар үчүн ишенимдүү хостинг сатып алыңыз 🔥 DDoS коргоосу, VPS VDS серверлери бар ишенимдүү веб-сайт хостингин сатып алыңыз | ProHoster