SonarQube를 활용한 코드 품질 관리 시스템 구축

소개

SonarQube는 소스 코드의 품질을 자동으로 분석하고 유지보수성을 높이는 오픈소스 플랫폼입니다. 정적 코드 분석을 통해 버그, 보안 취약점, 코드 스멜(code smell) 등을 탐지하며, CI/CD 파이프라인과 통합되어 개발 과정에서 지속적인 품질 모니터링이 가능합니다. Java, Python, C#, JavaScript 등 20여 가지 언어를 지원하며, Jenkins, GitLab, GitHub 등과 연계하여 사용할 수 있습니다.

시스템 요구 사항

  • 운영체제: CentOS 7.x
  • JDK 버전: 11 이상
  • 데이터베이스: PostgreSQL 11
  • 메모리: 최소 4GB (권장 8GB 이상)

PostgreSQL 데이터베이스 설정

SonarQube는 내장 DB를 지원하지 않으므로 외부 데이터베이스가 필요합니다. 여기서는 PostgreSQL을 사용합니다.

yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum install -y postgresql11-server postgresql11-contrib

데이터베이스 초기화:

/usr/pgsql-11/bin/postgresql-11-setup initdb

서비스 시작 및 부팅 시 자동 실행 설정:

systemctl start postgresql-11
systemctl enable postgresql-11

관리자 비밀번호 설정:

su - postgres
psql
ALTER USER postgres WITH PASSWORD 'securepass123';
\q

원격 접속 허용을 위해 설정 파일 수정:

# /var/lib/pgsql/11/data/pg_hba.conf
host    all             all             0.0.0.0/0               md5
# /var/lib/pgsql/11/data/postgresql.conf
listen_addresses = '*'

변경 후 재시작:

systemctl restart postgresql-11

전용 사용자 및 데이터베이스 생성:

su - postgres
psql
CREATE USER sonaruser WITH PASSWORD 'sonarpass';
CREATE DATABASE sonardb OWNER sonaruser;
GRANT ALL PRIVILEGES ON DATABASE sonardb TO sonaruser;
\q

시스템 최적화

Elasticsearch 기반 서비스이므로 커널 파라미터 조정이 필요합니다.

sysctl -w vm.max_map_count=262144
sysctl -w fs.file-max=65536
echo "sonarqube soft nofile 65536" >> /etc/security/limits.conf
echo "sonarqube hard nofile 65536" >> /etc/security/limits.conf

SonarQube 서버 설치

사용자 생성:

useradd -m sonarqube

다운로드 및 압축 해제:

wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-8.9.10.65466.zip
unzip sonarqube-8.9.10.65466.zip -d /opt/
mv /opt/sonarqube-* /opt/sonarqube
chown -R sonarqube:sonarqube /opt/sonarqube

데이터베이스 연결 설정:

vi /opt/sonarqube/conf/sonar.properties
sonar.jdbc.username=sonaruser
sonar.jdbc.password=sonarpass
sonar.jdbc.url=jdbc:postgresql://localhost/sonardb

JDK 경로 지정:

vi /opt/sonarqube/conf/wrapper.conf
wrapper.java.command=/usr/lib/jvm/java-11-openjdk/bin/java

시스템 서비스 등록

데몬 스크립트 생성:

ln -s /opt/sonarqube/bin/linux-x86-64/sonar.sh /usr/local/bin/sonar
vi /etc/systemd/system/sonar.service
[Unit]
Description=SonarQube service
After=syslog.target network.target

[Service]
Type=forking
User=sonarqube
Group=sonarqube
ExecStart=/usr/local/bin/sonar start
ExecStop=/usr/local/bin/sonar stop
Restart=always

[Install]
WantedBy=multi-user.target

서비스 활성화:

systemctl daemon-reload
systemctl enable sonar
systemctl start sonar

웹 인터페이스 접근

브라우저에서 http://SERVER_IP:9000 접속 후 기본 계정으로 로그인합니다.

  • 아이디: admin
  • 비밀번호: admin

첫 로그인 후 비밀번호 변경을 권장합니다.

한국어 플러그인 설치

UI를 한국어로 변경하기 위해 플러그인 추가:

wget https://github.com/SonarQubeCommunity/sonar-l10n-zh/releases/download/sonar-l10n-zh-plugin-8.7/sonar-l10n-zh-plugin-8.7.jar
cp sonar-l10n-zh-plugin-8.7.jar /opt/sonarqube/extensions/plugins/
systemctl restart sonar
참고: 현재 공식 한국어 플러그인은 없으며 중국어 플러그인을 참고하거나 직접 번역 리소스를 추가해야 합니다.

SonarScanner 클라이언트 설정

로컬 또는 CI 서버에 Scanner 설치:

wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.6.2.2472-linux.zip
unzip sonar-scanner-cli-4.6.2.2472-linux.zip -d /opt/
ln -s /opt/sonar-scanner-* /opt/sonar-scanner

환경 변수 설정:

echo 'export PATH=$PATH:/opt/sonar-scanner/bin' >> /etc/profile
source /etc/profile

글로벌 설정:

vi /opt/sonar-scanner/conf/sonar-scanner.properties
sonar.host.url=http://localhost:9000
sonar.sourceEncoding=UTF-8

코드 스캔 예제

Java 프로젝트 루트 디렉터리에 설정 파일 생성:

vi sonar-project.properties
sonar.projectKey=my-java-app
sonar.projectName=My Java Application
sonar.projectVersion=1.0
sonar.sources=src/main/java
sonar.language=java
sonar.java.binaries=build/classes
sonar.exclusions=**/test/**,**/mock/**

분석 실행:

cd /path/to/project
sonar-scanner

성공 시 SonarQube 웹 대시보드에서 결과 확인 가능합니다.

문제 해결 팁

  • 포트 충돌 시: netstat -tulnp | grep 9000
  • 로그 위치: /opt/sonarqube/logs/
  • 메모리 부족 오류 발생 시 sonar.pid 삭제 후 재시도

태그: SonarQube Static Code Analysis CI/CD PostgreSQL java

6월 20일 06:36에 게시됨