-
Notifications
You must be signed in to change notification settings - Fork 0
[프로젝트 세팅] 코드 품질 검사, SonarCloud 연동하기
이은비 edited this page Jul 9, 2023
·
1 revision
에브리밀 서버에서는 코드 정적 분석 도구로 SonarCloud를 사용하기로 결정했다.
- SonarCloud 공식 사이트로 접속해서 로그인을 한다.
이때, 본인의 깃허브 계정이나 Azure 계정으로 oauth 로그인이 가능하다.
- Create Organization
아래 사진과 같이 새로운 Oraginzation을 만들어준다.
그 후 사진에 보이는 버튼을 눌러준다.
- SonarCloud와 연동할 조직 선택하기
본인이 소속된 조직이 여러 개라면 그 중, 원하는 조직을 선택한다.
- 레포지토리 선택하기
사진과 같이 조직 내에 만들어진 레포지토리를 선택할 수 있다.
이때, 조직 내부 전체 레포지토리를 선택할 수도 있고, 단 하나의 레포지토리만을 선택할 수 있다. 서버 레포지토리만을 연동할 예정이기에 서버 레포지토리를 선택해주었다.
- 연동하기 ( 플랜 설정 )
조직 이름과 사용할 플랜을 결정한다. ( 본 프로젝트에서는 무료 버전을 사용할 예정이다. )
- 레포지토리 분석 시작하기
사진에 보이는 버튼을 클릭한다.
- 조직 내부에 사전에 연동을 하기로 했던 레포지토리를 선택해준다.
초기 세팅이라 분석 내용이 없다.
- Github Actions 와 연동해서 CI에서 코드 분석을 하도록 설정한다.
위의 사진에서 깃허브 액션을 선택한다.
- 깃허브 액션 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로 코드 품질 검사만 하는 워크 플로우이다. 아직 자코코 도입 이전 상태이기에 성공했을 때, 테스트 커버리지는 측정되지 않는다.
- 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을 생성한다.
- 결과
- 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'
}
}
- 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 파일은 분석 대상에서 제외
}
}
위와 같이 프로퍼티를 추가함으로써 해결했다.