IT/기타

[SonarQube] Java, Kotlin, JavaScript(TypeScript) 정적 분석, 커버리지 분석

땅일단 2023. 9. 1. 00:06

SonarQube를 Docker로 설치하는 방법은 아래 포스트를 참고해주세요.

 

 

[Docker] 도커 이미지(Image) 다운로드 및 컨테이너(Container) 생성/실행/삭제하기(feat. SonarQube)

[Docker] 도커의 개념, linux에서 도커 설치 1. 도커(Docker)란? 컨테이너 기반의 가상화(하나의 하드웨어를 여러 개의 가상 머신으로 분할하는 것) 플랫폼. 프로그램 실행에 필요한 모든 프로그램 파일

doringri.tistory.com

중요해서 볼드체로 표시합니다.

이전 포스트에도 설명되어 있는 부분이지만, Java 8을 분석해야 한다면 꼭 8.9.0버전 이하의 소나큐브를 다운받으셔야 합니다. Java 8 이후의 버전은 latest 버전의 소나큐브를 다운받아주시면 됩니다.

 

이런 실정이라... 저는 Java 8과 Java 17 버전이 모두 존재하는 회사 솔루션들을 검증하느라 8.9.0 버전과 latest 버전의 소나큐브 컨테이너를 둘다 만들었습니다. ㅠ

 

 

0. 코드 분석 사전 준비

  (1) 메인에서  Add Project  버튼 클릭하여 새로운 프로젝트 생성

  (2) Project key (나중에 환경 변수로 쓰임) SonarQube에 보여질 이름 결정

  (3) 생성할 token의 이름을 정하고 버튼을 누르면 토큰이 생성됨(나중에 환경 변수로 쓰임)

  (4) 여기까지 했다면 프로젝트 생성이 완료되고 입력한 정보에 따른 환경 변수 정보를 볼 수 있음

1. Java 8 정적 분석 방법

  (1) build.gradle에 환경 변수 추가

plugins {
   id 'org.sonarqube' version '3.0'
}
sonarqube {
   properties {
      property "sonar.projectKey", "projectKey 입력"
      property "sonar.host.url", "http://192.168.0.44:83"
      property "sonar.login", "생성되었던 토큰 입력"
   }
}

  (2) 터미널 > 프로젝트 루트 폴더에서 ./gradlew sonar

 

 

1.1. Java 8에서 코드 커버리지 분석 방법

- Jacoco: 코드 커버리지 분석을 위해 필요한 라이브러리

 

  (1) build.gradle에 환경 변수 추가

plugins {
   id 'jacoco'
}
sonarqube {
   properties {
      property "sonar.tests", "src/test/java"
      property "sonar.coverage.jacoco.xmlReportPaths", "${buildDir}/reports/jacoco/test/jacocoTestReport.xml"
      property "sonar.java.binaries", "${buildDir}/classes"
      property "sonar.test.inclusions", "**/*Test.java"
   }
}

  (2) Jacoco 라이브러리를 통해 만들어진 xml로 커버리지를 분석하므로 xml report를 만들도록 설정

test {
   useJUnitPlatform()

   finalizedBy 'jacocoTestReport'
}

jacoco {
   toolVersion = '0.8.5'
}

jacocoTestReport {
   reports {
      html.enabled true
      xml.enabled true
      csv.enabled false
   }

  (3) 터미널 > 프로젝트 루트 폴더에서 ./gradlew test 하면 xml 생성됨

  (4) ./gradlew sonar

 

2. Kotlin(Java 17) 정적 분석 및 커버리지 분석 방법

  (1) build.gradle.kts에 세팅

plugins {
    id("org.sonarqube") version "4.2.1.3168"
    id("jacoco")
}

tasks.withType<Test> {
    useJUnitPlatform()
    finalizedBy("jacocoTestReport")
}

sonarqube {
    properties {
        property("sonar.projectKey", "projectKey 입력")
        property("sonar.projectName", "project이름 입력")
        property("sonar.host.url", "http://192.168.0.44:84")
        property("sonar.token", "생성되었던 토큰 입력")
        property("sonar.tests", "src/test/kotlin")
        property("sonar.coverage.jacoco.xmlReportPaths", "${buildDir}/reports/jacoco/test/jacocoTestReport.xml")
        property("sonar.java.binaries", "${buildDir}/classes")
        property("sonar.test.inclusions", "**/*Test.kt")
    }
}

jacoco {
    toolVersion = "0.8.8"
}

tasks.jacocoTestReport {
    reports {
        html.required.set(true)
        xml.required.set(true)
        csv.required.set(false)
    }
}

  (2) Gradle Tasks를 1, 2순으로 클릭하여 명령어 실행

(1: Jacoco 리포트 파일 생성, 2: SonarQube 정적 분석)

 

 

3. JavaScript(+TypeScript) 정적 분석 방법

  (1) 터미널에서 npm install sonarqube-scanner --save-dev 명령어로 설치

  (2) 프로젝트 루트 경로에 report.js 파일을 만들고, 이 파일에 환경 변수 추가

const sonarqubeScanner = require("sonarqube-scanner");

sonarqubeScanner(
  {
    options: {
      "sonar.projectKey": "projectKey 입력",
      "sonar.host.url": "http://192.168.0.44:83",
      "sonar.login": "생성되었던 토큰 입력"
    }
  },
  () => process.exit()
)

module.exports = sonarqubeScanner;

  (3) package.jsonreport.js 등록

"scripts": {
  "sonar": "node report.js"
}

  (4) 터미널에서 npm run sonar 로 실행

 

 

3-1. JavaScript(+TypeScript)에서 코드 커버리지 분석 방법

  (1) ng test --code-coverage 명령어를 통해 lcov.info 파일 생성

  (2) report.js 파일에 lcov.info 파일의 경로를 환경 변수로 추가

sonarqubeScanner(
    {
        options: {
            "sonar.javascript.lcov.reportPaths": "/coverage/프로젝트명/lcov.info"
        }
    },

  (3) npm run sonar