공부하는 스누피

SonarQube 8.9 연동 가이드 본문

정리 모음

SonarQube 8.9 연동 가이드

커피맛스누피 2022. 6. 24. 20:14

Overview

SonarQube는 코드 분석으로 코드 품질과 보안을 향상시켜주는 소프트웨어다. 

무료 버전인 Community Edition이 있고, 유료 버전인 Developer나 Enterprise도 있다.

IntelliJ checkstyle같은 IDE plugin으로는 코드 품질 검사에 한계가 있는데,

SonarQube에서는 코드 정적 분석뿐만 아니라 CI 툴과 연동하여 검사를 자동화시킬 수 있다.

Sonarqube Community Branch Plugin으로 GitHub에 분석 결과를 comment로 남길 수도 있어 편리하다.

 

팀 과제로 SonarQube 연동 작업을 했던 내용을 간추려 가이드로 정리해보았다.

 

SonarQube 설치

Linux CentOS7 환경에서 진행하였음

Prerequisites

- 3GB Ram
- Java 11
- PostgreSQL over 9.6 (8.0부터 mysql 미지원)


PostgreSQL 설치

설치 커맨드

## 설치
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

sudo yum install -y postgresql11-server postgresql11-contrib

## 초기화
sudo /usr/pgsql-11/bin/postgresql-11-setup initdb

## 서비스 등록 및 실행
sudo systemctl enable postgresql-11
sudo systemctl start postgresql-11

## 접속
sudo -u postgres psql

 

 

SonarQube 데이터 저장을 위한 데이터베이스 생성

 

CREATE USER sonar;

ALTER USER sonar WITH ENCRYPTED password '';
CREATE DATABASE sonar OWNER sonar;


설정 파일 수정
- `/var/lib/pgsql/버전/data/pg_hba.conf` 다음과 같이 수정


SonarQube 배포판 설치

- LTS인 8.9버전으로 설치하였음

sudo wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-8.9.zip
unzip sonarqube-8.9.zip
mv sonarqube-8.9 sonarqube

 

초기 설정

### sonarqube/conf/sonar.properties
sonar.jdbc.username=sonar                                                                                                                     
sonar.jdbc.password=sonar-db-password
sonar.jdbc.url=jdbc:postgresql://localhost/sonar

### sonarqube/conf/wrapper.conf (Java 11 버전 사용하도록 설정)
wrapper.java.command=java 11이 설치된 폴더 경로/bin/java

 

실행 커맨드

## 실행
sh sonarqube/bin/linux-x86-64/sonar.sh start

## 상태 확인
sh sonarqube/bin/linux-x86-64/sonar.sh status

## 콘솔 로그 확인 (상태가 not running일때 유용)
sh sonarqube/bin/linux-x86-64/sonar.sh console

## 종료
sh sonarqube/bin/linux-x86-64/sonar.sh stop

 

[주의사항]
root 권한을 가진 user로는 SonarQube가 실행되지 않는다. (elastic search가 원인)
sonar라는 user를 새로 만들고 해당 유저로 실행해야 한다.

 

잘 작동되면 http://localhost:9000에서 소나큐브 웹 콘솔을 볼 수 있다.

 

GitHub 연동

SonarQube Community Edition에서는 7.2 버전부터 GitHub branch/PR 분석과 PR별 분석 결과 report를 지원하지 않는다.

SonarQube Community Branch Plugin을 적용하면 Developer Edition을 쓰지 않아도 해당 기능을 이용할 수 있다.

https://github.com/mc1arke/sonarqube-community-branch-plugin

 

GitHub - mc1arke/sonarqube-community-branch-plugin: A plugin that allows branch analysis and pull request decoration in the Comm

A plugin that allows branch analysis and pull request decoration in the Community version of Sonarqube - GitHub - mc1arke/sonarqube-community-branch-plugin: A plugin that allows branch analysis and...

github.com

 

SonarQube Community Branch Plugin 설치

SonarQube Server의 버전에 맞는 Jar 패키지를 다운받는다.

8.9 버전과 호환되는 1.8.0 버전을 받았다. (기타 버전: https://github.com/mc1arke/sonarqube-community-branch-plugin/releases)

wget https://github.com/mc1arke/sonarqube-community-branch-plugin/releases/download/1.8.0/sonarqube-community-branch-plugin-1.8.0.jar

 

다운받은 Jar 패키지를 아래 폴더로 이동한다.

mv sonarqube-community-branch-plugin-1.8.0.jar {SonarQubePath}/extensions/plugins

conf/sonar.properties의 SonarQube 설정을 변경한다.

sonar.web.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.8.0.jar=web

설정을 바꾼 후 SonarQube를 재시작하고, MarketPlace 탭의 Plugins에 설치되었는지 확인한다.

 

GitHub App 생성/설치

GitHub App 생성

- User authorization callback URL: SonarQube Server Host 입력 (e.g. http://localhost:9000)

- Webhook URL: SonarQube Server Host

- Permission

-> Read & Write: Checks, Pull Requests

-> Read-only: Metadata, Commit statuses

 

GitHub App 설치

- App의 Private Key 생성

- SonarQube 분석을 적용하고자 하는 repository에 App 설치

- 설치되면 App의 설정 페이지의 Advanced에서 webhook이 정상적으로 가고 있는지 볼 수 있음

 

SonarQube 연동

SonarQube에서 다음과 같이 설정하면 된다.

1. General Settings > General

- Server base URL: SonarQube Server Host 입력

 

2. General Settings > ALM Integrations

- GitHub App 정보를 참고하여 Integration configuration 추가

 

3. Project 생성 후 Project Setting > Pull Request Decoration

- 방금 추가한 Configuration name 지정

- Repository identifier: 도메인 없이 username/repo_name이나 organization/repository_name으로 지정 (오타주의!)

-> e.g. jsoo00/sonarqube_repo

 

Jenkins 연동

사전 설정

Jenkins 관리 > PlugIn 관리에서 아래 plugin 설치

- SonarScanner Plugin 설치 (Pipeline: Supporting APIs도 필요시 업데이트)

- Multibranch Pipeline Plugin 설치

- GitHub Plugin 설치

 

Jenkins 설정

Jenkins 설정 > Credentials

- GitHub 계정 추가 (access token을 추가하여야 함)

 

Jenkins 설정 > 시스템 설정

- SonarQube servers > Add SonarQube로 서버 정보 추가

- GitHub > Add GitHub Server로 GitHub 정보 추가 (API는 GitHub API 주소 쓰면 됨)

 

Jenkins 설정 > Global Tool Configuration

- sonarQube Scanner > Add SonarQube Scanner로 서버 정보 추가

- Install automatically 선택해서 버전에 맞는 SonarQube Scanner 선택

 

SonarQube Webhook 추가

Administration > Configuration > Webhooks에 Jenkins 정보 추가

- {Jenkins_Url}/sonarqube-webhook/ 으로 설정

Multibranch Pipeline project 생성

1. Jenkins에서 project 생성

 

2. Branch Sources > Add Source에서 GitHub 추가

- Repository HTTPS URL 선택해서 정보 입력

- Behaviours에서는 코드를 검사할 기준을 정할 수 있음. 상황에 맞게 등록

 

3. Build Configuration > by Jenkinsfile

- repo의 root에 있는 Jenkinsfile로 job을 실행한다.

 

Jenkinsfile 작성

node {
    stage('SCM') {
        checkout scm
    }
    
    stage('SonarQube Analysis') { 
        def scannerHome = tool 'Jenkins에 설정한 SonarQube Scanner name'
        if (env.BRANCH_NAME ==~ /^PR-\d+$/) {
            withSonarQubeEnv('SonarQube') {
                sh "${scannerHome}/bin/sonar-scanner " +
                    "-Dsonar.pullrequest.key=$CHANGE_ID " +
                    "-Dsonar.pullrequest.branch=$CHANGE_BRANCH " +
                    "-Dsonar.pullrequest.base=$CHANGE_TARGET"
            }
        } else {
        	withSonarQubeEnv('SonarQube') {
            	sh '${scannerHome}/bin/sonar-scanner -Dsonar.branch.anme=${env.BRANCH_NAME}'
                
                def sonarProps = readFile encoding: 'utf-8', file: '.scannerwork/report-task.txt'
                echo 'sonarProps: " + sonarProps
            }
            
            timeout(time: 5, unit: 'MINUTES') {
                waitForQualityGate abortPipeline: true
            }
        }
    }
}

PR 등록 후 올린 코드에 대한 분석 결과가 comment에 달리면 성공😄

 

 

 

References

https://devopscube.com/setup-and-configure-sonarqube-on-linux/

 

How To Install And Configure Sonarqube On Linux (RHEL/Centos/ec2)

This guide will help you to setup, install and configure sonarqube on Linux servers (Redhat/Centos 7 versions) on any cloud platforms like ec2, azure, etc.

devopscube.com

https://docs.sonarqube.org/8.9/requirements/requirements/

 

Prerequisites and Overview | SonarQube Docs

The only prerequisite for running SonarQube is to have Java (Oracle JRE 11 or OpenJDK 11) installed on your machine. A small-scale (individual or small team) instance of the SonarQube server requires at least 2GB of RAM to run efficiently and 1GB of free R

docs.sonarqube.org

https://hgko1207.github.io/2020/09/10/postgresql-1/

 

[PostgreSQL] CentOS 7에서 PostgreSQL 설치 및 시작

최근에 CentOS 7에 PostgreSQL을 설치했습니다. 설치 과정을 정리해봤습니다. 운영환경 CentOS 7.6 PostgreSQL 11.9 인터넷이 되는 환경 12345# Install the repository RPM:sudo yum install -y https://download.postgresql.org/pub/rep

hgko1207.github.io

 

'정리 모음' 카테고리의 다른 글

[Jenkins] GitHub custom status check  (0) 2022.07.01
Clean Code 메모 정리  (0) 2021.03.19
도커(Docker) 사용법  (0) 2021.01.01
슈도코드(의사코드, pseudocode) 가이드라인  (0) 2020.10.19
[기술면접]자료구조 정리  (0) 2020.10.19
Comments