'Jenkins를 이용한 CI/CD Pipeline 구축' 강의를 참고하였습니다.
SonarQube란?
지속적인 통합(CI)과 분석을 할 때 사용되는 솔루션
코드가 가지고 있는 Issue, Defects, 코드의 복잡도를 분석해 코드가 사용할 수 있는 가용 범위와 문제점을 분석한다.
버그나 취약점을 찾고, 코드 스멜과 같이 불필요한 코드와 코드의 이상 여부를 탐지한다.
이러한 작업을 통해 코드에 대한 품질을 높여주는 용도로 사용되고 있다.
현재 진행중인 프로젝트의 코드를 분석하기 위해 SonarQube를 사용하기로 했다.
주어진 EC2의 용량이 크기 때문에 문제없이 사용 가능했다. (용량을 많이 차지해 프리티어는 사용이 어렵다고 들었다.)
프로젝트 스펙
Java 11
Spring Boot 2.7.15
Gradle 8.2.1
EC2 운영체제 : Linux x86_64
https://docs.sonarsource.com/sonarqube/8.9/requirements/prerequisites-and-overview/
SonarQube 문서를 보니, 최신 버전은 Java 11을 지원하지 않는 거 같아서, 8.9 버전을 선택했다.
스프링 부트 프로젝트에 설정 추가
https://docs.sonarsource.com/sonarqube/8.9/analyzing-source-code/scanners/sonarscanner-for-gradle/
처음에 이걸 보고 버전을 3.2.0 버전을 선택했는데
'java.io.File org.gradle.api.tasks.testing.JUnitXmlReport.getDestination()'
에러가 발생하며 되지 않았다. 검색해보니 버전을 최신 버전으로 바꾸면 된대서 버전을 최신 버전인 4.4.0.3356 버전으로 변경해주었다.
코드 분석을 원하는 스프링 부트 프로젝트의 build.gradle 파일의 plugins에 아래와 같은 코드를 추가한다.
id "org.sonarqube" version "4.4.0.3356"
현재 가장 최신 버전을 추가했다. 버전은 https://plugins.gradle.org/plugin/org.sonarqube 여기서 확인하면 된다. 가장 최신 버전이 떠있다.
EC2에 SonarQube 설치
zip 파일을 받아서 압축해제해줘야했기 때문에 unzip이 설치되어있어야 한다. 이미 설치되어있으면 생략한다.
sudo apt update
sudo apt install unzip
SonarQube 설치 파일을 다운로드 할 디렉토리를 생성한다.
설치 파일이 다운로드 될 위치는 /opt/sonarqube이다. /opt로 가서 sonarqube 디렉토리를 생성한다.
(/opt에 디렉토리를 생성하려면 sudo 권한이 필요했다. 다른 디렉토리에 한다면 sudo를 쓰지 않아도 된다.)
cd /opt
sudo mkdir sonarqube
생성한 디렉토리로 이동해 SonarQube 파일을 다운로드 받고 압축 해제한다.
그리고 sonarqube 디렉토리의 사용 권한을 ubuntu (현재 접속 중인 유저)로 변경해준다.
cd sonarqube
sudo wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-8.9.10.61524.zip
sudo unzip sonarqube-8.9.zip
sudo chown -R ubuntu:ubuntu /opt/sonarqube/
8.9.10버전을 설치했는데, 다른 버전을 설치하고 싶다면 여기서 버전 확인 후 버전 숫자를 변경해주면 된다.
https://github.com/SonarSource/sonarqube/releases
sonarQube를 사용하기 위해 디렉토리를 이동한다.
압축이 풀린 디렉토리/bin/해당하는 운영체제 디렉토리로 이동한다.
linux-x86-64 버전이기 때문에 해당 디렉토리로 이동했다.
cd sonarqube-8.9.10.61524/bin/linux-x86-64
// cd {압축해제된디렉토리}/bin/{해당하는 운영체제}
참고로 이런 디렉토리들이 있다.
아래 명령어를 이용해 SonarQube의 상태를 볼 수 있다.
./sonar.sh status
SonarQube를 실행하지 않았기에 SonarQube is not running. 라고 출력된다.
SonarQube를 실행한다.
./sonar.sh start
Starting SonarQube...
Started SonarQube.
문구와 함께 SonarQube가 실행된다.
포트 번호를 수정하지 않으면 9000번으로 열린다. EC2의 설정에서 9000번 포트를 열어준다.
SonarQube 초기 설정
초기 ID와 비밀번호는 admin / admin이다.
접속 후 바로 비밀번호 변경 창이 나오니, 기존 비밀번호(admin) 입력 후 원하는 비밀번호로 변경해준다.
로그인하면 창이 뜨는데, 오른쪽 상단의 A 버튼을 누르고 MyAccount로 이동한다.
Security를 선택하고 토큰을 발급해준다. 토큰 이름은 임의로 지정해준다.
sonar-token이라는 이름의 토큰을 생성해주었다. 토큰은 발급받을 때 한 번만 볼 수 있으니 꼭!! 메모장 같은 곳에 복사해놓아야한다.
Jenkins에 SonarQube 사용 설정
Plugins에서 SonarQube Scanner를 설치한다.
Credential에 아까 발급 받은 토큰을 저장해준다.
Kind : Screte Text
Scope : Global
Secret : {복사한 SonarQube의 토큰값}
ID : sonarqube-token (임의의 값)
Description : 생략 (임의의 값)
Jenkins관리 - System - SonarQube servers
Environment variables 체크
이름은 임의로 지정 (SonarQube-server)
Server URL : 소나큐브 주소 (EC2 주소:9000)
server authentication token : sonarqube-token(아까 등록한 credential)으로 설정 후 apply
이제 모든 설정이 끝났다.
Item에 사용해주기만 하면 된다.
Pipeline에 추가
gradle로 빌드하는 부분 다음에 SonarQube 스테이지를 추가해준다.
stage('SonarQube analysis') {
steps {
withSonarQubeEnv('SonarQube-server') {
sh './gradlew sonarqube'
}
}
}
이렇게 사용해주면 된다. withSonarQubeEnv 뒤에는 바로 위에서 설정한 Name이 들어가면 된다.
나는 gradlew이 하위 디렉토리에 있어서 디렉토리 이동 후 실행해주었다.
stage('SonarQube analysis') {
steps {
withSonarQubeEnv('SonarQube-server') {
dir('디렉토리 이름') {
sh './gradlew sonarqube'
}
}
}
}
그런데 sonarqube 커맨드를 사용하니, Console Output에 아래와 같은 문구가 떴다.
검색해서 Github를 보니, Github에서도 sonar라는 명령어를 사용하길래 sonar로 변경했다.
https://github.com/SonarSource/sonar-scanner-gradle
stage('SonarQube analysis') {
steps {
withSonarQubeEnv('SonarQube-server') {
dir('디렉토리 이름') {
sh './gradlew sonar'
}
}
}
}
SonarQube 분석이 완료되었다. 결과물은 SonarQube에 들어가서 보면 된다. (EC2 주소:9000)
프로젝트는 PASSED 했지만.. 코드 스멜이.. 187개..
(근데 대부분이 지역 변수를 var로 변경하라는 것이었다.)
프로젝트를 눌러서 자세한 코드 분석을 볼 수 있다.
근데 지역변수를 var 쓰는게 더 좋은가? 찾아봐야겠다.
여튼 이렇게 EC2에서 SonarQube를 사용해보았다!
'Study' 카테고리의 다른 글
[Spring Boot] preflight에 토큰 담겨있지 않아 인터셉터에서 걸리는 현상 (0) | 2023.07.07 |
---|