소개
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삭제 후 재시도