Jenkins์—์„œ 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, ๊ทธ๋Ÿฌํ•œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ปค๋ฐ‹ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ ์ž์ฒด๋กœ ํƒˆ์ถœ๊ตฌ๋Š” IDEA Community Edition๊ณผ ํ•จ๊ป˜ JDK๋ฅผ ๋ถ„์„๋œ ํ”„๋กœ์ ํŠธ์—์„œ "์„ค์ •"ํ•  ์ค€๋น„๊ฐ€ ๋œ ํ˜•ํƒœ์˜ ์ปจํ…Œ์ด๋„ˆ์— ํฌ์žฅํ•˜๋„๋ก ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ๊ธฐ๋ณธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์„ ํƒํ•˜๊ณ  ๋‹ค์Œ์€ ์šฐ๋ฆฌ๊ฐ€ ์–ป๋Š” 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

๋ถ„์„์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๊ณ  ๋ถ„์„๊ธฐ ๋ณด๊ณ ์„œ๊ฐ€ ํฌํ•จ๋œ ์ˆ˜๋งŽ์€ .xml ํŒŒ์ผ์ด target/idea_inspections ํ•˜์œ„ ํด๋”์— ๋‚˜ํƒ€๋‚˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ IDEA ๋ถ„์„๊ธฐ๊ฐ€ ๋ชจ๋“  CI ํ™˜๊ฒฝ์—์„œ ๋…๋ฆฝํ˜• ๋ชจ๋“œ๋กœ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฐ ์˜์‹ฌ์˜ ์—ฌ์ง€๊ฐ€ ์—†์œผ๋ฉฐ ๋‘ ๋ฒˆ์งธ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค.

2๋‹จ๊ณ„. ๋ณด๊ณ ์„œ ํ‘œ์‹œ ๋ฐ ๋ถ„์„

.xml ํŒŒ์ผ ํ˜•์‹์œผ๋กœ ๋ณด๊ณ ์„œ๋ฅผ ๋ฐ›๋Š” ๊ฒƒ์€ ์ „ํˆฌ์˜ ์ ˆ๋ฐ˜์ž…๋‹ˆ๋‹ค. ์ด์ œ ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ทธ ๊ฒฐ๊ณผ๋Š” ์ˆ˜๋ฝ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํ’ˆ์งˆ ๊ธฐ์ค€์— ๋”ฐ๋ผ ํ†ต๊ณผํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋…ผ๋ฆฌ์ธ ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ์— ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์šฐ๋ฆฌ์—๊ฒŒ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค Jenkins ๊ฒฝ๊ณ  NG ํ”Œ๋Ÿฌ๊ทธ์ธ2019๋…„ XNUMX์›”์— ์ถœ์‹œ๋œ ์ œํ’ˆ์ž…๋‹ˆ๋‹ค. ์†Œ๊ฐœ์™€ ํ•จ๊ป˜ Jenkins(CheckStyle, FindBugs, PMD ๋“ฑ)์—์„œ ์ •์  ๋ถ„์„ ๊ฒฐ๊ณผ๋กœ ์ž‘์—…ํ•˜๊ธฐ ์œ„ํ•œ ๋งŽ์€ ๊ฐœ๋ณ„ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ด์ œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • ์ˆ˜๋งŽ์€ ๋ถ„์„๊ธฐ ๋ฉ”์‹œ์ง€ ์ˆ˜์ง‘๊ธฐ(์ „์ฒด ๋ชฉ๋ก AcuCobol์—์„œ ZPT Lint๊นŒ์ง€ ๊ณผํ•™์— ์•Œ๋ ค์ง„ ๋ชจ๋“  ๋ถ„์„๊ธฐ๋ฅผ ํฌํ•จ),
  • ๊ทธ๋“ค ๋ชจ๋‘๋ฅผ ์œ„ํ•œ ๋‹จ์ผ ๋ณด๊ณ ์„œ ๋ทฐ์–ด.

Warnings NG๊ฐ€ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋Š” ํ•ญ๋ชฉ ๋ชฉ๋ก์—๋Š” Java ์ปดํŒŒ์ผ๋Ÿฌ ๊ฒฝ๊ณ  ๋ฐ Maven ์‹คํ–‰ ๋กœ๊ทธ์˜ ๊ฒฝ๊ณ ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ง€์†์ ์œผ๋กœ ํ‘œ์‹œ๋˜์ง€๋งŒ ์˜๋„์ ์œผ๋กœ ๋ถ„์„๋˜๋Š” ๊ฒฝ์šฐ๋Š” ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. IntelliJ IDEA ๋ณด๊ณ ์„œ๋„ ์ธ์‹๋˜๋Š” ํ˜•์‹ ๋ชฉ๋ก์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ƒˆ๋กญ๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ์—๋Š” Jenkins ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ์ž˜ ์ƒํ˜ธ ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฐ€ ์ฐธ์—ฌํ•˜๋Š” ๋นŒ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค(์šฐ๋ฆฌ๋Š” ์ธ์‹ํ•˜๋Š” ๋ณด๊ณ ์„œ ํ˜•์‹๊ณผ ์Šค์บ”ํ•ด์•ผ ํ•˜๋Š” ํŒŒ์ผ์„ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์•Œ๋ ค์ค๋‹ˆ๋‹ค).

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 ๊ฒ€์‚ฌ์—์„œ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ Jenkins์—์„œ ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๊ธฐ๋Šฅ์ด์—ˆ์Šต๋‹ˆ๋‹ค(Checkstyle๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ๋ณด๊ณ ์„œ์˜ ๊ฒฝ์šฐ ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ›Œ๋ฅญํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ). ์ˆ˜์ •ํ•ด์•ผ ํ•  IDEA ๋ณด๊ณ ์„œ ํŒŒ์„œ์˜ ๋ฒ„๊ทธ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Warnings NG์˜ ๊ธฐ๋Šฅ ์ค‘์—๋Š” ์ฐธ์กฐ ์–ด์…ˆ๋ธ”๋ฆฌ์— ๋Œ€ํ•œ "๋ž˜์นซ"์„ ํฌํ•จํ•˜์—ฌ ํ•˜๋‚˜์˜ ๋ณด๊ณ ์„œ ๋ฐ ํ”„๋กœ๊ทธ๋žจ ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ์—์„œ ์—ฌ๋Ÿฌ ์†Œ์Šค์˜ ๊ฒฐ๊ณผ๋ฅผ ์ง‘๊ณ„ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ Quality Gates ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฌธ์„œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— - ๋‹ค๋งŒ, ์™„์„ฑ๋œ ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ, ์ถœ์ฒ˜๋ฅผ ์‚ดํŽด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ๋ฐœ์ƒํ•˜๋Š” ์ƒํ™ฉ์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด "๋ž˜์นซ"์„ ๋…๋ฆฝ์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ œ ะฟั€ะตะดั‹ะดัƒั‰ะธะน ํฌ์ŠคํŠธ ์ด ์ฃผ์ œ์— ๋Œ€ํ•ด).

๊ฒฐ๋ก 

์ด ์ž๋ฃŒ๋ฅผ ์ค€๋น„ํ•˜๊ธฐ ์ „์— ์‚ดํŽด๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฃผ์ œ์— ๋Œ€ํ•ด ์ด๋ฏธ Habrรฉ์— ๊ธ€์„ ์“ด ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋งŒ ์ฐพ์•˜์–ด ์ธํ„ฐ๋ทฐ 2017 ั ๋ผ๋‹ˆ๊ทธ๊ฒƒ์ด ๋งํ•˜๋Š” ๊ณณ :

๋‚ด๊ฐ€ ์•„๋Š” ํ•œ Jenkins ๋˜๋Š” maven ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ์˜ ํ†ตํ•ฉ์€ ์—†์Šต๋‹ˆ๋‹ค [...] ์›์น™์ ์œผ๋กœ ๋ชจ๋“  ์• ํ˜ธ๊ฐ€๋Š” IDEA Community Edition ๋ฐ Jenkins ์นœ๊ตฌ๋ฅผ ์‚ฌ๊ทˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ด์ ์„ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž, XNUMX๋…„ ํ›„ ์šฐ๋ฆฌ๋Š” Warnings NG Plugin์„ ๊ฐ€์ง€๊ฒŒ ๋˜์—ˆ๊ณ  ๋งˆ์นจ๋‚ด ์ด ์šฐ์ •์ด ์ด๋ฃจ์–ด์กŒ์Šต๋‹ˆ๋‹ค!

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€