Skip to content

Sonarqube PR Decoration 적용기

Richard JEON edited this page Aug 16, 2022 · 2 revisions



목표

  • PR 생성 시, PR 코멘트로 정적 분석 리포트가 등록되게 한다
  • PR 생성 시, 정적 분석 리포트를 SonarQube 서버에 누적한다
  • 정적 분석 리포트에는 코드 커버리지, 버그 탐지, 코드 스멜 탐지, 보안 취약성 탐지 등이 포함된다.
  • 전체 오퍼레이션 영상 참고





SonarQube 선택

  • SonarCloud는 직접 호스팅하지 않아도 되고 연동도 간편하다는 장점이 있음
    • 그러나 woowacourse-teams Organization 내에 하나의 Repository에 대해서만 Collaborator로 속해있기에 권한 이슈가 발생함
    • PR 데코레이션 정도는 가능하나, 상세 리포트를 확인할 수 없음. 공용 계정 로그인 불가.
  • SonarQube Community Edition은 오픈 소스로, 직접 호스팅한다면 무료로 구축하여 사용할 수 있음
    • 단, PR 데코레이션은 유료인 Developer Edition부터 지원
    • 대신 플러그인을 설치하여 Github 권한을 내장시킴으로써 PR에 코멘트를 작성하는 식으로 PR 데코레이션을 대체할 수 있음
    • 최신 LTS인 8.9 버전을 선택했으나, 플러그인 이슈가 있어 9.5 버전을 설치





전체 구축 과정 Overview

  • SonarQube 호스팅용 EC2 인스턴스 생성
  • 스왑 메모리 설정
  • SonarQube 실행을 위한 max number of threads 등 설정
  • JDK 11 설치
  • SonarQube 9.5 설치
  • PostgreSQL 12 설치
  • PR 데코레이션을 위한 플러그인 설치
  • Github App 생성 및 woowacourse-teams 내 2022-pickpick 리포지토리에 설치
  • SonarQube에 생성한 Github App 연동
  • Repository Secret 설정 및 Github Actions yml 추가





스왑 메모리 설정

# swap memory
touch /home/ubuntu/swapfile
sudo fallocate -l 2G /home/ubuntu/swapfile
sudo chmod 600 /home/ubuntu/swapfile
sudo mkswap /home/ubuntu/swapfile
sudo swapon /home/ubuntu/swapfile
sudo vi /etc/fstab

/home/ubuntu/swapfile swap swap defaults 0 0 # 이 내용을 맨 아레에 추가하고 저장

free -h # 적용 확인





SonarQube 실행을 위한 설정 추가

sudo vi /etc/sysctl.conf 
#이하 내용을 아래에 붙여넣기
vm.max_map_count=524288
fs.file-max=131072
ulimit -n 131072
ulimit -u 8192

sudo vi /etc/security/limits.conf 
# 아래 내용 붙여넣기
*   -   nofile  131072
*   -   nproc   8192

# 위 설정을 추가해주지 않으면 소나큐브 기동 시
# max user process 숫자, open file 숫자 제한이 너무 적다면서 예외 발생함
# 아래는 오류 예시

# bootstrap check failure [1] of [2]: 
# max number of threads [3522] for user [ubuntu] is too low, 
# increase to at least [4096]

# bootstrap check failure [2] of [2]: 
# max virtual memory areas vm.max_map_count [65530] is too low, 
# increase to at least [262144]





JDK 11 설치, SonarQube 9.5 설치

# OpenJDK 11 설치
sudo apt update
sudo apt install openjdk-11-jdk -y

# sonarqube-9.5.0.56709 다운
sudo wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-9.5.0.56709.zip

# unzip 설치
sudo apt install unzip

# 압축 풀기
unzip sonarqube-9.5.0.56709.zip

# 권한 설정
sudo chown -R ubuntu sonarqube-9.5.0.56709

# 포트 설정
sudo vi sonarqube-9.5.0.56709/conf/sonar.properties
# sonar.web.port=8081로 설정





PostgreSQL 12 설치

# postgresql-12 설치 
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get -y install postgresql-12

systemctl status postgresql # 설치하면 자동으로 실행됨
sudo lsof -i:5432 # postgresql은 기본포트 5432 에서 동작

# postgresql 초기 비밀번호 변경 - id:postgres pw:pickpick
sudo passwd postgres # 비밀번호 세팅 pickpick
sudo su - postgres
createuser richsonar # 유저 생성
psql

alter user richsonar with encrypted password 'rich1234';
# 생성한 유저에 비밀번호 세팅
# ALTER ROLE 이라고 나옴

create database sonarqube owner richsonar; 
# 소나큐브용 데이터베이스 생성
# CREATE DATABASE 라고 나옴

grant all privileges on database sonarqube to richsonar; 
# richsonar 계정에 소나큐브용 데이터베이스 권한 부여
# GRANT 라고 나옴

\q
exit
sudo systemctl restart postgresql # postgresql 재실행
systemctl status postgresql # 재실행 확인





SonarQube + PostgreSQL 연동

sudo vi /home/ubuntu/sonarqube-9.5.0.56709/conf/sonar.properties
# 이하 내용 주석 해제 후 기입
sonar.jdbc.username={username}
sonar.jdbc.password={password}
sonar.jdbc.url=jdbc:postgresql://localhost:5432/sonarqube

# SonarQube 기동
nohup java -jar sonarqube-9.5.0.56709/lib/sonar-application-9.5.0.56709.jar &
# 기동 후엔 publicIp:8081 로 접속하여 실행 확인
# 초기 계정/비밀번호는 admin/admin





플러그인 설치

# 소나큐브 버전별 지원되는 플러그인 버전이 다르므로 반드시 확인!
# 참고로 소나큐브 8.9가 LTS여서 이에 맞는 1.8.2를 시도했으나 PR 데코레이션이 적용 안됨
# https://github.com/mc1arke/sonarqube-community-branch-plugin/releases
wget https://github.com/mc1arke/sonarqube-community-branch-plugin/releases/download/1.12.0/sonarqube-community-branch-plugin-1.12.0.jar

# 파일 이동
mv sonarqube-community-branch-plugin-1.12.0.jar sonarqube-9.5.0.56709/extensions/plugins/

# 소나큐브 설정파일에 플러그인 등록을 위한 파일 수정
sudo vi sonarqube-9.5.0.56709/conf/sonar.properties

# 96번 라인
sonar.web.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.12.0.jar=web
# 247번 라인
sonar.ce.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.12.0.jar=ce

# Administration -> System -> Restart Server 
# 재실행





Github App 생성

  • https://github.com/settings/apps/new
  • Homepage URL 은 어떤 내용을 적어도 무관
  • callback URL과 webhook URL은 SonarQube 서버 주소를 입력 ex) http://1.1.1.1:8081
  • Repository Permissions에 아래 권한 추가
    • Checks - Read and write
    • Commit statuses - Read-Only
    • Metadata - Read-only (default)
    • Pull requests - Read and write
  • Any account 로 선택 후 생성
  • General 에서 Client Secret, private key 생성 및 보관
  • woowacourse-teams 에 설치





SonarQube 에 Github App 등록

  • Add a project -> Github 선택
  • Configuration name은 식별가능한 아무 값 입력
  • Github API URL에는 https://api.github.com 입력
  • Github App ID, Client ID, Client Secret, Private Key 각각 입력
  • Add Project -> Github 을 다시 진행하여 리포지토리 선택
  • with Github Actions 선택
  • SONAR_TOKEN, SONAR_HOST_URL 을 Repository Secret으로 등록
  • 예시로 생성해주는 Github Actions yml파일을 .github/workflows 이하 경로에 추가





Clone this wiki locally