Pre-SonarQube 로컬 검증 가이드
PR을 올리기 전 로컬에서 SonarQube 품질 검사를 사전 실행하여 Azure Pipeline 실패를 예방합니다.
워크플로
SONAR_TOKEN 발급
https://sonar2.softcamp.co.kr접속 (VPN 필요)- 우상단 프로필 → My Account → Security 탭
- Generate Tokens → 이름 입력 → Generate
- 발급된 토큰을 안전한 곳에 저장 (재확인 불가)
# 환경 변수로 설정 (셸 프로파일에 추가 권장)
export SONAR_TOKEN=squ_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export SONAR_HOST_URL=https://sonar2.softcamp.co.kr
pre-sonar.sh 사용법
# 기본 실행 (전체 모듈)
./scripts/pre-sonar.sh
# 특정 모듈만 스캔
./scripts/pre-sonar.sh api
./scripts/pre-sonar.sh worker
# 토큰 직접 전달
SONAR_TOKEN=<token> ./scripts/pre-sonar.sh
스크립트 내부 동작:
./gradlew test --build-cache— 테스트 + 커버리지 리포트 생성sonar-scanner실행 —sonar-project.properties기반 분석- Quality Gate 결과 폴링 (최대 5분)
- 결과 출력 및 종료 코드 반환 (
0= 통과,1= 실패)
sonar-project.properties
sonar.host.url=https://sonar2.softcamp.co.kr
sonar.projectKey=infolineage-platform
sonar.projectName=InfoLineage Platform
sonar.modules=api,worker,common
# API 모듈
api.sonar.projectKey=infolineage-api
api.sonar.sources=backend/infolineage-api/src/main
api.sonar.tests=backend/infolineage-api/src/test
api.sonar.java.binaries=backend/infolineage-api/build/classes
api.sonar.java.source=25
# Worker 모듈
worker.sonar.projectKey=infolineage-worker
worker.sonar.sources=backend/infolineage-worker/src/main
worker.sonar.tests=backend/infolineage-worker/src/test
worker.sonar.java.binaries=backend/infolineage-worker/build/classes
worker.sonar.java.source=25
SonarLint Connected Mode 설정 (IntelliJ)
SonarLint를 서버에 연결하면 로컬 IDE에서 실시간으로 서버 규칙 적용 위반을 확인할 수 있습니다.
- IntelliJ → Settings → Plugins → SonarLint 설치
- Settings → Tools → SonarLint → Connected Mode 탭
- Add connection 클릭
- Connection type:
SonarQube - Server URL:
https://sonar2.softcamp.co.kr - Authentication: Token →
SONAR_TOKEN값 입력
- Connection type:
- Project binding →
infolineage-api또는infolineage-worker선택 - Update binding 클릭 → 서버 규칙 동기화
Quality Gate 기준
| 항목 | 기준 |
|---|---|
| 신규 코드 커버리지 | ≥ 80% |
| 신규 코드 중복 | ≤ 3% |
| 신규 버그 | 0 |
| 신규 취약점 | 0 |
| 신규 코드 스멜 (Major 이상) | 0 |
Quality Gate는 신규 코드 기준입니다. 기존 레거시 코드의 미달은 빌드를 막지 않습니다.
자주 발생하는 위반 패턴
| 위반 | 원인 | 수정 방법 |
|---|---|---|
java:S1068 | 사용하지 않는 private 필드 | 필드 제거 또는 @SuppressWarnings |
java:S2696 | static이 아닌 필드를 static으로 수정 | 필드 설계 재검토 |
java:S3776 | 메서드 복잡도 초과 | 메서드 분리 |
java:S2259 | 잠재적 NullPointerException | Optional 또는 null 체크 추가 |
| Coverage miss | 테스트 미작성 | 단위 테스트 추가 |