SonarQube
프로그램 정적 분석 도구로, 실행 없이 코드를 분석하는 것
SonarQube 설치
- docker-compose를 이용해 설치하는 방법
- sonarqube를 사용하기 위해서는 PostgreSQL DB가 필요
- sonarqube를 실행하기 전, postgresql에서 sonar 유저와 DB 생성 필요
- docker-compose.yml
sonarqube:
image: sonarqube:community
ports:
- "9000:9000"
container_name: sonarqube
depends_on:
- postgres
environment:
SONAR_JDBC_URL: jdbc:postgresql://postgres:5432/${DATABASE}
SONAR_JDBC_USERNAME: ${DB_USERNAME}
SONAR_JDBC_PASSWORD: ${DB_PASSWORD}
SONAR_WEB_CONTEXT: /sonar
volumes:
- sonarqube_data:/opt/sonarqube/data
- sonarqube_extensions:/opt/sonarqube/extensions
- sonarqube_logs:/opt/sonarqube/logs
networks:
- infra
postgres:
image: postgres:13
container_name: postgresql
environment:
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: ${DATABASE}
networks:
- infra
volumes:
- postgresql:/var/lib/postgresql
- postgresql_data:/var/lib/postgresql/data
...
volumes:
sonarqube_data:
sonarqube_extensions:
sonarqube_logs:
postgresql:
postgresql_data:
SonarQube - Nginx
- nginx를 설정할 때, sonar.web.context 기본 설정이 "/" 이므로 docker-compose.yml 이를 변경해주어야 함
location /sonar {
proxy_pass https://sonarqube:9000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
SonarQube 와 Jenkins 연동
- SonarQube 사이트에 정상적으로 접근 되었을 때, 프로젝트 생성
- administration → security → users → token 생성 ⇒ 사용자로 토큰 생성
Jenkins 설정
- plugins → SonarQube Scanner for Jenkins
- 위에 sonarqube에서 받은 token을 creditionals에서 secret text로 등록
- Jenkins 관리 → System
- SonarQube servers 에서 Envirionment variables 체크
- name 설정
- server url 설정 → nginx 한 경로
- 위에서 creditional 토큰이 나타나면 그걸 등록
- Jenkins 관리 → Tool
- SonarQube Scanner Installations
- Name 설정
- version 자동 생성되므로 하나 선택해서 설정
Spring Boot 적용
plugins {
id "org.sonarqube" version "4.4.1.3373"
}
sonar {
properties {
property "sonar.projectKey", "{프로젝트 생성 이름}"
property "sonar.projectName", "{앱이름}"
}
}
stage('Compile and SonarQube Analysis') {
steps {
script {
withSonarQubeEnv('{SonarQube 서버에서 등록한 이름}') {
dir("./backend") {
sh "chmod +x gradlew"
sh "./gradlew clean compileJava sonarqube -Dsonar.gradle.skipCompile=true"
}
}
}
}
}
React 적용
- sonar-project.properties 파일 생성
- sonar.projectKey={프로젝트 이름} 추가
- pipeline 추가
stage('SonarQube Analysis') {
def scannerHome = tool '{SonarQube Tools에서 등록한 Scanner 이름}';
withSonarQubeEnv('{SonarQube 서버에서 등록한 이름}') {
sh "${scannerHome}/bin/sonar-scanner"
}
}
SonarQube 분석
처음 화면
- 오른쪽 pass는 quality gate status로, pass or faile을 통해 프로젝트 상태를 확인가능
- 아래 하단은 코드 분석 요약
- Security: 보안성 규칙 - 해커가 악용할 수 있는 코드에 대한 규칙이거나 CWE, SANS Top 25, OWASP Top 10을 근간으로 하는 규칙인가
- Reliability: 신뢰성 규칙 - 명백하게 틀린 규칙이거나 잘못된 코드에 대한 규칙인가
- Maintainability: 유지보수성 - 규칙이 신뢰성도 아니고 보안성도 아닌 경우
- Hotspots Reviewed: 주의가 필요한 잠재적인 보안 이슈
- Duplications: 코드 중복
Overview
- 특정 프로젝트를 이동하면, 프로젝트 분석 결과 출력
- Overview, Issue, Security Hotsspots, Measures, Code, Activity 6개의 메뉴로 구성
Quality Gate Status
- Pass or Fail (통과여부)에 따라 프로젝트의 상태를 쉽게 확인 가능
- Passed가 아닌 경우 문제를 일으킨 측정항목 및 통과에 필요한 값들을 즉시 확인 가능
OverallCode
- 주요 지표에 대한 합계를 최근 분석과 전체로 구분하여 보여줌
- 해당 지표를 클릭하면 수정해야 할 상세 내용을 출력
Issues
- 모든 이슈 사항을 확인 가능
- 왼쪽의 필터를 통해 원하는 이슈만 찾아 볼 수 있음
- Severity : 심각도 - 프로젝트 분석을 위해서 규칙들의 집한인 Quality Profile을 사용하며 적용된 규칙이 얼마나 심각하고 중요한지를 나타냄
코드 뷰어
- 이슈를 클릭하면 상세페이지로 이동하여 코드 뷰어가 보임
- 문제의 내용을 보여주고 해결을 위한 가이드 제공
- 상단에는 해당 파일의 분석 지표를 요약해서 보여주며, 문제가 발생한 라인이 어디인지 상세 내용으로 표시
- Why is this an Issue 클릭시 이슈 이유 제공
- How can I fix it? 은 이슈를 해결할 방안 제시
- Activity: 이슈를 만든 활동
- 중복 코드 발생시 좌측의 코드 라인 옆에 회식 수직 라인으로 표시되며, 회색라인을 클릭하면 중복된 파일과 라인 정보가 나타남
Security Hotspot
Measures
- Reliablility, Security, Duplications 등 다양한 관점의 분석 결과를 주요 지표와 그래프로 보여주며, 해당 문제의 상세 페이지로 이동하는 드릴 다운 기능 제공
Code
- 프로젝트의 디렉토리 구조와 실제 코드
- 디렉토리나 파일별 주요 지표 확인 가능
Activity