SonarQube를 이용한 코드리뷰 해보기

2019-11-27

이전 회사에서 적용했던 sonaqube에 대해 정리한 내용이 있어서
블로그에 옮긴다.

SonarQube?

SonarQube는 Java, C #, JavaScript, TypeScript, C / C ++, COBOL 등 20 개 이상의 프로그래밍 언어에서 버그, 코드 냄새? (code smells) 및 보안 취약성을 탐지하기 위해 코드의 정적 분석을 통해 자동 검토를 수행하는 오픈 소스 플랫폼입니다.
프로그램의 실제 실행 없이 코드를 분석하는 것

Why

돌아가기만 하면 되는 코드’는 개발자에게도, 프로젝트에도 전혀 도움이 되지 않습니다. 잘못된 코드는 또다른 잘못된 코드를 양상하고, 떨어지는 가독성과 높아지는 복잡도 덕분에 프로젝트 코드는 시간이 지남에 따라 점점 이해하기 힘든 모습이 되어갑니다. 개발자는 더 많은 노력과 시간이 필요해 지고, 프로젝트는 언제 터질지 모르는 폭탄을 품고 살아가게 됩니다.

때문에 프로그래밍에서도 잘못된 자세를 지적해 주고 제대로 개발 할 수 있도록 이끌어줄 방법들이 필요합니다. 개발자의 필수 도서라 불리는 책들은 몇번을 읽어도 손해 볼게 없습니다.

애자일 진영에서 강조하는 페어 프로그래밍, 몹 프로그래밍이나 코드 인스펙션 활동들 역시 좋은 대안이 될 수 있습니다. 이러한 문화를 이끌어 줄 수 있는 멘토가 있다면 빠른 시간내 코드의 품질이 좋아질 수 있습니다.
문제는 ‘사람 == 시간 == 돈’ 이기 때문에 제대로 된 개발을 위해서는 그만큼 많은 비용이 필요할 수 밖에 없습니다.

결국, 이러한 부분에 대한 고민 끝에, 비용이 추가로 들지 않으면서 코드의 품질을 검토하고 잘못된 부분을 옳은 방향으로 고칠 수 있도록 멘토링하는 다양한 도구들이 만들어졌습니다.

SonarQube

SonarQube 플랫폼은 4개의 컴포넌트로 구성

SonarQube Server

3가지의 메인 프로세스를 구동

SonarQube Database

SonarQube의 기본 설정들(보안, Plugin 정보 등)과 프로젝트 분석 스냅샷들을 저장합니다. 설치시, 기본으로 H2 DB를 포함하며, 설정을 통해 다양한 DB 사용이 가능합니다

SonarQube Plugin

내부에서 사용하는 다양한 기능(분석 프로그램언어, 권한, 관리, SCM등)을 플러그인 형태로 설치 가능합니다.

SonarQube Scanner

프로젝트 정적 분석을 수행하는 툴로 다양한 형식으로 제공되며 CI Server와 연계하여 사용이 가능합니다.

SonarQube Integration

image02

  1. 개발자는 IDE에서 코드를 작성하고, Sonar Lint등을 통해 로컬에서 코드 분석을 실행합니다.
  2. 개발자는 분석을 통해 수정된 완성코드를 SCM으로 Push 합니다.
  3. CI 서버에서 트리거된 빌드 수행시 SonarQube Scanner를 실행합니다.
  4. SonarQube Scanner는 생성한 분석 리포트의 처리를 위해 SonarQube로 전송합니다.
  5. SonarQube Server는 분석 리포트 결과를 처리하여 DB에 저장하고 결과를 웹서버를 통해 제공합니다.
  6. 개발자는 웹페이지에서 분석결과를 확인하여 코드를 개선합니다.
    관리자는 결과 보고서를 받습니다.
  7. SonarQube에서 데이터를 추출하기위해 API를 활용하거나 SonarQube Server 모니터링을 위해 JMX를 사용할 수 있습니다

설치

Maven 설치

기본적으로 Maven의 H2DB를 사용 > SonarQube를 설치하기 전에 Maven부터 설치 해줘야 한다

SonarQube 설치

파일을 받아서 압축을 해제하면 끝

1
2
3
4
5
mkdir sonar-qube
cd sonar-qube
wget https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-6.7.5.zip

unzip sonarqube-6.7.5.zip

SonarQube Start

1
2
cd sonarqube-6.7.5/bin/linux-x86-64
./sonar.sh start

기본적으로 9000포트를 사용하고 있으니 다른 포트를 사용하려면 sonar.properties 수정하면된다.

SonarQube Scanner 설치

1
2
3
wget https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.0.3.778-linux.zip

unzip sonar-scanner-cli-3.0.3.778-linux.zip

Jenkins 연동

Jenkins 설치는 Skip

Jenkins Pluggin 설치

SonarQube Scanner for Jenks 의 경우 Jenkins 버전체크를 해줘야 한다.
image03

플러그인 설치가능 목록에 안나오는 경우가 있으니 이런 경우 아래 url 에서 Archives 를 받아서 올려도됨
https://plugins.jenkins.io/sonar
image04

Jenkins SonarQube server 정보 등록

server url 정보에 sonarQube 서버 url 을 넣는다
image05

Server authentication token

Server authentication token 은 sonarQube를 접속해서 admin (password : admin) 으로 접속하면 아래 화면처럼 생성 할 수 있다.
image06

Jenkins SonarQube scanner 정보 등록

jenkins > configure tools
image07

Github과 Jenkins 연동

SKIP

어떻게 써볼까요?

Jenkins Build (with SonarQube)

Jenkins Sonar-scanner
Jenkins 에서 build 시 Sonar-scanner 설정법
image08

Pull Request (with SonarQube)

image09
해당 구조를 사용하기 위해선 GitHub WebHook사용과 Jenkins에 2개의 Job이 필요하다

SonarLint (IntelliJ)

위와 같은 방법으로 SonarQube를 사용한다면…
코드를 작성하고 commit / push 이후에나 정적분석 피드백을 받을 수 있다.

Install

Setting > plugins > Search in repositories
SonarLint 검색
image10

SonarQube 서버 연동

기본적인 설정만으로도 충분히 사용할 수 있으며 sonarqube 서버가 없어도 사용에 문제가 없습니다.
setting > Other Settings > SonarLing General Settings
image11

참고

https://www.sonarqube.org/about/
http://lazyrodi.github.io/2017/02/06/2017-02-06-etc-install-sonarqube/
https://medium.com/@cgpink/소스-정적-분석도구-sonarqube-리서칭-9d48fc62b01f
https://www.popit.kr/내코드를-자동으로-리뷰해준다면-by-sonarqube/