Post

SonarQube

Pull Request decoration 기능?

이런 기능 (구버전)

sonar-github-plugin-1.4.1.822.jar 1.81MB

SonarQube 서버 report 저장 기능?

이런 기능

  • 유료(Developer Edition)이 아니면, 어떤 브랜치에 대고 돌린 분석이든 모두 master로 들어감.
    • 그래서 같은 projectKey로 브랜치 여러개에 소나 리포트 설정 하게 되면 분석이 섞인다. - projectKey를 브랜치 마다 다르게 설정하여 해결 할 수 있다.
    • 유료 버전에서는 브랜치 별로 리포트 기록을 따로 관리 할 수 있다.

설치 및 초기 설정

PostgreSQL 설치
  • conf에서 설정 안해주면 임시로 H2를 사용하도록 되어 있는데, H2는 테스트 용으로만 사용해야 함(당연)
  • 당연히 DB 쓰는게 좋고.. PostgreSQL이 오픈소스이므로 권장. (OracleXE는 개발 용으로만 사용 가능하고 상업 용도로 사용 불가)
  • PostgreSQL 설치
  • 설치 후 계정 만들고 sonarqube 라는 DB 하나 만들면 끝.
Jenkins 연동
  • SonarQube에서 jenkins_token이라는 이름으로 토큰 발급 받고…
  • jenkins - system configuration에서 토큰 사용하여 소나큐브 서버 연결해주고
  • 플러그인 설치 탭에서 SonarQube Scanner 설치
  • Global Tool Configuration에서 SonarQube Scanner installations 설정. ( 따로 직접 설치할 필요 없이 이렇게 설치 가능 )
  • 반대로 소나큐브에서도 WebHook에 젠킨스 주소 등록 (분석 결과 jenkins로 노티하면, jenkins 빌드에 해당 소나큐브 리포트 링크가 걸린다.)
    • Administration-Configuration-Webhooks : {url}/sonarqube-webhook/
Jenkins에서 SonarQube 트리거하기
  • https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-jenkins/
  • 결국 젠킨스에서 Command line으로 SonarScanner를 트리거 하냐, Maven으로 트리거 하냐, Gradle로 트리거 하냐 그 차이임.
  • 관리는 Jenkins Pipeline으로 할 수도 있고, Freestyle 잡으로 할 수도 있는데… 이건 젠킨스 종속적인거라 상관 없음.
  • 이번 케이스는 각 레포지토리 maven, gradle에 sonarscanner 관련 설정을 넣기 보단 command line으로 젠킨스에서 트리거 하도록 함.
    • 이 방법도 괜찮긴 한데… sonar.java.libraries 를 명시하려면 m2 전체를 명시하든가 해야한다는 점은 단점. 뭐 그냥 libraries 옵션 안줘도 그닥 나쁘진 않을 듯.
  • Analyzing other project types 섹션과

https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/를 참고.

PR 댓글 알림 주기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
## must be unique in a given SonarQube instance
sonar.projectKey={my}:{key}


## Path is relative to the sonar-project.properties file. Defaults to .
sonar.sources=.


## 예전에는 .java 파일만 가지고 정적 분석을 수행했는데, 이제는 .class 파일도 필요하다. 그래서 sonar.java.binaries 지정해주어야 하고,
## Scanner 잡 이전에 build 잡을 넣어주어 .class를 생성해주어야 한다.
sonar.java.binaries=./target/classes


## defaults to 'not provided'
#sonar.projectVersion=1.0


## Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8


## --- GitHub Plugin PR decoration settings ---
sonar.github.endpoint=https://example.github.enterprise.url/api/v3
sonar.github.repository=${ghprbGhRepository}
sonar.github.pullRequest=${ghprbPullId}
sonar.github.oauth=${githubAccessToken}
sonar.analysis.mode=preview    # 어차피 뭘로 설정하건 무료버전에선 서버에 안남는다.

sonar.github.disableInlineComments=true

  • Jenkins 잡이 어떤 소나큐브 프로젝트와 연결될지는 sonar.projectKey로 결정된다.
SonarQube에 리포팅하기
1
2
3
4
5
6
7
8
## must be unique in a given SonarQube instance
   sonar.projectKey={my}:{key}
   sonar.sources=.
   sonar.java.binaries=./target/classes
   #sonar.projectVersion=1.0
   sonar.sourceEncoding=UTF-8

Jenkins에도 Coverage, Checkstyle 있는데? Sonar에서 하는게 낫나 Jenkins에서 하는게 낫나?

Sonar가 나음. 1. PR 시 github 댓글로 Coverage 정보 등을 바로 쏴준다. Jenkins에 있는건 들어가서 봐야해서… 뭔가 잘 안보게 되는 경향이 있음.

  1. Sonar가 UI도 더 깔끔하고, Coverage의 점진적 변화를 그래프형태로 볼 수 있어서 여러모로 더 낫다.

참고

https://mangkyu.tistory.com/229- 최신 유료버전에서 무료 플러그인으로 해당 기능 사용하기 22.10.12 최근에는 정적 분석 툴로 codeql 기반의 codescanner도 사용하는 것 같은데 (github), 지원 언어, 분석 능력 관점에서 소나큐브가 아직 우위에 있는 것으로 보인다.

This post is licensed under CC BY 4.0 by the author.