SonarQube(소나큐브)는 20개 이상의 프로그래밍 언어를 지원하는 정적 분석 도구이다.
코드를 분석하여 버그, 보안 취약성, 코드 커버리지, 코드 복잡도 등을 리포팅해주며 Jenkins, GitHub, GitLab 등 CI 도구와 결합하여 사용할 수 있다. 소나큐브는 19개 언어에 대하여 커뮤니티 버전(무료)을 제공하고 있기 때문에 충분히 사용성 검토를 해본 후 필요에 따라 라이센스를 구독해보는 것도 좋을 것 같다. (라이센스 정보는 이 링크 참고.)
소나큐브는 크게 3가지로 구성되어 있다.
코드를 분석하는 엔진 서버이다.
브라우저를 통해 접속할 수 있도록 웹 서버도 제공하며 분석된 데이터를 DB에 저장하는 역할을 한다.
소나큐브의 설정 값(플러그인 세팅, 보안 등) 또는 정적 분석 결과 값을 저장하는데 필요하다.
MySQL, Oracle, PostgreSQL 등 RDB만 지원한다.
소나큐브 서버(SonarQube Server)에 분석할 소스코드를 업로드하는 역할을 한다.
보통은 Jenkins 같은 CI 빌드 서버에 플러그인 형태로 설치하곤 한다.
CI 서버에 결합하기 전에 로컬에서 돌려보기 위해 설치한 과정은 다음과 같다.
소나큐브 공식 홈페이지에서 제공하는 zip 파일을 다운받아 설치해도 되지만 나는 docker를 활용하여 설치했다. 작성한 docker-compose.yml 파일은 다음과 같다.
services:
sonarqube:
image: sonarqube:lts-community
ports:
- '39270:9000'
networks:
- sonarnet
container_name: sonarqube
environment:
- sonar.jdbc.url=jdbc:postgresql://postgres:5432/sonar
- sonar.jdbc.username=admin
- sonar.jdbc.password=admin
volumes:
- sonarqube_data:/opt/sonarqube/data
- sonarqube_extensions:/opt/sonarqube/extensions
- sonarqube_logs:/opt/sonarqube/logs
postgres:
image: postgres:14.2
ports:
- '35432:5432'
networks:
- sonarnet
container_name: postgres
environment:
- POSTGRESQL_USER=admin
- POSTGRESQL_PASSWORD=admin
volumes:
- postgresql:/var/lib/postgresql
- postgresql_data:/var/lib/postgresql/data
networks:
sonarnet:
driver: bridge
volumes:
sonarqube_data:
sonarqube_extensions:
sonarqube_logs:
postgresql:
postgresql_data:
로컬 호스트의 39270 포트로 들어오면 초기 ID/PW 입력 화면이 등장한다.
admin / admin 입력 후 패스워드를 변경하여 로그인 절차를 완료해준다.
로그인 절차를 완료하면 프로젝트 생성 화면이 등장한다.
CI 서버와 연계하여 프로젝트를 생성해도 되고 수동으로 로컬의 프로젝트를 생성할 수도 있다. 나는 로컬에서 실행할 것이기 때문에 수동으로 프로젝트를 생성해주었다.
프로젝트를 생성하면 소나큐브 실행을 위한 토큰 생성 화면이 등장한다.
생성한 토큰은 소나큐브 스캐너를 통해 소스코드를 업로드할 때 활용된다.
토큰까지 생성되었다면 정적 분석을 실행할 로컬 프로젝트 경로로 이동한다.
경로 이동 후 스캐너를 실행하여 소스코드를 업로드하고, 정적 분석이 완료될 때까지 잠시 대기한다.
docker run --rm --net host -e SONAR_HOST_URL="http://127.0.0.1:39270" -v ${PWD}:/usr/src sonarsource/sonar-scanner-cli -Dsonar.projectName={프로젝트명} -Dsonar.projectKey={프로젝트키} -Dsonar.sonar.sourceEncoding=UTF-8 -Dsonar.sonar.host.url=http://127.0.0.1:39270 -Dsonar.sources=/usr/src -Dsonar.login={토큰}
결과를 확인한다.
결과 리포팅 가이드 : 링크