본문 바로가기
사이드 프로젝트

[CI/CD 프로젝트] SonarQube 사용한 코드품질 향상

by 간장공장공차장 2024. 11. 19.
반응형

SonarQube

  • SonarQube는 소스 코드의 품질을 분석하고 코드의 버그, 코드 스멜, 보안 취약점을 찾아내는 정적 분석 도구
  • 주요 기능: 코드 리뷰 자동화, 품질 게이트 설정, 기술 부채 감소 지원.

SonarQube 아키텍처

  • Scanner: 소스 코드를 분석하는 클라이언트.
  • Server: 분석 결과를 저장하고 대시보드로 보여주는 중앙 서버.
  • Database: 분석 결과와 프로젝트 메타데이터를 저장.

SonarQube / Sonarlint는 아래와 같은 기준을 가지고 정적 분석을 진행한다.

  • 제품품질 메트릭
    • 규모 관련(라인, 주석비율, 함수별 라인수)
    • 복잡도 관련
      • 순환 복잡도 : 제어 흐룸에 따라 1 , case, while, for, if (10이하)
      • 인지 복잡도 : 중첩문 빈도
    • 테스트 관련
    • 룰 기반 분석 관련
    • 결함 관련
    • 의존성 관련
    • 출시 관련

실습

💡이번 실습에서는, sonarqube를 설치하고 spring boot project에 대한 정적분석을 진행해본다.

SonarQube 설치하기

sonarqube는 내장DB로도 동작이 되지만, postgreSQL와 연동하여 동작하는 것을 권장하고 있기 때문에, 공식적으로 배포해주는 docker-compose파일을 통해 설치한다.

먼저 EC2에 docker를 설치해준다.

sudo yum install docker -y
sudo systemctl start docker

## ec2-user가 docker를 사용할 수 있도록 변경
sudo usermod -a -G docker ec2-user

## 실행 권한 부여
sudo chmod 666 /var/run/docker.sock 
  • docker-compose 설치
## docker-compose 다운
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

## 명령어 실행 권한 부여
sudo chmod +x /usr/local/bin/docker-compose

## 파이썬 관련 lib 설치
sudo yum install libxcrypt-compat
  • docker-compose로 설치

해당 docker-compose파일은 1.27버전 이상에서 동작하므로 최신 버전의 docker-compose를 다운받는 것에 유의한다.

services:
  sonarqube:
    image: sonarqube:community
    hostname: sonarqube
    container_name: sonarqube
    read_only: true
    depends_on:
      db:
        condition: service_healthy
    environment:
      SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
      SONAR_JDBC_USERNAME: sonar
      SONAR_JDBC_PASSWORD: sonar
    volumes:
      - sonarqube_data:/opt/sonarqube/data
      - sonarqube_extensions:/opt/sonarqube/extensions
      - sonarqube_logs:/opt/sonarqube/logs
      - sonarqube_temp:/opt/sonarqube/temp
    ports:
      - "9000:9000"
    networks:
      - ${NETWORK_TYPE:-ipv4}
  db:
    image: postgres:15
    healthcheck:
      test: ["CMD-SHELL", "pg_isready"]
      interval: 10s
      timeout: 5s
      retries: 5
    hostname: postgresql
    container_name: postgresql
    environment:
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonar
      POSTGRES_DB: sonar
    volumes:
      - postgresql:/var/lib/postgresql
      - postgresql_data:/var/lib/postgresql/data
    networks:
      - ${NETWORK_TYPE:-ipv4}

volumes:
  sonarqube_data:
  sonarqube_temp:
  sonarqube_extensions:
  sonarqube_logs:
  postgresql:
  postgresql_data:

networks:
  ipv4:
    driver: bridge
    enable_ipv6: false
  dual:
    driver: bridge
    enable_ipv6: true
    ipam:
      config:
        - subnet: "192.168.2.0/24"
          gateway: "192.168.2.1"
        - subnet: "2001:db8:2::/64"
          gateway: "2001:db8:2::1"
docker-compose up -d

위 명령어를 통해 파일을 실행하면 정상적으로 sonarqube가 설치된 것을 볼 수 있다.

  • sonarqube 접근을 위해 inbound 보안 그룹을 편집해준다.

  • 인스턴스 유형

SonarQube는 Elastisearch와 함께사용되기 때문에 최소 RAM 3GB이상인 인스턴스 유형을 사용하는 것을 권장한다.

추가로, Elastisearch는 vm.max_map_count를 262144 이상을 사용할 수 있어야한다. 그렇지 않으면 sonarqube가 설치되었다 바로 내려가기 때문에 변경하여 설정하여야한다.

sudo nano /etc/sysctl.conf # 영구 설정 
vm.max_map_count=262144

or

sudo sysctl -w vm.max_map_count=262144 # 임시 설정

위와 같이 그대로 설치 시 65530으로 설치되어있기 때문에 이 커널 파라미터를 조정하도록 한다.

  • sonarqube 로그인

초기 세팅 : admin / admin

이후 비밀번호를 변경하는 창이 뜬다.

  • 프로젝트 연결

  • Use the global setting

  • Analyze your project

아래 token을 생성하여 프로젝트 연결 시에 사용하는 토큰을 생성한다.

mvn clean verify sonar:sonar \
  -Dsonar.projectKey=ssh-demo \
  -Dsonar.projectName='ssh-demo' \
  -Dsonar.host.url=http://3.39.238.174:9000 \
  -Dsonar.token=sqp_2bbe34c8c6aadad91c96d36c69abafad918c0eeb
  • gradle로 빌드하기 위해 build.gradle에 아래 플러그인을 추가해준다. (Spring Project 내 build.gradle)

plugins {
  id "org.sonarqube" version "5.1.0.4882"
}
  • code가 있는 곳에서 sonarqube 실행해본다.
./gradlew sonar \
  -Dsonar.projectKey=ssh-demo \
  -Dsonar.projectName='ssh-demo' \
  -Dsonar.host.url=http://13.125.81.101:9000 \
  -Dsonar.token=sqp_2bbe34c8c6aadad91c96d36c69abafad918c0eeb
  • 모두 수행이 완료되면 아래와 같이 정적 테스트가 완료된 화면이 나온다.
    아주 간단한 코드를 분석하여 모두 통과가 된 것을 볼 수 있다.

  • 정적 테스트의 내용을 커스터마이징 하고싶다면, Quality Profile에 접근 후 profile copy를 먼저 진행한다.

  • 새로운 Profile 생성

  • 이후 원하는 Rules 만 선택될 수 있도록 변경한다.

반응형