ЗапускаСм инспСкции IntelliJ IDEA Π½Π° Jenkins

IntelliJ IDEA Π½Π° сСгодня ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹ΠΌ статичСским Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΊΠΎΠ΄Π° Java, ΠΏΠΎ своим возмоТностям ΠΎΡΡ‚Π°Π²ΠΈΠ²ΡˆΠΈΠΌ Π΄Π°Π»Π΅ΠΊΠΎ ΠΏΠΎΠ·Π°Π΄ΠΈ Ρ‚Π°ΠΊΠΈΡ… Β«Π²Π΅Ρ‚Π΅Ρ€Π°Π½ΠΎΠ²Β», ΠΊΠ°ΠΊ Checkstyle ΠΈ Spotbugs. Π•Ρ‘ многочислСнныС «инспСкции» ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ ΠΊΠΎΠ΄ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… аспСктах, ΠΎΡ‚ стиля кодирования Π΄ΠΎ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½Ρ‹Ρ… Π±Π°Π³ΠΎΠ².

Однако ΠΏΠΎΠΊΠ° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π°Π½Π°Π»ΠΈΠ·Π° ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ лишь Π² локальном интСрфСйсС IDE Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°, ΠΎΡ‚ Π½ΠΈΡ… ΠΌΠ°Π»ΠΎ ΠΏΠΎΠ»ΡŒΠ·Ρ‹ для процСсса Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. БтатичСский Π°Π½Π°Π»ΠΈΠ· Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π² качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ шага ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Π° сборки, Π΅Π³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ quality gates, Π° сборка Π΄ΠΎΠ»ΠΆΠ½Π° Ρ„Π΅ΠΉΠ»ΠΈΡ‚ΡŒΡΡ, Ссли quality gates Π½Π΅ ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½Ρ‹. Π˜Π·Π²Π΅ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ TeamCity CI ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ с IDEA. Но Π΄Π°ΠΆΠ΅ Ссли Π²Ρ‹ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ TeamCity, Π²Ρ‹ Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ инспСкции IDEA Π² любом Π΄Ρ€ΡƒΠ³ΠΎΠΌ CI-сСрвСрС. ΠŸΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ IDEA Community Edition, Jenkins ΠΈ Warnings NG plugin.

Π¨Π°Π³ 1. ЗапускаСм Π°Π½Π°Π»ΠΈΠ· Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΎΡ‚Ρ‡Ρ‘Ρ‚

ΠŸΠΎΠ½Π°Ρ‡Π°Π»Ρƒ затСя Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ IDE (дСсктопноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅!) Π²Π½ΡƒΡ‚Ρ€ΠΈ CI-систСмы, Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΉ графичСского интСрфСйса, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΡΠΎΠΌΠ½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈ ΠΎΡ‡Π΅Π½ΡŒ Ρ…Π»ΠΎΠΏΠΎΡ‚Π½ΠΎΠΉ. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ IDEA прСдоставили Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° ΠΈ инспСкции ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. ΠŸΡ€ΠΈΡ‡Ρ‘ΠΌ для запуска IDEA Π² Ρ‚Π°ΠΊΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π½Π΅ трСбуСтся графичСская подсистСма ΠΈ эти Π·Π°Π΄Π°Ρ‡ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π½Π° сСрвСрах с тСкстовой ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΎΠΉ.

Запуск инспСкций осущСствляСтся ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ скрипта bin/inspect.sh ΠΈΠ· установочной Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ IDEA. Π’ качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ:

  • ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ (ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ),
  • ΠΏΡƒΡ‚ΡŒ ΠΊ .xml-Ρ„Π°ΠΉΠ»Ρƒ с настройками инспСкций (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ находится Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π² .idea/inspectionProfiles/Project_Default.xml),
  • ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΏΠ°ΠΏΠΊΠ΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π±ΡƒΠ΄ΡƒΡ‚ слоТСны .xml-Ρ„Π°ΠΉΠ»Ρ‹ с ΠΎΡ‚Ρ‡Ρ‘Ρ‚Π°ΠΌΠΈ ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°Ρ… Π°Π½Π°Π»ΠΈΠ·Π°.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, оТидаСтся, Ρ‡Ρ‚ΠΎ

  • Π² IDE Π±ΡƒΠ΄Π΅Ρ‚ настроСн ΠΏΡƒΡ‚ΡŒ ΠΊ Java SDK, ΠΈΠ½Π°Ρ‡Π΅ Π°Π½Π°Π»ΠΈΠ· Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. Π­Ρ‚ΠΈ настройки содСрТатся Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ jdk.table.xml Π² ΠΏΠ°ΠΏΠΊΠ΅ глобальной ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ IDEA. Π‘Π°ΠΌΠ° глобальная конфигурация IDEA ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π»Π΅ΠΆΠΈΡ‚ Π² домашнСй Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π½ΠΎ это мСстополоТСниС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ явно Π·Π°Π΄Π°Π½ΠΎ Π² Ρ„Π°ΠΉΠ»Π΅ idea.properties.
  • Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π²Π°Π»ΠΈΠ΄Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ IDEA, для Ρ‡Π΅Π³ΠΎ Π½Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ вСрсий придётся Π·Π°ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ:
    • .idea/inspectionProfiles/Project_Default.xml β€” настройки Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, ΠΎΠ½ΠΈ явно Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΏΡ€ΠΈ запускС инспСкций Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅,
    • .idea/modules.xml β€” ΠΈΠ½Π°Ρ‡Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ ‘This project contains no modules’,
    • .idea/misc.xml β€” ΠΈΠ½Π°Ρ‡Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ ‘The JDK is not configured properly for this project’,
    • *.iml-Ρ„Π°ΠΉΠ»Ρ‹ β€” ΠΈΠ½Π°Ρ‡Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΏΡ€ΠΎ Π½Π΅ настроСнный JDK Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅.

Π₯отя ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ эти Ρ„Π°ΠΉΠ»Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π² .gitignore, ΠΎΠ½ΠΈ Π½Π΅ содСрТат Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ спСцифичной для окруТСния ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ β€” Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ„Π°ΠΉΠ»Π° workspace.xml, Π³Π΄Π΅ такая информация, ΠΊΠ°ΠΊ Ρ€Π°Π·, содСрТится, ΠΈ ΠΏΠΎΡ‚ΠΎΠΌΡƒ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π½Π΅ Π½Π°Π΄ΠΎ.

Π‘Π°ΠΌ собою Π½Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ Π²Ρ‹Ρ…ΠΎΠ΄ Π·Π°ΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ JDK вмСстС с IDEA Community Edition Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π² Π²ΠΈΠ΄Π΅, Π³ΠΎΡ‚ΠΎΠ²ΠΎΠΌ ΠΊ Β«Π½Π°Ρ‚Ρ€Π°Π²Π»ΠΈΠ²Π°Π½ΠΈΡŽΒ» Π½Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹. Π’Ρ‹Π±Π΅Ρ€Π΅ΠΌ подходящий Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, ΠΈ Π²ΠΎΡ‚ ΠΊΠ°ΠΊΠΎΠΉ Ρƒ нас получится Dockerfile:

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

Анализ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Π° Π² ΠΏΠΎΠ΄ΠΏΠ°ΠΏΠΊΠ΅ target/idea_inspections Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ многочислСнныС .xml-Ρ„Π°ΠΉΠ»Ρ‹ с ΠΎΡ‚Ρ‡Ρ‘Ρ‚Π°ΠΌΠΈ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ большС Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… сомнСний Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ IDEA ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΡƒΡ‰Π΅Π½ Π² Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π² любом CI-ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ, ΠΈ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ ΡˆΠ°Π³Ρƒ.

Π¨Π°Π³ 2. ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ ΠΎΡ‚Ρ‡Ρ‘Ρ‚

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡ‚Ρ‡Ρ‘Ρ‚ Π² Π²ΠΈΠ΄Π΅ .xml-Ρ„Π°ΠΉΠ»ΠΎΠ² β€” ΠΏΠΎΠ»Π΄Π΅Π»Π°, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΅Π³ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌ. А Ρ‚Π°ΠΊΠΆΠ΅ Π΅Π³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ Π² quality gates β€” Π»ΠΎΠ³ΠΈΠΊΠ΅ опрСдСлСния Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ»ΠΈ Π½Π΅ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎ критСриям качСства.

Π’ этом Π½Π°ΠΌ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Jenkins Warnings NG Plugin, Ρ€Π΅Π»ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±Ρ‹Π» сдСлан Π² январС 2019 Π³ΠΎΠ΄Π°. Π‘ Π΅Π³ΠΎ появлСниСм ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ статичСского Π°Π½Π°Π»ΠΈΠ·Π° Π² Jenkins (CheckStyle, FindBugs, PMD ΠΈ Ρ‚. ΠΏ.) Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ ΠΊΠ°ΠΊ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠ΅ (obsolete).

Плагин состоит ΠΈΠ· Π΄Π²ΡƒΡ… частСй:

  • многочислСнных сборщиков сообщСний Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² (ΠΏΠΎΠ»Π½Ρ‹ΠΉ список Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя всС извСстныС Π½Π°ΡƒΠΊΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ ΠΎΡ‚ 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')]
    )
}

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ ΠΎΡ‚Ρ‡Ρ‘Ρ‚Π° выглядит Ρ‚Π°ΠΊ:

ЗапускаСм инспСкции IntelliJ IDEA Π½Π° Jenkins

Π£Π΄ΠΎΠ±Π½ΠΎ, Ρ‡Ρ‚ΠΎ этот интСрфСйс являСтся ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΌ для всСх распознаваСмых Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ². Он содСрТит ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΡƒΡŽ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡƒ распрСдСлСния Π½Π°Ρ…ΠΎΠ΄ΠΎΠΊ ΠΏΠΎ катСгориям ΠΈ Π³Ρ€Π°Ρ„ΠΈΠΊ Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΠΈ измСнСния количСства Π½Π°Ρ…ΠΎΠ΄ΠΎΠΊ. Π’ Π³Ρ€ΠΈΠ΄Π΅ Π²Π½ΠΈΠ·Ρƒ страницы ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ быстрый поиск. ЕдинствСнноС, Ρ‡Ρ‚ΠΎ для испСкций IDEA Π½Π΅ Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ β€” Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π±Ρ€Π°ΡƒΠ·ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ нСпосрСдствСнно Π² Jenkins (хотя для Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΡ‚Ρ‡Ρ‘Ρ‚ΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Checkstyle, этот ΠΏΠ»Π°Π³ΠΈΠ½ ΡƒΠΌΠ΅Π΅Ρ‚ это Π΄Π΅Π»Π°Ρ‚ΡŒ красиво). ΠŸΠΎΡ…ΠΎΠΆΠ΅, это Π±Π°Π³ парсСра ΠΎΡ‚Ρ‡Ρ‘Ρ‚ΠΎΠ² IDEA, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдстоит ΠΏΠΎΡ‡ΠΈΠ½ΠΈΡ‚ΡŒ.

Π‘Ρ€Π΅Π΄ΠΈ возмоТностСй Warnings NG β€” Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°Π³Ρ€Π΅Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΎΡ‚Ρ‡Ρ‘Ρ‚Π΅ Π½Π°Ρ…ΠΎΠ΄ΠΊΠΈ ΠΈΠ· Ρ€Π°Π·Π½Ρ‹Ρ… источников ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Quality Gates, Π² Ρ‚ΠΎΠΌ числС β€” Β«Ρ…Ρ€Π°ΠΏΠΎΠ²ΠΈΠΊΒ» ΠΏΠΎ Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ‚Π½ΠΎΠΉ сборкС. НСкоторая докумСнтация ΠΏΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ Quality Gates доступна здСсь β€” Π²ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, ΠΎΠ½Π° Π½Π΅ полная, ΠΈ приходится ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² исходники. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, для ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ контроля Π½Π°Π΄ происходящим Β«Ρ…Ρ€Π°ΠΏΠΎΠ²ΠΈΠΊΒ» ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ (см. ΠΌΠΎΠΉ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ пост Π½Π° эту Ρ‚Π΅ΠΌΡƒ).

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ Π½Π°Ρ‡Π°Ρ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π», я Ρ€Π΅ΡˆΠΈΠ» ΠΏΠΎΠΈΡΠΊΠ°Ρ‚ΡŒ: Π° Π½Π΅ писал Π»ΠΈ ΡƒΠΆΠ΅ ΠΊΡ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π½Π° эту Ρ‚Π΅ΠΌΡƒ Π½Π° Π₯Π°Π±Ρ€Π΅? Π― Π½Π°ΡˆΡ‘Π» лишь ΠΈΠ½Ρ‚Π΅Ρ€Π²ΡŒΡŽ 2017 Π³ΠΎΠ΄Π° с lany, Π³Π΄Π΅ ΠΎΠ½ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚:

Насколько ΠΌΠ½Π΅ извСстно, ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ с Jenkins ΠΈΠ»ΠΈ maven-ΠΏΠ»Π°Π³ΠΈΠ½Π° Π½Π΅Ρ‚Ρƒ […] Π’ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, любой энтузиаст ΠΌΠΎΠ³ Π±Ρ‹ ΠΏΠΎΠ΄Ρ€ΡƒΠΆΠΈΡ‚ΡŒ IDEA Community Edition ΠΈ Jenkins, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π±Ρ‹ ΠΎΡ‚ этого Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ΠΈΠ³Ρ€Π°Π»ΠΈ.

Π§Ρ‚ΠΎ ΠΆΠ΅: спустя Π΄Π²Π° Π³ΠΎΠ΄Π° Ρƒ нас Π΅ΡΡ‚ΡŒ Warnings NG Plugin, ΠΈ Π½Π°ΠΊΠΎΠ½Π΅Ρ†-Ρ‚ΠΎ эта Π΄Ρ€ΡƒΠΆΠ±Π° ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΠ»Π°ΡΡŒ!

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ