코딩마을방범대

SonarQube 에 GitLab&Local 연결해서 사용하기 본문

💡 백엔드/Java

SonarQube 에 GitLab&Local 연결해서 사용하기

신짱구 5세 2024. 6. 17. 16:58
728x90

 

 

 

소나큐브란

  • 코드 품질 분석: 소나큐브는 다양한 프로그래밍 언어(Java, C#, JavaScript 등)의 코드를 분석하여 버그, 취약점, 코드 스멜 등을 찾아냅니다.
  • 자동화 및 통합: 소나큐브는 CI/CD 파이프라인에 통합되어 자동으로 코드 품질을 검사할 수 있습니다.
  • 보안 취약점 탐지: OWASP Top 10 등 보안 규칙을 기반으로 보안 취약점을 찾아냅니다.
  • 커스텀 룰셋 지원: 사용자 정의 규칙을 추가하여 특정 요구사항에 맞는 코드 검사를 수행할 수 있습니다.
  • 웹 기반 대시보드: 웹 브라우저에서 코드 분석 결과를 확인하고 관리할 수 있습니다.
  • 정적 코드 분석: 실제 실행 없이 코드 자체를 분석하여 문제점을 발견할 수 있습니다.

 

코드스멜이란?
프로그래밍 코드에서 문제를 일으킬 가능성이 있는 프로그램 소스 코드의 특징을 말한다.
코드스멜의 종류: 중복 코드, 긴 메소드, 복잡한 조건문, 너무 많은 주석&클래스&메소드&전역 변수, 하드코딩
개선 방법: 메소드 추출, 조건문&클래스&긴 메소드 분해, 변수 이름 변경

하드코딩이란? 특정 값을 코드 내부에 직접 입력하는 것

 

 

 

 


 

 

 

 

기본 세팅

 

① Java 설치

 

Download the Latest Java LTS Free

Subscribe to Java SE and get the most comprehensive Java support available, with 24/7 global access to the experts.

www.oracle.com

 

자바 버전이 낮을 경우 실행이 불가하다하여 22버전으로 다운로드 받았으나, 소나큐브를 실행시키는 과정에서 아래 오류를 받았다.

 

WARNING: COMPAT locale provider will be removed in a future release

 

자바 8에서는 COMPAT 로케일 공급자가 기본적으로 사용되었지만, 자바 22에서는 이 공급자가 더 이상 지원되지 않아 발생하는 문제라고 한다.

자바 17버전으로 다운그레이드 하고 실행했더니 아무 문제 없었다.

 

현재 컴퓨터에 자바 8버전이 설치되어 있어서 8버전으로 진행할 것이다.

 

 


 

❗ 주의 사항

  • SonarQube 9.9 버전부터는 JDK 17 이상의 버전을 필요로 함
  • JDK 11의 경우 26년 9월까지만 지원

 

 

 


 

 

 

 

② 환경 변수 설정

 

이미 자바가 설치되어 있던 경우에도 아래 작업을 수행해주면 설정된 자바 버전이 변경된다.

 

1. 환경 변수 검색

 

 


 

 

2. 환경 변수 클릭

 

 


 

 

 

3. Java home 경로 설정

 

시스템 변수 - JDK_HOME, JAVA_HOME에 자바가 설치된 메인 경로를 입력해주면 된다.

 

 

 


 

 

 

4. Path 경로 설정

 

시스템 변수 - Path에 Java Home의 bin 폴더를 추가해준다.

 

 


 

 

 

5. 재부팅 후 버전 체크

 

java -version

 

 

 

 


 

 

 

 

 

 

 

 

소나큐브 다운로드 및 실행

 

1. 소나큐브 다운로드

 

 

Download | SonarQube

Get the latest LTS and version of SonarQube the leading product for Code Quality and Security from the official download page.

www.sonarsource.com

 

위 링크를 통해 다운로드 할 경우 최신 버전으로 다운로드할 수 있고, 자바8 버전은 소나큐브 10버전에서 호환이 되지 않는다.

때문에 자바 8버전을 이용한다면 7.2.1 버전을 다운로드해야하며, 아래 링크를 통해 설치가 가능하다.

https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.2.zip

 

이 외 버전은 아래 링크 참고

 

Download Previous SonarQube Versions

Download previous versions of SonarQube including the most recent versions and the two previous LTA versions.

www.sonarsource.com

 

 

 

 


 

 

2. 소나큐브 실행

 

최신버전: \bin\windows-x86-64 폴더의 StartSonar.bat 실행

7.x.x버전: \bin\windows-x86-64 폴더의 InstallNTService.bat -> StartNTService.bat -> StartSonar.bat 실행

 

실행하자마자 바로 창이 꺼지는 경우 해당 포트 번호가 이미 실행 중인 경우일 수 있음
netstat -nao | findstr :9000
위 결과일 경우 PID 18964를 종료해주면 된다.
taskkill /f /pid 18964

 

WARNING: Please consider reporting this to the maintainers of org.sonar.process.PluginSecurityManager
WARNING: System::setSecurityManager will be removed in a future release

 

위 오류는, 최신 자바 버전에서 System.setSecurityManager() 메소드를 지원 하지 않아 발생하는 문제라고 한다.

오류가 발생해도 실행에는 지장이 없으니 그대로 냅두면 된다!

 

아래와 같이 SonarQube is operational 가 표시되면 실행이 완료된 것이다.

 

 

 

 


 

 

 

소나큐브 웹 접속

 

1. 소나큐브 웹 접속

 

http://localhost:9000/ 또는 http://127.0.0.1:9000/

 


 

2. 로그인

 

초기 ID/PW는 admin 이므로, 입력 후 로그인을 클릭해준다.

이 후 비밀번호를 설정하는 화면이 뜬다.

7.2.1 버전의 경우 로그인 후 빠른 연동 창이 뜬다.
프로젝트명 입력 후 생성하기를 클릭해주면 토큰이 생성된다.

아래 토큰은 다시 확인이 불가하니 어디에 기록해놓는 것을 추천한다!
이후 자신의 개발 환경을 세팅해주면 친절하게 설명이 나온다.
혹여 ./gradlew sonarqube ~~ 실행시 아래 오류가 발생한다면 
Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.

명령어에 직접 변수를 주는 것이 아닌, build.gradle 파일에 직접 선언해주면 오류가 발생하지 않는다.
gradle에 선언해놓고 빌드한 후  ./gradlew sonarqube 만 입력하여 실행해주면 된다!

 

 

 


 

 

 

 

 

 

소나큐브 프로젝트 연결(최신 버전)

7.2.1의 경우 로그인 후 바로 연동 과정을 진행하는 것이기 때문에 아래 단계가 필요하지 않다.

 

① 신규 프로젝트 생성

 

1. 신규 로컬 프로젝트 생성

 

로컬에 해당 프로젝트 소스가 있는 경우 'Create a local project' 를 클릭한다.

 

 

 

 

이후 아래 화면에서 설정하고 싶은 프로젝트명을 입력한 뒤 메인 브랜치명을 입력해준다.

나의 경우 메인 브랜치명이 Master기 때문에 Master로 설정해줬다.

 

 

이후 화면에서 Use the global setting으로 선택해주는게 편하다.

그 다음 Create project 클릭!

 

 

 

 

 

 


 

 

 

 

 

②-ⓐ Local 프로젝트 연결


1. 로컬 프로젝트 연결


아래처럼 메인화면에 떠있는 프로젝트를 클릭해준다.

 

이후 Locally 를 선택하여 지시사항대로 실행해준다.

지시 사항대로 수정 사항 커밋 후 기다리면 코드가 연동되어있는 것을 확인 할 수 있다!

 

 

 

 

 


 

 

 

 

 

②-ⓑ GitLab 프로젝트 연결

 

 

1. GitLab CI에 Sonar 관련 변수 설정

 

아래처럼 메인화면에 떠있는 프로젝트를 클릭해준다.

 

이후 With GitLab CI를 클릭해준다.

GitLab CI/CD 변수에 SONAR_HOST_URL, SONAR_TOKEN 변수를 지정하는 방법 그대로 진행해주면 된다.

 

 

설정에 CI/CD 메뉴가 없을 경우 프로젝트-Settings-Visibility, project features, permissions  expand를 클릭해준다.
이 후 CI/CD를 활성화 상태로 변경해주면 된다.




 

 

2. 깃랩 연결

 

Administration -> Configuration -> General Settings -> DevOps Platform Integrations 로 이동.

 

여기서 GitLab 섹션을 클릭한 뒤 Create configuration 을 클릭한다.

 

 

 

이후 아래와 같은 화면이 출력된다.

Personal Access Token은 GitLab에서 발급받으면 되며, 방법은 아래에 따로 정리해놨다.

 

 



 


 

 

 

3. build.gradle 설정

 

아래와 같이 설정해주면 된다.

org.sonarqube 버전은 gradle과 자바 버전에 맞게 설정해줘야한다.

plugins {
    ...
    id "org.sonarqube" version "4.0.0.2929"
}

sonar {
    properties {
        property "sonar.projectKey", "프로젝트키"
        property "sonar.projectName", "프로젝트명"
        property "sonar.qualitygate.wait", true
    }
}
gradle 버전 확인 방법(터미널)
./gradlew --version

 

 


 

 

 

4. 프로젝트 내 .gitlab-ci.yml 파일 추가

 

프로젝트의 루트 경로에 .gitlab-ci.yml 파일을 추가해주면 된다.

(루트 경로는 .git 폴더가 있는 경로다.)

 

아래 내용을 yml 파일에 넣어주면 되는데, 저장하기 전 체크할 사항은 빨간색으로 표시해놨다.

stages:
    - sonarqube-check
    - sonarqube-vulnerability-report

sonarqube-check:
  stage: sonarqube-check
  image: gradle:8.2.0-jdk17-jammy  # 프로젝트에 맞는 Docker 이미지로 변경 필요
  variables:
    SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar"
    GIT_DEPTH: "0"
    SONAR_HOST_URL: "http://your-sonarqube-server"  # SonarQube 서버 URL로 변경
    SONAR_LOGIN: "${SONAR_TOKEN}"  # GitLab CI/CD 환경변수에 SONAR_TOKEN 설정 필요
  cache:
    key: "${CI_JOB_NAME}"
    paths:
      - .sonar/cache
  script: 
    - gradle sonarqube -Dsonar.projectKey=프로젝트명 -Dsonar.host.url=$SONAR_HOST_URL -Dsonar.login=$SONAR_LOGIN
  allow_failure: true
  only: # 사용하는 브랜치명만 입력
    - merge_requests
    - master
    - main
    - develop

sonarqube-vulnerability-report:
  stage: sonarqube-vulnerability-report
  script:
    - 'curl -u "${SONAR_TOKEN}:" "${SONAR_HOST_URL}/api/issues/gitlab_sast_export?projectKey=프로젝트명&branch=${CI_COMMIT_BRANCH}&pullRequest=${CI_MERGE_REQUEST_IID}" -o gl-sast-sonar-report.json'
  allow_failure: true
  only: # 사용하는 브랜치명만 입력
    - merge_requests
    - master
    - main
    - develop
  artifacts:
    expire_in: 1 day
    reports:
      sast: gl-sast-sonar-report.json
  dependencies:
    - sonarqube-check

 

 

위 파일을 푸시하고 나면 아래와 같이 GitLab에 해당 yml 파일이 보인다.

 

 

 


 

 

GitLab의 Access Token 발급 받는 방법

 

GitLab 접속 후 프로필 아이콘 클릭 후 Preferences 를 클릭해준다.

이후 왼쪽 메뉴에서 Access Tokens를 클릭해준다.

 

 

 

SonarQube 설명에 따르면 최소한의 리포터 권한은 있어야한다고 나온다.

api와 read_repository, read_api 권한을 체크한 후 생성해주면 된다.

 

 

 

create 클릭 시 아래 사진처럼 토큰이 생성된다.

Your new personal access token 에 있는 값을 복사해주면 된다.

 

 

 

 

 


 

 

 

 

 

 

GitLab Runner 설정

 

모든 설정을 완료한 뒤 CI/CD-Jobs 섹션에 들어가보면 failed가 떠있고, 상세 페이지로 이동해보면 아래 오류 메시지가 띄워져 있을 수 있다.

 

Pipeline #12 pending with stages

 

 

이럴 경우 GitLab Runner 설정이 필요한 것이다.

 

아래 doc을 참고하여 설치해주면 되는데, register 진행 시 GitLab 프로젝트의 Settings - CI/CD - Runners의 expand를 클릭하여 Set up a specific runner manually 에 있는 링크, 토큰 값들을 이용하여 세팅해주면 된다.

register -> install -> start -> run 순서로 진행해주면 된다.

 

 

Install GitLab Runner on Windows | GitLab

GitLab product documentation.

docs.gitlab.com

 

 

 


 

 

 

세팅을 전부 완료했는데도 아래와 같은 오류가 발생할 수 있다.

 

This job is stuck because the project doesn't have any runners online assigned to it.

Go to project CI settings

 

이럴 경우 GitLab 프로젝트의 Settings - CI/CD - Runners의 expand를 클릭 - 연필 모양 클릭

 

 

여기서 형광펜으로 칠한 부분을 체크하여 저장해줘야한다.

 

 

 

 

 

 


참고사이트

SonarQube 시작하기

[IT정보] 소나큐브(SonarQube) 개념

 

 

 

728x90