[CI/CD] SonarCloud로 정적 분석 적용

General Dong·2025년 4월 17일
1

CI/CD

목록 보기
10/12
post-thumbnail

SonarCloud

SonarCloud는 버그나 보안 취약점, 코드 스멜을 자동으로 탐지해 코드 품질을 높일 수 있게 도와주는 정적 코드 분석 도구다. 해당 도구는 설정이 간편한 클라우드 기반 서비스다.
CI/CD 파이프라인과 연동되어 코드 변경 시마다 자동 분석이 가능하다. 특히 GitHub PR Comment로 분석 결과를 확인할 수 있어 용이하다. (비슷한 SonarQube는 이 기능이 유료)

GitHub Repository 연동

먼저 SonarCloud의 계정을 생성해주자. 나는 간편하게 GitHub 아이디로 가입했다.

이후 SonarCloud에 적용하려는 GitHub Repository를 연동하자. 참고

GitHub Actions CI 설정

SonarCloud 웹 페이지에서 설정하는 프로젝트의
Administration -> Analysis Method -> Automatic Analysis로 들어가 해당 설정을 해제하자.

이 설정을 해제하는 이유는 우리는 GitHub Actions의 CI 과정에서 Gradle을 통해 커스텀한 분석 요청을 할 것이기 때문이다.

그리고 해당 페이지 아래에 With GitHub Actions를 클릭하여 다음 페이지로 들어가자

해당 페이지의 설명대로 SONAR_TOKEN이라는 이름의 GitHub Actions의 환경 변수를 추가해주자. 값은 2번에 있는 문자열을 넣으면 된다!

그 아래에 GitHub Actions의 CI 설정 파일(.yaml)에 대해서 어떻게 하면 되는지 친절히 나와있다. 간단하게 첨부하자면 아래처럼 추가하면 된다.

... (생략)

- name: SonarQube 캐싱
  uses: actions/cache@v4
  with:
  	path: ~/.sonar/cache
    key: ${{ runner.os }}-sonar
    restore-keys: ${{ runner.os }}-sonar

- name: SonarCloud 분석
  env:
  	GITHUB_TOKEN: ${{ secrets.GIT_TOKEN }}
    SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
  run: ./gradlew sonar --info --stacktrace

기존 CI 설정 파일(.yaml)에 위와 같이 SonarCloud 분석 과정을 추가하면 된다.
여기서 GIT_TOKEN은 GitHub Actions를 실행하기 위한 GitHub Token 값이 있는 환경 변수다.

Gradle 설정

위에서 열어본 페이지에서 Gradle에 대한 설정 코드도 나와있지만 나는 JaCoCo의 커버리지 결과도 출력하기 때문에 조금 더 설정을 추가했다.

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.4.0'
    id 'io.spring.dependency-management' version '1.1.6'
    id 'jacoco' // JaCoCo 플러그인
    id 'org.sonarqube' version '6.0.1.5171' // SonarQube 플러그인
    ...
}

... (생략)

def jacocoExcludePatterns = [ ... ]

sonar {
    properties {
        property "sonar.projectKey", "{SonarCloud Project Key}"
        property "sonar.organization", "{분석하는 Repository의 Organization 이름}"
        property "sonar.host.url", "https://sonarcloud.io"
        property 'sonar.sources', 'src/main/java'
        property 'sonar.tests', 'src/test/java'
        property 'sonar.language', 'java'
        property 'sonar.sourceEncoding', 'UTF-8'
        property 'sonar.test.exclusions', jacocoExcludePatterns.join(',')
        property 'sonar.test.inclusions', '**/*Test.java'
        property 'sonar.java.coveragePlugin', 'jacoco'
        property 'sonar.coverage.jacoco.xmlReportPaths', {JaCoCo Report xml 파일 경로}.asFile
    }
}

나는 커버리지를 굳이 안 올려도 되는 Config 클래스나 DTO 등을 따로 설정했다.

GitHub Branch Rulesets 설정 추가

SonarCloud를 사용하는 GitHub Repository에서
Settings -> Rules -> Rulesets -> 적용하는 브랜치 Rule -> Require status checks to pass -> Show additional settings

Add checks 버튼을 클릭하여 SonarCloud Code AnalysisSonarCloud 항목을 필수 체크 항목으로 추가하자.

만약 검색했을 때 안 뜬다면, 아직 해당 CI가 반영이 안 된 것이기 때문에, 설정 파일을 Merge 하고 나서 다시 등록하면 될 것이다!

이렇게 추가하면 SonarCloud의 분석이 실패하거나 문제가 있는 경우, Merge 할 수 없게 된다!

분석 결과

이제 PR을 올리면 아래와 같은 결과를 확인할 수 있다.

See analysis details on SonarQube Cloud라는 링크를 클릭하면 아래와 같이 더 자세한 정보를 웹 페이지에서 확인할 수 있다.

이렇게 SonarCloud의 분석 결과를 PR 단위로도 확인할 수 있다. 또한 Branch 단위로도 확인할 수 있다!

만약 Security Hotspots가 하나 이상 발견된다면 Merge 할 수 없게 막힌다.


참고

[공부정리] SonarCloud로 정적 코드 분석 | jeyong

코드의 품질 관리를 도움 받기: SonarCloud, CodeMetrics | joyfulviper

profile
개발에 대한 기록과 복습을 위한 블로그 | Back-end Developer

0개의 댓글