Skip to content

[프로젝트 세팅] 코드 품질 검사, SonarCloud 연동하기

이은비 edited this page Jul 9, 2023 · 1 revision

Intro

에브리밀 서버에서는 코드 정적 분석 도구로 SonarCloud를 사용하기로 결정했다.

세팅 과정

  1. SonarCloud 공식 사이트로 접속해서 로그인을 한다.

이때, 본인의 깃허브 계정이나 Azure 계정으로 oauth 로그인이 가능하다.

  1. Create Organization

아래 사진과 같이 새로운 Oraginzation을 만들어준다.

image

그 후 사진에 보이는 버튼을 눌러준다.

  1. SonarCloud와 연동할 조직 선택하기
image

본인이 소속된 조직이 여러 개라면 그 중, 원하는 조직을 선택한다.

  1. 레포지토리 선택하기
image

사진과 같이 조직 내에 만들어진 레포지토리를 선택할 수 있다.

이때, 조직 내부 전체 레포지토리를 선택할 수도 있고, 단 하나의 레포지토리만을 선택할 수 있다. 서버 레포지토리만을 연동할 예정이기에 서버 레포지토리를 선택해주었다.

  1. 연동하기 ( 플랜 설정 )

조직 이름과 사용할 플랜을 결정한다. ( 본 프로젝트에서는 무료 버전을 사용할 예정이다. )

image image
  1. 레포지토리 분석 시작하기
image

사진에 보이는 버튼을 클릭한다.

  1. 조직 내부에 사전에 연동을 하기로 했던 레포지토리를 선택해준다.
image image

초기 세팅이라 분석 내용이 없다.

분석을 위한 세팅

  1. Github Actions 와 연동해서 CI에서 코드 분석을 하도록 설정한다.
image

위의 사진에서 깃허브 액션을 선택한다.

  1. 깃허브 액션 workflow 파일 작성하기
name: SonarCloud
on:
  push:
    branches:
      - develop
  pull_request:
jobs:
  sonarcloud:
    name: SonarCloud
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0
      - name: Set up JDK 17
        uses: actions/setup-java@v2
        with:
          java-version: 17
          distribution: 'zulu'
      - name: Cache Gradle packages
        uses: actions/cache@v3
        with:
          path: ~/.gradle/caches
          key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
          restore-keys: ${{ runner.os }}-gradle
      - name: Cache SonarCloud packages
        uses: actions/cache@v3
        with:
          path: ~/.sonar/cache
          key: ${{ runner.os }}-sonar
          restore-keys: ${{ runner.os }}-sonar
      - name: Build and analyze
        run: ./gradlew build sonar --info
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}

SonarCloud로 코드 품질 검사만 하는 워크 플로우이다. 아직 자코코 도입 이전 상태이기에 성공했을 때, 테스트 커버리지는 측정되지 않는다.

  1. Build.gradle 파일 수정하기
plugins {
	id 'java'
	id 'org.springframework.boot' version '3.1.1'
	id 'io.spring.dependency-management' version '1.1.0'
	id "org.sonarqube" version "4.2.1.3168" // 여기 추가하기
}

group = 'everymeal'
version = '0.0.1-SNAPSHOT'

// 이 아래 프로퍼티 추가하기
sonar {
	properties {
		property "sonar.projectKey", "everymeals_EveryMeal_Server"
		property "sonar.organization", "everymeals"
		property "sonar.host.url", "https://sonarcloud.io" // url 속성 표시!!
		property 'sonar.sources', 'src'
		property 'sonar.language', 'java'
		property 'sonar.sourceEncoding', 'UTF-8'
		property "sonar.exclusions", "**/*Application*.java" // Application 파일은 분석 대상에서 제외
	}
}

java {
	sourceCompatibility = '17'
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
	useJUnitPlatform()
}

이렇게 설정해주고 PR을 생성한다.

  1. 결과
image

마주했던 이슈

  1. sonar task 실패

깃허브 액션으로 수행하는 워크플로우 작업 중 가장 마지막 작업이 sonar이다. 이는 SonarCloud로 품질 검사를 요청한다. 서버로의 요청이 닿지 않아서 워크플로우가 계속 실패했다.

이를 해결하기 위해 아래와 같이 수정했다.

before.

sonar {
	properties {
		property "sonar.projectKey", "everymeals_EveryMeal_Server"
		property "sonar.organization", "everymeals"
		property "sonar.host", "https://sonarcloud.io"
		property 'sonar.sources', 'src'
		property 'sonar.language', 'java'
		property 'sonar.sourceEncoding', 'UTF-8'
	}
}

after.

sonar {
	properties {
		property "sonar.projectKey", "everymeals_EveryMeal_Server"
		property "sonar.organization", "everymeals"
		property "sonar.host.url", "https://sonarcloud.io" // url 속성 표시!!
		property 'sonar.sources', 'src'
		property 'sonar.language', 'java'
		property 'sonar.sourceEncoding', 'UTF-8'
	}
}
  1. Test 실패

sonarCloud 에서 품질 검사 도중 Application 파일에 대한 테스트가 이루어지지 않아 이슈가 발생했다.

sonar {
	properties {
		property "sonar.projectKey", "everymeals_EveryMeal_Server"
		property "sonar.organization", "everymeals"
		property "sonar.host.url", "https://sonarcloud.io" // url 속성 표시!!
		property 'sonar.sources', 'src'
		property 'sonar.language', 'java'
		property 'sonar.sourceEncoding', 'UTF-8'
                property "sonar.exclusions", "**/*Application*.java" // Application 파일은 분석 대상에서 제외
	}
}

위와 같이 프로퍼티를 추가함으로써 해결했다.