SonarCloud는 버그나 보안 취약점, 코드 스멜을 자동으로 탐지해 코드 품질을 높일 수 있게 도와주는 정적 코드 분석 도구다. 해당 도구는 설정이 간편한 클라우드 기반 서비스다.
CI/CD 파이프라인과 연동되어 코드 변경 시마다 자동 분석이 가능하다. 특히 GitHub PR Comment로 분석 결과를 확인할 수 있어 용이하다. (비슷한 SonarQube는 이 기능이 유료)
먼저 SonarCloud의 계정을 생성해주자. 나는 간편하게 GitHub 아이디로 가입했다.
이후 SonarCloud에 적용하려는 GitHub Repository를 연동하자. 참고
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에 대한 설정 코드도 나와있지만 나는 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 등을 따로 설정했다.
SonarCloud를 사용하는 GitHub Repository에서
Settings -> Rules -> Rulesets -> 적용하는 브랜치 Rule -> Require status checks to pass -> Show additional settings
Add checks
버튼을 클릭하여 SonarCloud Code Analysis
와 SonarCloud
항목을 필수 체크 항목으로 추가하자.
만약 검색했을 때 안 뜬다면, 아직 해당 CI가 반영이 안 된 것이기 때문에, 설정 파일을 Merge 하고 나서 다시 등록하면 될 것이다!
이렇게 추가하면 SonarCloud의 분석이 실패하거나 문제가 있는 경우, Merge 할 수 없게 된다!
이제 PR을 올리면 아래와 같은 결과를 확인할 수 있다.
See analysis details on SonarQube Cloud
라는 링크를 클릭하면 아래와 같이 더 자세한 정보를 웹 페이지에서 확인할 수 있다.
이렇게 SonarCloud의 분석 결과를 PR 단위로도 확인할 수 있다. 또한 Branch 단위로도 확인할 수 있다!
만약 Security Hotspots가 하나 이상 발견된다면 Merge 할 수 없게 막힌다.