본문 바로가기

SonarQube (소나큐브)/SonarQube 설치

Helm을 활용한 Sonarqube 설치

# SonarQube를 pod로 설치하고 서비스를 실행하는 작업에 대해 알아본다.

1. SonarQube란?

소나큐브는 20개 이상의 프로그래밍 언어에서 버그, 코드 스멜, 보안 취약점을 발견할 목적으로 
정적 코드 분석으로 자동 리뷰를 수행하기 위한 지속적인 코드 품질 검사용 오픈 소스 플랫폼이다.

- SonarQube화면 예시 (위키피디아)

- SonarQube는 jenkinsfile에 정의하며 정의된 내용에 따라 jenkinsfile에서 docker이미지로 생성시 아래와 같이 스프링부트 코드를 분석후 결과를 기록한다.

2. Helm으로 Sonaqube 설치하기

- Helm Code Clone 하기

URL : https://github.com/metleeha/k8s-helm-sonarqube.git

 

GitHub - metleeha/k8s-helm-sonarqube: Sonarqube installation guide on kubernetes using helm chart

Sonarqube installation guide on kubernetes using helm chart - GitHub - metleeha/k8s-helm-sonarqube: Sonarqube installation guide on kubernetes using helm chart

github.com

- git clone 하기

git clone https://github.com/metleeha/k8s-helm-sonarqube.git

- 소나큐브를 설치할 네임스페이스 생성

kubectl create ns sonar-demo

- PstgreSQL PersistentVolume/PersistentVolumeClaim 생성

3. PostgreSQL PV 생성

clone한 git 폴더에서 postgre/pv.yaml을 열어서 아래 부분을 수정 한다.

pv생성시 사용하는 pv명은 demo-postgre-pv 로 prefix만 수정한다.

파일을 vim으로 열어보면 아래와 같다.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: demo-postgre-pv # modify
  namespace: sonar-demo # modify
  labels:
    type: postgre
spec:
  storageClassName: postgre
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 10Gi
  hostPath:
    path: "/bitnami/postgresql"

- 적용한다.

적용 명령어 : kubectl apply -f pv.yaml

pv를 확인해보면 아래와 같다. 정상적으로 생성된것을 확인 할 수 있다.

$ kubectl get pv -A
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                                                 STORAGECLASS      REASON   AGE
demo-postgre-pv                            10Gi       RWO            Retain           Available                                                         postgre                    7s

4. PostgreSQL PVC 생성

복제한 git 폴더에서 postgre/pvc.yaml을 열어서 아래 부분을 수정 한다.
pv생성시 사용하는 pv명은 demo-postgre-pv 로 prefix만 수정한다.

파일을 vim으로 열어보면 아래와 같다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: demo-postgre-pvc # modify
  namespace: sonar-demo # modify
  labels:
    type: postgre
spec:
  storageClassName: postgre
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

- 적용한다.

적용명령어 : kubectl apply -f pvc.yaml

적용 후 pvc를 확인해보면 아래와 같다. 정상적으로 생성된 것을 확인 할 수 있다.

kubectl get pvc -n sonar-demo
NAME               STATUS   VOLUME            CAPACITY   ACCESS MODES   STORAGECLASS   AGE
demo-postgre-pvc   Bound    demo-postgre-pv   10Gi       RWO            postgre        67s

5. Sonarqube PersistentVolume/PersistentVolumeClaim 생성

- Sonarqube PV 생성
복제한 git 폴더에서 sonarqube/pv.yaml을 열어서 아래 부분을 수정 한다.
pv생성시 사용하는 pv명은 demo-sonarqube-pv 로 prefix만 수정한다.

vim 파일을 열어보면 아래와 같다.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: demo-sonarqube-pv
  namespace: sonar-demo
  labels:
    type: sonarqube
spec:
  storageClassName: sonarqube
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 10Gi
  hostPath:
    path: /opt/sonarqube

적용 명령어 : kubectl apply -f pv.yaml

생성한 pv를 확인하면 아래와 같다.

kubectl get pv -A
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                                                 STORAGECLASS      REASON   AGE
demo-sonarqube-pv                          10Gi       RWO            Retain           Available                                                         sonarqube                  43s

- Sonarqube PVC 생성

복제한 git 폴더에서 sonarqube/pvc.yaml을 열어서 아래 부분을 수정 한다.
pv생성시 사용하는 pv명은 demo-sonarqube-pv 로 prefix만 수정한다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: demo-sonarqube-pvc
  namespace: sonar-demo
  labels:
    type: sonarqube
spec:
  storageClassName: sonarqube
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi

적용 명령어 : kubectl apply -f pvc.yaml

생성한 pvc를 확인하면 아래와 같다.

kubectl get pvc -n sonar-demo
NAME                 STATUS   VOLUME              CAPACITY   ACCESS MODES   STORAGECLASS   AGE
demo-sonarqube-pvc   Bound    demo-sonarqube-pv   10Gi       RWO            sonarqube      20s

6. 생성한 pv와 pvc를 namespace 기준으로 조회해보자.

명령어 : kubectl get pvc,pv -n sonar-demo

결과는 아래와 같다. pv와 pvc를 각각 쌍으로 생성한것을 확인 할 수 있다.

kubectl get pvc,pv -n sonar-demo
NAME                                       STATUS   VOLUME              CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/demo-postgre-pvc     Bound    demo-postgre-pv     10Gi       RWO            postgre        11m
persistentvolumeclaim/demo-sonarqube-pvc   Bound    demo-sonarqube-pv   10Gi       RWO            sonarqube      3m11s

NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                                 STORAGECLASS      REASON   AGE
persistentvolume/demo-postgre-pv                            10Gi       RWO            Retain           Bound    sonar-demo/demo-postgre-pvc                           postgre                    16m
persistentvolume/demo-sonarqube-pv                          10Gi       RWO            Retain           Bound    sonar-demo/demo-sonarqube-pvc                         sonarqube                  7m13s

7. Helm을 이용해 Sonarqube 설치

- helm version 확인

helm version
version.BuildInfo{Version:"v3.10.1", GitCommit:"9f88ccb62c900000000000", GitTreeState:"clean", GoVersion:"go1.18.7"}

- helm repo update

helm repo update

- ./postgre/경로의 리소스 → helm으로 postgreSQL 설치 실행

helm repository를 추가 : helm repo add bitnami https://charts.bitnami.com/bitnami

- postgreSQL 설치
helm 이름을 수정.

demo-postgre 의 prefix만 수정.(중요)
persistence.existingClaim 의 값을 생성한 pvc로 수정.

demo-postgre-pvc 에서 prefix만 수정.(중요)
namespace를 수정.(중요)
3개의 정보를 규칙에 따라 수정 하였으면, 다시 한번 수정된 내용을 확인하고 콘솔창에서 수정한 명령을 실행한다.

helm install demo-postgre stable/postgresql \
--set persistence.existingClaim=demo-postgre-pvc \
--set persistence.enabled=false  \
--set postgresqlUsername=sonarUser  \
--set postgresqlPassword=sonarPass  \
--set postgresqlDatabase=sonarDB  \
--namespace sonar-demo

정상 설치가 되면 아래와 같은 화면이 출력된다.

- ./sonarqube/ helm 으로 Sonarqube 설치 실행

리파지토리 추가, helm 리파지토리를 추가한다.

helm repo add oteemo https://oteemo.github.io/charts/

sonarqube 설치
helm 이름을 수정.

demo-sonarqube의 prefix만 수정.(중요)
postgresql.postgresqlServer 의 값을 수정.

demo-postgre-postgresql 에서 prefix만 수정.(중요)
namespace를 수정.(중요)

서비스 타입을 로드밸런서로 수정 후 실행한다.
3개의 정보를 규칙에 따라 수정 하였으면, 다시 한번 수정된 내용을 확인하고 콘솔창에서 수정한 명령을 실행 한다.

helm install demo-sonarqube oteemo/sonarqube \
--set postgresql.postgresqlServer=demo-postgre-postgresql  \
--set service.type=LoadBalancer  \
--set postgresql.enabled=false  \
--set postgresql.postgresqlUsername=sonarUser  \
--set postgresql.postgresqlPassword=sonarPass  \
--set postgresql.postgresqlDatabase=sonarDB  \
--namespace sonar-demo

- 정상적으로 생성 시 아래와 같은 화면이 출력 된다.

9. Sonarqube 설치 확인 및 로그인

- clone 받은 git 소스에서 아래와 같이 권한을 부여한다.

chmod 750 show_url.sh

- 아래의 명령어로 접속정보, 계정, 패스워드를 출력한다. id와 패스워드를 확인한다.

./show_url.sh sonar-demo
Sonarqube url is http://ip-10-0-129-131.ap-northeast-2.compute.internal:
ID is admin
admin passwd is admin

10. 소나큐브 웹 접속하기

위에서 LoadBalancer 타입으로 서비스를 생성 하였으므로, 기반 로드밸런서 타입인 CLB로 서비스가 생성되어 있을 것이다. 로드밸런서 탭으로 이동하여 DNS 주소를 확인한다.

ELB DNS 주소:9000으로 접속하면 아래와 같은 로그인 화면을 볼 수 있다.

접속하기, 위에서 아이디와 비밀번호를 확인 하였고, 해당 정보를 기반으로 접속하면 아래와 같다.

지금까지 helm을 이용하여 Sonaqube를 실행하는 과정을 알아 보았다.

CI/CD 구현 시 Sonarqube를 활용한 정적 분석을 진행해 보자.