2 minute read

정적 분석 도구인 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 버전으로 대체한다. ```bash cd /opt sudo wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-.zip sudo unzip sonarqube-.zip sudo mv sonarqube- sonarqube ``` ### SonarQube 전용 사용자 계정 생성 및 권한 설정 **SonarQube는 보안상의 이유로 root 사용자로는 실행할 수 없도록 되어 있다.**
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 시 조건에 맞지 않으면 빌드가 실패하도록 하는 프로세스를 추가할 예정이다.