SonarQube로 Quality Gate 설정해보기
정적 분석 도구인 SonarQube를 설치 및 활용하여 Quality Gate 정책을 설정을 해보려고 한다.
Quality Gate란?
Quality Gate는 코드 품질을 평가하기 위한 기준을 설정하는 도구이다. 이를 통해 코드 분석 결과를 기반으로 품질 기준을 만족하는지 여부를 자동으로 판별할 수 있다.
CI/CD 파이프라인에 Quality Gate를 도입하면 코드의 품질을 지속적으로 관리하고 개선할 수 있다.
[01] SonarQube 설치
시스템 환경
- Ubuntu 20.04.3 LTS
- Open JDK 11
- Spring Boot 2.5.0
- SonarQube 3.5.0.2730
SonarQube 설치
SonarQube를 설치하고 압축을 해제한 후 /opt
디렉토리에 배치한다.
SonarQube에는 내장된 Elasticsearch가 포함되어 있으며, Elasticsearch는 root 사용자로 실행되는 것을 허용하지 않기 때문에 별도의 사용자 계정을 만들어 SonarQube를 실행해야한다.
다음 명령어를 사용하여 SonarQube 전용 사용자 계정을 생성하고 권한을 설정한다. ```bash sudo groupadd sonar sudo useradd -g sonar -s /bin/false -d /opt/sonarqube sonar sudo chown -R sonar:sonar /opt/sonarqube ``` ### SonarQube 실행 SonarQube를 실행하기 위해 설치된 디렉토리로 이동하여 실행 스크립트를 사용한다. ```bash /opt/sonarqube-7.9.1/bin/linux-x86-64 ./sonar.sh start ``` ### 주의 사항 1 만약 실행 했는데 아무 반응이 없거나 ps 명령어로 pid를 확인해도 확인이 안된다면 es.log 로그 파일을 확인해보자 ```bash cd /opt/sonarqube-7.9.1/bin/linux-x86-64/logs view es.log ``` 로그 파일에 아래와 같은 오류가 발생한다면, 이는 SonarQube가 root 사용자로 실행될 수 없기 때문이다. ```bash java.lang.RuntimeException: can not run elasticsearch as root at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:103) ~[elasticsearch-6.8.0.jar:6.8.0] at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:170) ~[elasticsearch-6.8.0.jar:6.8.0] at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:333) [elasticsearch-6.8.0.jar:6.8.0] at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) [elasticsearch-6.8.0.j ``` ### 주의 사항 2 root가 아닌 새로 생성한 계정으로 실행해도 실행시키자마자 종료되는 경우 sonar.log 로그 파일을 확인해봐 ```bash cd /opt/sonarqube-7.9.1/bin/linux-x86-64/logs view sonar.log ``` 로그 파일에 아래와 같은 오류가 발생한다면, temp 파일 하위 config 파일의 권한이 root로 되어있어서 사용자 계정으로 접근이 불가능한 경우이다. ```bash 2024.08.05 12:47:42 INFO app[][o.s.a.AppFileSystem] Cleaning or creating temp directory /opt/sonarqube-7.9.1/temp 2024.08.05 12:47:42 INFO app[][o.s.a.es.EsSettings] Elasticsearch listening on /127.0.0.1:9001 2024.08.05 12:47:43 ERROR app[][o.s.a.p.ManagedProcessHandler] Fail to launch process [es] java.lang.IllegalStateException: Cannot write Elasticsearch yml settings file at org.sonar.application.es.EsYmlSettings.writeToYmlSettingsFile(EsYmlSettings.java:53) at org.sonar.application.ProcessLauncherImpl.writeConfFiles(ProcessLauncherImpl.java:152) at org.sonar.application.ProcessLauncherImpl.launch(ProcessLauncherImpl.java:84) at org.sonar.application.SchedulerImpl.lambda$tryToStartProcess$2(SchedulerImpl.java:192) at org.sonar.application.process.ManagedProcessHandler.start(ManagedProcessHandler.java:72) at org.sonar.application.SchedulerImpl.tryToStartProcess(SchedulerImpl.java:190) ``` sonarQube 설치 파일 하위의 temp 파일을 삭제해주자 ```bash cd /opt/sonarqube-7.9.1/ rm -rf temp ``` ### SonarQube 실행 ```bash /opt/sonarqube-7.9.1/bin/linux-x86-64/ ./sonar.sh start ``` SonarQube 실행이 정상적으로 완료되었다면 다음과 같은 화면이 보이는 것이 정상이다.
기본 포트번호는 9000이다.
설치 후 관리자 계정 정보는 admin/admin으로 로그인한다. ![sonarqube1](/assets/images/sonarqube-1/sonarqube-1.png) ### SonarQube 프로젝트 설정 'Create new project'를 눌러 새로운 프로젝트를 생성한다. ![sonarqube2](/assets/images/sonarqube-1/sonarqube-2.png) Project Key와 Display name은 본인의 프로젝트 이름에 맞게 각자 작성 후 진행한다. ![sonarqube3](/assets/images/sonarqube-1/sonarqube-3.png) ![sonarqube4](/assets/images/sonarqube-1/sonarqube-4.png) 본인의 프로젝트에 맞는 환경은 선택 한후 진행하면 Key가 생성되는데 해당 키는 잘 보관해두자. ### SonarQube 프로젝트 분석 SonarQube가 성공적으로 실행되면, build.gradle 파일에 다음 내용을 추가한다. plugins { id "org.sonarqube" version "3.3" } sonarqube { properties { property "sonar.projectKey", "your_project_key" property "sonar.host.url", "http://localhost:9000" property "sonar.login", "your_sonarqube_token" } } 애플리케이션 루트 디렉토리에서 아래 명령어를 실행한다. ```bash ./gradlew sonarqube ``` 실행 후 SonarQube 대시보드를 조회하면ㅡ 분석 결과를 확인하고 Quality Gate 설정을 통해 코드 품질 기준을 관리할 수 있다.
Quality Gate를 통해 설정한 기준을 만족하지 못하면 빌드가 실패하도록 설정할 수 있는데 해당 부분은 이후 게시글에서 다루려고 한다. ![sonarqube5](/assets/images/sonarqube-1/sonarqube-5.png) ### 결론 SonarQube는 코드 품질을 유지하고, 신규 결함이 추가되는 것을 방지하는 데 매우 유용하다.
SonarQube 설치를 완료하고 프로젝트 분석까지 진행해보았는데, 기본 규칙으로 설정했기 때문에 버그 및 취약점이 많이 캐치되지 않았지만 각자 설정 규칙을 커스터마이징하여 자신만의 Quality Gate를 설정할 수 있다. 다음 단계로는 Cloud Build 배포 프로세스 내에서 Git Push 시 조건에 맞지 않으면 빌드가 실패하도록 하는 프로세스를 추가할 예정이다.