본문 바로가기

개발/CI CD

SonarQube & Jacoco

소나큐브(SonarQube) 란?

공식 문서에 따르면 소나 큐브는 시스템 적으로 클린한 코드를 전달할 수 있도록 도와주는 자체 관리, 자동 코드 리뷰 툴 이에요.

소나큐브 설치 및 실행

여기에서 다운받을 수 있습니다! 소나큐브를 다운 받아 압축을 풀고 bin 디렉토리로 들어가볼게요.

그러면 사진과 같이 운영체제 별로 실행 파일이 나뉘어져 있고, 본인의 운영체제에 따라 directory를 골라주세요. Windows의 경우 windows-x86-64 내에 StartSonar.bat을 실행하면 됩니다 :)

실행을 하고 조금 기다리면 위와 같이 Process is up, SonarQube is operational 두 문장을 확인할 수 있습니다. 그러면 기본적인 실행이 됐어요!

그리고 http://localhost:9000에 들어가보면,

로그인 창을 마주하게 됩니다. 초기 실행 시 아이디 비밀번호는 모두 admin 입니다!

소스 코드 분석

로그인을 하게 되면 프로젝트를 생성할 수 있습니다. 저는 로컬에 있는 java 프로젝트를 분석해보기 위해 Manually를 선택해볼게요.

 

project name, project key, main branch name을 입력해주고, Set up을 눌러주세요.

Locally를 선택해줍니다.

그러면 위와 같은 화면을 만나게 됩니다. 1번에서 token을 생성해요. 그리고 글쓴이는 gradle을 통해 sonarqube를 사용할 것이므로 Gradle을 선택했습니다! 프로젝트 내에 build.gradle에 해당 플러그인을 추가해주고, bash를 통해 1번에서 생성한 토큰을 가지고 해당 명령어를 실행했어요.

그러면 시간이 지나고 BUILD SUCCESSFUL을 bash 창에서 확인할 수 있습니다. 다시 웹으로 돌아가 볼까요?

그러면 위 사진과 같이 소스 코드에 대해서 sonarqube가 분석한 결과를 보여줍니다. 제 프로젝트에서는 6개의 버그가 나와 Reliability 에서 D랭크를 받았네요 :(

이제 분석된 결과를 바탕으로 소스 코드에 대한 문제점들을 고쳐서 보다 나은 sonarqube가 지향하는 clean code를 만들 수 있게 됐어요!

Jacoco 란?

JaCoCo should provide the standard technology for code coverage analysis in Java VM based environments. The focus is providing a lightweight, flexible and well documented library for integration with various build and development tools. -

Jacoco

Jacoco는 요약하자면 Java 언어로 작성된 코드의 커버리지를 체크하는 라이브러리 입니다. 즉, 만약 새로 작성한 소스코드에 대해 테스트 코드를 통해 커버리지 결과를 리포트로 확인하여 주어진 기준에 만족 여부 등을 확인할 수 있어요.

소나 큐브에 커버리지에 관한 docs를 살펴보면 소나큐브 자체는 커버리지에 관한 report를 직접 생성하지는 않는다고 명시되어 있어요. 대신 Java 프로젝트의 경우 JaCoCo를 지원한다고 되어있습니다. 그래서 한 번 소나큐브와 함께 Jacoco를 사용해보도록 할게요!

Jacoco & Sonarqube

Jacoco와 Sonarqube를 사용하기 위해서 설정할 것은 많지 않아요!

plugins {
    id "jacoco"
    id "org.sonarqube" version "3.5.0.2730"
}

jacocoTestReport {
    reports {
        xml.enabled true
    }
}

단지 위 부분을 build.gradle에 추가해주기만 하면 됩니다. 코드 커버리지에 관한 내용은 build/reports/jacoco 에 자동으로 저장되고, sonarqube 플러그인은 이 위치를 별도의 설정없이 감지한다고 해요!

설정을 완료했으니, 이제 Jacoco를 통한 Code Coverage Report를 소나큐브에서 확인할 수 있는지 실험해볼게요!

public class TestLibrary {
    public static String helloWorld(boolean flag){
        if (flag) {
            return "hello world!";
        }
        return "bye world!";
    }
}
class TestLibraryTest {
    @Test
    void helloWorldTest() {
//givenboolean flag = true;

//when
        String s = TestLibrary.helloWorld(flag);

//then
        assertThat(s).isEqualTo("hello world!");
    }
}

간단하게 flag가 true 일 때 hello world!를 출력하는 method와 그에 대한 test 한개로 소나큐브를 돌려보도록 할게요. 먼저 jacoco 없이 돌려볼게요!

테스트를 통해 코드 커버리지를 어느 정도 채웠음에도 불구하고 아직 소나큐브에서는 전혀 반영되지 않은 것을 볼 수 있어요. 다시 Jacoco와 함께 돌려보도록 할게요!

드디어 소나큐브에서 Code Coverage에 관한 정보를 확인할 수 있게 됐어요! Report에 들어가보면 커버되지 않은 line, branch, 테스트와 같은 여러 정보들을 상세하게 확인할 수 있으니 참고해주세요 :)

참고 자료


https://docs.sonarqube.org/latest/

 

SonarQube 10.1

SonarQube is a self-managed, automatic code review tool that systematically helps you deliver clean code. As a core element of our Sonar solution, SonarQube integrates into your existing workflow and detects issues in your code to help you perform continu

docs.sonarqube.org

https://www.jacoco.org/jacoco/trunk/doc/

 

JaCoCo - Documentation

Documentation Concepts See what this is all about and understand the basic ideas. Using JaCoCo Use JaCoCo tools out-of-the-box. Integrating JaCoCo Integrate JaCoCo technology with your tools. Developing JaCoCo Improve the implementation and add new feature

www.jacoco.org

 

'개발 > CI CD' 카테고리의 다른 글

Git Actions  (0) 2023.06.27
SonarQube & Jenkins  (0) 2023.06.27