반응형
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 만 선택될 수 있도록 변경한다.
반응형
'사이드 프로젝트' 카테고리의 다른 글
[CI/CD 프로젝트] K8S - kubeadm으로 Kubernetes Cluster 구축하기 (0) | 2024.11.19 |
---|---|
[CI/CD 프로젝트] K8S - Containerd 내부 구조 이해 (0) | 2024.11.19 |
[CI/CD 프로젝트] Terraform을 사용하여 bastion 서버 생성하기 (0) | 2024.11.19 |
[CI/CD 프로젝트] Git와 GitOps 아키텍처의 이해 (0) | 2024.11.19 |
[인프라 구축]AWS 사용 시 Identity Center로 여러 계정을 SSO로 관리하기 (0) | 2024.03.25 |