이 문서는 소나큐브를 활용한 코드 분석에 대해 설명합니다.
개요
SonarQube는 프로젝트의 메인 브랜치를 분석할 수 있으며, Developer Edition부터는 여러 브랜치와 풀 리퀘스트도 분석할 수 있습니다.
SonarScanner를 사용한 코드 분석
SonarScanner는 소스 코드 분석을 수행하는 독립 실행형 프로그램으로, CI/CD 호스트에서 실행되며 분석 결과를 SonarQube 서버로 전송합니다.
SonarQube 서버는 결과를 계산하고 품질 게이트(Quality Gate)를 산출하며 리포트를 생성합니다.
SonarScanner는 설치 시 SonarQube 서버에서 필요한 언어 분석기를 다운로드하여 사용합니다.
SonarQube는 Gradle, Maven, .NET, NPM, Python 등의 빌드 시스템과 통합된 SonarScanner를 제공하며, 기타 프로젝트의 경우 SonarScanner CLI를 사용해 수동 설정으로 분석을 수행할 수 있습니다.
분석 과정
SonarQube의 기본적인 분석 과정은 다음과 같습니다.
- CI 파이프라인이나 빌드 프로세스가 SonarScanner를 시작합니다.
- SonarScanner는 로컬 저장소를 스캔하고 설정된 분석 범위에 따라 분석할 파일을 결정합니다.
- SonarScanner는 요청을 언어 분석기에 전달하고, 언어 분석기는 파일을 가져와 구성된 품질 프로필에 따라 분석을 수행합니다.
- 분석 결과(품질 측정 및 이슈)는 SonarScanner로 전달되고, SonarScanner는 이를 SonarQube서버에 보고서 형태로 전송합니다.
- SonarQube 서버는 다음을 수행하기 위해 비동기적으로 분석 결과를 계산합니다.
- 구성된 새 코드 정의에 따라 새로운 이슈를 식별하고 표시
- 품질 게이트 계산
- 리포트 생성
기본적으로 SonarQube의 에디션이 인식할 수 있는 파일만 분석 대상에 포함됩니다.
예를 들어, Community Edition은 Java와 JavaScript를 지원하므로 .java
와 .js
파일은 분석하지만, C++은 지원하지 않으므로 .cpp
파일은 무시됩니다.
CI 파이프라인에 통합
CI 파이프라인에 SonarQube 분석을 통합하면 프로젝트에 다음과 같은 분석 기능을 사용할 수 있습니다.
- 메인 브랜치 분석
- (Developer Edition 이상부터) 풀 리퀘스트 분석, 여러 브랜치 분석
SonarQube를 통합한 CI 파이프라인 단계는 다음과 같습니다.
- 개발자가 원격 저장소(Remote repository)에 브랜치에 변경 사항을 push합니다.
- 특정 브랜치에 대한 CI 파이프라인이 트리거됩니다.
이를 위해 소스 제어 관리(SCM) 시스템에서 이벤트가 발생할 때 웹훅을 사용하거나 Jenkins와 같은 CI/CD 도구로 리포지토리를 모니터링할 수 있습니다. - 파이프라인은 원격 저장소를 클론하고, CI/CD 호스트의 로컬 저장소에 관련 브랜치를 체크아웃합니다.(코드와 SCM 메타데이터가 복사됩니다.)
- 컴파일된 프로그래밍 언어의 경우 파이프라인이 코드를 빌드합니다.
- 파이프라인은 적절한 Sonar Scanner를 실행하여 코드를 분석합니다.
- SonarScanner는 분석 결과를 SonarQube 서버로 전송하고,SonarQube 서버는 이를 처리합니다.
- (선택 사항) 서버는 품질 게이트 결과를 CI 파이프라인에 전달합니다.
- 파이프라인은 품질 게이트를 통과하면 계속 진행되고, 실패하면 중단됩니다.
분석 시점에 스캐너 엔진 및 분석기 다운로드
SonarScanner는 스캐너 부트스트래퍼(scanner bootstrapper)로,
분석 시점에 SonarQube Server로부터 스캐너 엔진과 언어 분석기(language analyzers)를 자동으로 다운로드합니다.
이 방식은 다음과 같은 이점을 제공합니다:
- 스캐너 엔진과 분석기의 버전이 SonarQube Server와 항상 호환되도록 보장합니다.
- 프로젝트에서 실제로 사용된 언어에 필요한 분석기만 선택적으로 다운로드하여 효율적인 분석이 가능합니다.
분석 프로세스 요약
- 빌드 또는 CI 파이프라인이 SonarScanner를 실행합니다.
- SonarScanner는 SonarQube Server에 연결하여 사용할 스캐너 엔진 버전을 확인합니다.
- 먼저 로컬 캐시에 해당 엔진 버전이 있는지 확인하고,
- 없으면 SonarQube Server에서 다운로드한 후 캐시에 저장합니다.
- 스캐너 엔진은 프로젝트의 코드를 스캔하여 어떤 언어들이 사용되었는지 식별합니다.
- 스캐너 엔진은 분석에 필요한 언어 분석기를 캐시에서 확인하고,
- 없을 경우 SonarQube Server에서 필요한 분석기를 다운로드하여 캐시에 저장한 후 사용합니다.