IntelliJ IDEA๋ ์ค๋๋ ๊ฐ์ฅ ์ง๋ณด๋ ์ ์ Java ์ฝ๋ ๋ถ์๊ธฐ๋ฅผ ๋ณด์ ํ๊ณ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ถ์ ๊ฒฐ๊ณผ๊ฐ ๊ฐ๋ฐ์์ ๋ก์ปฌ IDE์๋ง ํ์๋๋ ํ ๊ฐ๋ฐ ํ๋ก์ธ์ค์ ๊ฑฐ์ ๋์์ด ๋์ง ์์ต๋๋ค. ์ ์ ๋ถ์
1๋จ๊ณ. ์ปจํ ์ด๋์์ ๋ถ์ ์คํ ๋ฐ ๋ณด๊ณ ์ ๊ฐ์ ธ์ค๊ธฐ
์ฒ์์๋ ๊ทธ๋ํฝ ์ธํฐํ์ด์ค๊ฐ ์๋ CI ์์คํ
๋ด์์ IDE(๋ฐ์คํฌํฑ ์ ํ๋ฆฌ์ผ์ด์
!)๋ฅผ ์คํํ๋ค๋ ์๊ฐ์ด ์์ฌ์ค๋ฝ๊ณ ๋งค์ฐ ๋ฒ๊ฑฐ๋ก์ ๋ณด์ผ ์ ์์ต๋๋ค. ๋คํ์ค๋ฝ๊ฒ๋ 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 ํ์ผ ํ์์ผ๋ก ๋ณด๊ณ ์๋ฅผ ๋ฐ๋ ๊ฒ์ ์ ํฌ์ ์ ๋ฐ์ ๋๋ค. ์ด์ ์ฌ๋์ด ์ฝ์ ์ ์์ด์ผ ํฉ๋๋ค. ๋ํ ๊ทธ ๊ฒฐ๊ณผ๋ ์๋ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ํ์ง ๊ธฐ์ค์ ๋ฐ๋ผ ํต๊ณผํ๋์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ๋ ผ๋ฆฌ์ธ ํ์ง ๊ฒ์ดํธ์ ์ฌ์ฉ๋์ด์ผ ํฉ๋๋ค.
์ด๊ฒ์ ์ฐ๋ฆฌ์๊ฒ ๋์์ด ๋ ๊ฒ์
๋๋ค
ํ๋ฌ๊ทธ์ธ์ ๋ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- ์๋ง์ ๋ถ์๊ธฐ ๋ฉ์์ง ์์ง๊ธฐ(
์ ์ฒด ๋ชฉ๋ก 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')]
)
}
๋ณด๊ณ ์ ์ธํฐํ์ด์ค๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด ์ธํฐํ์ด์ค๋ ์ธ์ ๊ฐ๋ฅํ ๋ชจ๋ ํ์์ ๋ํด ๋ณดํธ์ ์ด๋ผ๋ ๊ฒ์ด ํธ๋ฆฌํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ฒ์ฃผ๋ณ ๊ฒ์ ๊ฒฐ๊ณผ ๋ถํฌ์ ๋ํ ๋ํํ ์ฐจํธ์ ๊ฒ์ ํ์ ๋ณํ์ ์ญํ ๊ทธ๋ํ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ํ์ด์ง ํ๋จ์ ๊ทธ๋ฆฌ๋์์ ๋น ๋ฅธ ๊ฒ์์ ์ํํ ์ ์์ต๋๋ค. IDEA ๊ฒ์ฌ์์ ์ ๋๋ก ์๋ํ์ง ์๋ ์ ์ผํ ๊ฒ์ Jenkins์์ ์ง์ ์ฝ๋๋ฅผ ํ์ํ๋ ๊ธฐ๋ฅ์ด์์ต๋๋ค(Checkstyle๊ณผ ๊ฐ์ ๋ค๋ฅธ ๋ณด๊ณ ์์ ๊ฒฝ์ฐ ์ด ํ๋ฌ๊ทธ์ธ์ด ํ๋ฅญํ๊ฒ ์ํํ ์ ์์). ์์ ํด์ผ ํ IDEA ๋ณด๊ณ ์ ํ์์ ๋ฒ๊ทธ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
Warnings NG์ ๊ธฐ๋ฅ ์ค์๋ ์ฐธ์กฐ ์ด์
๋ธ๋ฆฌ์ ๋ํ "๋์นซ"์ ํฌํจํ์ฌ ํ๋์ ๋ณด๊ณ ์ ๋ฐ ํ๋ก๊ทธ๋จ ํ์ง ๊ฒ์ดํธ์์ ์ฌ๋ฌ ์์ค์ ๊ฒฐ๊ณผ๋ฅผ ์ง๊ณํ๋ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ์ผ๋ถ Quality Gates ํ๋ก๊ทธ๋๋ฐ ๋ฌธ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
์ด ์๋ฃ๋ฅผ ์ค๋นํ๊ธฐ ์ ์ ์ดํด๋ณด๊ธฐ๋ก ํ์ต๋๋ค. ์ด ์ฃผ์ ์ ๋ํด ์ด๋ฏธ Habrรฉ์ ๊ธ์ ์ด ์ฌ๋์ด ์์ต๋๊น? ๋๋ง ์ฐพ์์ด
๋ด๊ฐ ์๋ ํ Jenkins ๋๋ maven ํ๋ฌ๊ทธ์ธ๊ณผ์ ํตํฉ์ ์์ต๋๋ค [...] ์์น์ ์ผ๋ก ๋ชจ๋ ์ ํธ๊ฐ๋ IDEA Community Edition ๋ฐ Jenkins ์น๊ตฌ๋ฅผ ์ฌ๊ท ์ ์์ผ๋ฉฐ ๋ง์ ์ฌ๋๋ค์ด ์ด์ ์ ๋๋ฆด ์ ์์ต๋๋ค.
์, XNUMX๋ ํ ์ฐ๋ฆฌ๋ Warnings NG Plugin์ ๊ฐ์ง๊ฒ ๋์๊ณ ๋ง์นจ๋ด ์ด ์ฐ์ ์ด ์ด๋ฃจ์ด์ก์ต๋๋ค!
์ถ์ฒ : habr.com