์†Œ์Šค ์ฝ”๋“œ ๋ถ„์„ํ•˜๊ธฐ

SQ Official Doc Link:ย https://docs.sonarqube.org/display/SCAN

Table of Contents

SonarQube ํ”Œ๋žซํผ ์„ค์น˜๋ฅผ ์™„๋ฃŒํ•œ ๊ฒฝ์šฐ, Analyzer๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ„์„์„ ํ•˜๊ธฐ ์ „์— SonarQube ํ”„๋กœ์ ํŠธ ์„ค์ •์„ ๋จผ์ € ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์—๋Š” ํ”„๋กœ์ ํŠธ ์„ค์ •์„ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํ”„๋กœ๋น„์ ธ๋‹ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ„์„ ๋ฒ”์œ„: ํŒŒ์ผ ์ข…๋ฅ˜ ๋ฐ ๋ฐ์ดํ„ฐ

SonarQube๋Š” 20๊ฐ€์ง€ ์ด์ƒ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ๋ถ„์„ํ•ด์„œ ํ’ˆ์งˆ ๋ฉ”ํŠธ๋ฆญ์„ ์ƒ์„ฑํ•˜๊ณ  ์ด์Šˆ(์ฝ”๋”ฉ ํ‘œ์ค€ ์œ„๋ฐ˜ ํ•ญ๋ชฉ)๋ฅผ ๊ฒ€์ถœํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๋ถ„์„ ๊ฒฉ๊ณผ๋Š” ๋ถ„์„ ๋Œ€์ƒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ๋”ฐ๋ผ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ถ„์„์„ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ๋Œ€ํ•ด, SonarQube๊ฐ€ ์ง€์›ํ•˜๋Š” SCM ์ œ๊ณต์ž๋กœ๋ถ€ํ„ฐ "blame" ์ •๋ณด๋ฅผ ์ž๋™ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค. Git, SVN์€ ๊ธฐ๋ณธ ์ง€์›์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ SCM ์ œ๊ณต์ž ์‚ฌ์šฉ์‹œ ์ถ”๊ฐ€๋กœ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ถ„์„์„ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ๋Œ€ํ•ด, ์†Œ์Šค ์ฝ”๋“œ์˜ ์ •์  ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค(Java ํŒŒ์ผ, COBOL ํ”„๋กœ๊ทธ๋žจ ๋“ฑ).
  • ๋ถ„์„์„ ์ง€์›ํ•˜๋Š” ํŠน์ • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ํ•œํ•ด, ์ปดํŒŒ์ผ ๋œ ์ฝ”๋“œ์˜ ์ •์  ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค(Java์˜ .class ํŒŒ์ผ, C#์˜ .dll ํŒŒ์ผ ๋“ฑ).
  • ๋ถ„์„์„ ์ง€์›ํ•˜๋Š” ํŠน์ • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ํ•œํ•ด, ๋™์  ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋Š” ํŒŒ์ผ๋“ค

SonarQube๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ํ”Œ๋Ÿฌ๊ทธ์ธ(์ฆ‰, ์ฝ”๋“œ ๋ถ„์„ ์—”์ง„)์ด ์ธ์‹ํ•˜๋Š” ํŒŒ์ผ๋งŒ์„ ๋ถ„์„ ๊ณผ์ •์—์„œ ํ”„๋กœ์ ํŠธ๋กœ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, SonarQube ์ธ์Šคํ„ด์Šค์— Java์™€ JavaScript ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์„ค์น˜๋˜์–ด ์žˆ๋‹ค๋ฉด .java ํŒŒ์ผ๊ณผ .jsp ํŒŒ์ผ์€ ๋กœ๋“œํ•˜์ง€๋งŒ .xml ํŒŒ์ผ์€ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ…์ŠคํŠธ ํŒŒ์ผ์„ ๋กœ๋“œํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, SonarQube์—์„œ Settings > Exclusions > FIles > Import unknown files๋ฅผ true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค..

๋ถ„์„์„ ์ง„ํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ

SonarQube ์„œ๋ฒ„๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ , ๋ถ„์„ ์—”์ง„์— ์ œ๊ณต๋œ ํŒŒ์ผ์„ ๋ถ„์„ํ•˜๋ฉฐ, ๋ถ„์„ ๊ฒฐ๊ณผ ์ •๋ณด๋Š” ๋ณด๊ณ ์„œ์˜ ํ˜•ํƒœ๋กœ ์„œ๋ฒ„์— ๋‹ค์‹œ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.๋Š” ๋ณด๊ณ ์„œ์˜ ํ˜•ํƒœ๋กœ ์„œ๋ฒ„๋กœ ๋‹ค์‹œ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ์ „์†ก๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ๋ถ„์„ ๋ณด๊ณ ์„œ๋Š” ํ์— ๋‹ด๊ฒจ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฏ€๋กœ, SonarQube ์„œ๋ฒ„์˜ ๋กœ๊ทธ์— ๋ถ„์„์ด ์™„๋ฃŒ๋œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋˜๋”๋ผ๋„ ์‹ค์ œ ๋ถ„์„ ๊ฒฐ๊ณผ๊ฐ€ SonarQube์— ํ‘œ์‹œ๋˜๊ธฐ๊นŒ์ง€๋Š” ์•ฝ๊ฐ„์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ด๋ฆ„ ์˜†์— ๋ณ„๋„์˜ ์•„์ด์ฝ˜์ด์œผ๋กœ ํ˜„์žฌ ์–ด๋–ค ๊ณผ์ •์ด ์ˆ˜ํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์•„์ด์ฝ˜์— ๋งˆ์šฐ์Šค ์ปค์„œ๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ ์ ˆํ•œ ๊ถŒํ•œ์„ ๊ฐ€์ง„ ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธํ•œ ๊ฒฝ์šฐ, ์•„์ด์ฝ˜์„ ํด๋ฆญํ•ด ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค)

ํ”„๋กœ์„ธ์Šค๋ฅผ ์™„๋ฃŒํ•œ ๋’ค ์•„์ด์ฝ˜์€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๋ถ„์„์ด ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ ์•„์ด์ฝ˜์€ ์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค:

๋ถ„์„ ๊ณผ์ • ์ค‘ ํ”„๋กœ์„ธ์Šค์™€ ๊ด€๋ จ๋œ ์„ธ๋ถ€ ๋‚ด์šฉ์€ Background Tasks๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

๋ถ„์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ

๊ฐ€์žฅ ๋จผ์ €, ๋ถ„์„ ๋Œ€์ƒ ์†Œ์Šค ์ฝ”๋“œ์™€ ๊ด€๋ จ๋œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์ง์ ‘ ๋‹ค์šด๋กœ๋“œ ํ›„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค๋ฅผ ํ†ตํ•ด ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • SonarQube Scanner: ์ปค๋งจ๋“œ ๋ผ์ธ์—์„œ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • SonarQube Scanner for MSBuild: .Net ํ”„๋กœ์ ํŠธ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • SonarQube Scanner for Ant: Ant ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • SonarQube Scanner for Maven: Maven ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค
  • SonarQube Scanner for Gradle: Gradle ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.
  • SonarQube Scanner For Jenkins: Jenkins์—์„œ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

SonarQube๊ฐ€ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ ์•ˆํ‹ฐ ๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์„ ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์•ˆํ‹ฐ ๋ฐ”์ด๋Ÿฌ์Šค ์Šค์บ๋„ˆ๋กœ ์ธํ•ด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SonarCloud ์‚ฌ์šฉ์ž์ด์‹ญ๋‹ˆ๊นŒ?

SonarCloud ๋ฐย TravisCIย ์‚ฌ์šฉ์ž๋Š” Travis Add-On์„ ํ™œ์šฉํ•ด ์ตœ์†Œํ•œ์˜ ์„ค์ •๋งŒ์œผ๋กœ SonarCould๋กœ ์†Œ์Šค ์ฝ”๋“œ ๋ถ„์„๊ฒฐ๊ณผ๋ฅผ ํ”ผ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.ย https://docs.travis-ci.com/user/sonarqube/๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋” ๋งŽ์€ ์ •๋ณด

์•„๋ž˜ ๋‚ด์šฉ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.:

ยฉ 2017-2018 Moses Kim.

๋ณ„๋„์˜ ์–ธ๊ธ‰์ด ์—†๋Š” ํ•œ, ์ด ์ŠคํŽ˜์ด์Šค์˜ ์ปจํ…์ธ ๋Š” ํฌ๋ฆฌ์—์ดํ‹ฐ๋ธŒ ์ปค๋จผ์ฆˆ ์ €์ž‘์žํ‘œ์‹œ-๋น„์˜๋ฆฌ-๋™์ผ์กฐ๊ฑด๋ณ€๊ฒฝํ—ˆ๋ฝ 4.0 ๊ตญ์ œ ๋ผ์ด์„ ์Šค์— ๋”ฐ๋ผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
SONARQUBE๋Š” SonarSource SA์˜ ํŠธ๋ ˆ์ด๋“œ ๋งˆํฌ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ํŠธ๋ ˆ์ดํŠธ ๋งˆํฌ ๋ฐ ์ €์ž‘๊ถŒ์€ ๊ฐ ์†Œ์œ ์ž์˜ ์†Œ์œ ๋ฌผ์ž…๋‹ˆ๋‹ค.

::: SonarQube ๊ด€๋ จ ๋ฌธ์˜ : ์ด๋ฉ”์ผ :::