[DevOps] SonarQube

young-gue Park·2024년 3월 27일
0

DevOps

목록 보기
10/13
post-thumbnail

⚡ SonarQube


📌 SonarQube란?

🔷 소프트웨어의 품질을 지속적으로 관리하기 위한 오픈 소스 플랫폼

  • 코드의 버그를 찾고, 취약점을 식별하며, 코드 스멜(Code Smells)을 감지하는 데 탁월하다.
  • 코드의 복잡성을 분석하고 유지보수성을 측정하여 개선할 수 있는 방향을 제시한다.
  • 다양한 프로그래밍 언어를 지원하며, 연속적 통합(Continuous Integration, CI) 환경에 쉽게 통합될 수 있다.

💡 코드 스멜(Code Smells)
소프트웨어 코드에서 발견할 수 있는 문제점이나 나쁜 설계 패턴을 가리키는 용어로, 코드 자체에는 바로 잘못이 없지만, 향후 유지보수를 어렵게 만들거나 코드의 잠재적 결함을 초래할 수 있는 신호
ex) 너무 많은 기능이 하나의 클래스에 집중되어 있거나, 중복된 코드, 불필요하게 복잡한 조건문, 읽기 어려운 코드 등


📌 Why SonarQube?

🥬 진행중인 상권분석 및 추천서비스

1. 코드 품질 향상

  • SonarQube를 통해 정적 코드 분석을 자동화함으로써 버그를 사전에 감지하고, 코드 스멜을 줄이며, 결국 더 깨끗하고 안정적인 코드를 작성할 수 있게 되었다.

2. 보안 강화

  • 보안 취약점을 식별하고 해결함으로써, 서비스의 안전성을 강화할 수 있었다.
  • 이는 사용자 데이터의 보안을 유지하는 데 필수적인 부분.

3. 유지보수 용이성

  • SonarQube의 가독성 있는 대시보드를 통해 기술 부채를 모니터링하고 관리할 수 있게 되었다.
  • 이는 장기적으로 시스템의 유지보수를 더욱 용이하게 한다.

4. 팀워크 및 협업 향상

  • 코드 품질에 대한 명확한 지표들을 공유함으로써 팀 내 커뮤니케이션이 활성화되고, 팀원들이 보다 일관된 코딩 표준을 유지하도록 격려했다.

5. 지속적인 통합

  • Gradle 파일로 관리되는 Spring Boot와 함께 SonarQube를 통합함으로써, 각각의 빌드에서 코드 품질을 자동으로 체크할 수 있게 되었다.
  • 이는 개발 과정을 더욱 효율적이고 신속하게 만들어주었다.

📌 SonarQube 실행하기

🔷 개발이 완료된 코드를 DevOps 플랫폼에 보내고, CI 도구를 통해 단위 테스트를 확인, 빌드 및 실행 한 뒤에 SonaQube Scanner가 그 결과를 분석한다. 결과는 피드백과 함께 소나큐브 서버에 게시된다.

❗ 필자의 Docker는 EC2 인스턴스 내에 이미 위치해있다.

1. Docker를 이용하여 sonarqube를 설치하기

sudo docker pull sonarqube

sudo docker run -d --restart=always \ 
-e TZ=Asia/Seoul \ 
--name sonarqube -p 9001:9000 \ 
sonarqube

# 복사용
sudo docker run -d --restart=always -e TZ=Asia/Seoul --name sonarqube -p 9001:9000 sonarqube

혹여나 portainer를 설치했다면 9000번 포트가 겹치기 때문에 호스트를 9000이 아닌 다른 것(여기선 9001)으로 수정한다. portainer의 호스트 포트 번호를 수정해도 상관없다. 방화벽 허용은 언제나 잊지 말자.

2. SonarQube GUI 상에서 프로젝트를 생성하기

  • http://[설치한 컴퓨터의 IP 주소]:9001 에 접속한다.

💡 기본 계정은 id와 password 모두 'admin'이다.

  • 프로젝트를 생성한다. (필자는 깃랩을 선택)

  • 프로젝트 이름과 키를 작성한다. branch명도 원하는 것으로 작성할 수 있다.

  • 오른쪽 상단 프로필을 눌러 security로 들어간 다음 토큰을 발급받는다.

3. Jenkins와 연동하기

❗ 필자는 도커로 설치하여 이미 깃랩과 연동되어있는 젠킨스를 활용한다. 로컬에서 사용하고 싶다면 이 링크를 참고.

1) Jenkins 관리 > 플러그인 관리에서 SonarQube Scanner for Jenkins를 찾아 설치

2) Sonar Scanner 설정

3) Jenkins 관리 > Manage Credentials > (global) > Add Credentials > Secret Text로 kind 지정 후 아까 생성한 SonarQube 토큰을 Secret란에 입력한다. (ID는 식별될만한 것으로 임의로 작성)

4) Jenkins 관리 > 시스템 설정 > SonarQube servers에서 이름(프로젝트가 아닌 서버 이름이라 아무거나 지어도 상관 없음)을 적고 SonarQube 서버 URL(9000포트)과 만들어둔 Secret text 토큰을 넣는다.

5) 파이프라인 안에 코드를 작성한다. (백엔드 프로젝트가 있는 경로로 이동)

stage('SonarQube analysis') {
       steps {
           withCredentials([string(credentialsId: 'sangchu3', variable: 'SONAR_TOKEN')]) {
               dir("${SPRING_PROJECT_DIR}") {
                   withSonarQubeEnv('sangchu') {
                       sh """
                           ./gradlew sonar \
                             -Dsonar.gradle.skipCompile=true \
                             -Dsonar.projectKey=Sangchu \
                             -Dsonar.projectName='Sangchu' \
                             -Dsonar.host.url=http://[Domain or localhost]:9001 \
                             -Dsonar.login=${SONAR_TOKEN}
                       """
                   }
               }
           }
      }
 }

언제나 초록불이 켜질 때의 쾌감은 이루 말할 수 없다.

6) SonarQube 페이지로 이동하여 분석 결과를 확인한다.

해당 분석사항들을 기반으로 리팩토링 후 다시 분석을 하면 어느 정도 지적이 줄어든다. (옆에 Failed가 뜬건 기분탓이다.)


마무리하며...

SonarQube의 도입은 단순히 코드의 품질을 개선하는 것에서 그치지 않는다. 이는 보다 안정적이고, 보안이 강화된, 그리고 유지보수가 용이한 소프트웨어로 나아가는 길이다. 프로젝트에 있어 이는 근본적인 변화를 가져왔고, 지속 가능한 개발을 위한 중요한 발판이 되었다.

profile
Hodie mihi, Cras tibi

0개의 댓글