본문으로 건너뛰기

Pre-SonarQube 로컬 검증 가이드

PR을 올리기 전 로컬에서 SonarQube 품질 검사를 사전 실행하여 Azure Pipeline 실패를 예방합니다.

워크플로

SONAR_TOKEN 발급

  1. https://sonar2.softcamp.co.kr 접속 (VPN 필요)
  2. 우상단 프로필 → My AccountSecurity
  3. Generate Tokens → 이름 입력 → Generate
  4. 발급된 토큰을 안전한 곳에 저장 (재확인 불가)
# 환경 변수로 설정 (셸 프로파일에 추가 권장)
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

스크립트 내부 동작:

  1. ./gradlew test --build-cache — 테스트 + 커버리지 리포트 생성
  2. sonar-scanner 실행 — sonar-project.properties 기반 분석
  3. Quality Gate 결과 폴링 (최대 5분)
  4. 결과 출력 및 종료 코드 반환 (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에서 실시간으로 서버 규칙 적용 위반을 확인할 수 있습니다.

  1. IntelliJ → Settings → Plugins → SonarLint 설치
  2. Settings → Tools → SonarLintConnected Mode
  3. Add connection 클릭
    • Connection type: SonarQube
    • Server URL: https://sonar2.softcamp.co.kr
    • Authentication: Token → SONAR_TOKEN 값 입력
  4. Project bindinginfolineage-api 또는 infolineage-worker 선택
  5. Update binding 클릭 → 서버 규칙 동기화

Quality Gate 기준

항목기준
신규 코드 커버리지≥ 80%
신규 코드 중복≤ 3%
신규 버그0
신규 취약점0
신규 코드 스멜 (Major 이상)0

Quality Gate는 신규 코드 기준입니다. 기존 레거시 코드의 미달은 빌드를 막지 않습니다.

자주 발생하는 위반 패턴

위반원인수정 방법
java:S1068사용하지 않는 private 필드필드 제거 또는 @SuppressWarnings
java:S2696static이 아닌 필드를 static으로 수정필드 설계 재검토
java:S3776메서드 복잡도 초과메서드 분리
java:S2259잠재적 NullPointerExceptionOptional 또는 null 체크 추가
Coverage miss테스트 미작성단위 테스트 추가