Skip to content

Sonarqube

Seongbeen Kim edited this page Jun 3, 2021 · 7 revisions

1. Sonarqube란?

  • 소나큐브는 20개 이상의 프로그래밍 언어에서 버그, 코드 스멜, 보안 취약점을 발견할 목적으로 정적 코드 분석으로 자동 리뷰를 수행하기 위한 지속적인 코드 품질 검사용 오픈 소스 플랫폼이다. 소나소스(SonarSource)가 개발하였다. 소나큐브는 중복 코드, 코딩 표준, 유닛 테스트, 코드 커버리지, 코드 복잡도, 주석, 버그 및 보안 취약점의 보고서를 제공한다. by 위키백과-소나큐브

Sonarqube를 사용하게 된 이유

  • Springboot project를 진행하는데 있어서 Github, Jenkins와 연동하여 PR을 등록할때마다 자동으로 코드를 분석하게 한다면, 리뷰어들의 컨벤션 및 오류 체크 등에 대한 리뷰 부담을 덜어주고 클린 코드를 유지하면서 개발하는데 도움이 된다고 생각했기 때문이다.

2. 설치 및 실행

  • 환경
    • EC2(Amazon Linux 2 AMI)
    • Nginx(1.18.0)
    • Jenkins 2021.5.14 기준 https://pkg.jenkins.io/redhat-stable/ 최신 stable 버전
    • JDK(openjdk version "11.0.11") java-11-amazon-corretto로 설치

1. Sonarqube 설치

  1. sudo yum install git -y : git 설치
  2. cd /opt : opt 디렉토리로 이동
  3. sudo wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.9.5.zip : sonarqube 7.9.5 버전 알집 파일 다운로드
    • 7.9 LTS 이후 버전은 JDK 11, 7.8 이하는 JDK 8 요구
  4. sudo unzip sonarqube-7.9.5.zip : 압축 해제
  5. sudo mv sonarqube-7.9.5 sonarqube : sonarqube-7.9.5sonarqube로 이름 변경
  6. sudo groupadd sonar : sonar라는 그룹 추가
  7. sudo useradd -c “Sonar System User” -d /opt/sonarqube -g sonar -s /bin/bash sonar : sonar라는 유저 추가
  8. sudo passwd sonar : sonar 유저에 대한 비밀번호 설정
  9. sudo usermod -a -G sonar ec2-user : ec2-user 그룹에 sonar 유저 추가
  10. sudo chown -R sonar:sonar /opt/sonarqube : sonar그룹, sonar 유저로 설정
  11. sudo chmod -R 775 /opt/sonarqube : 파일 권한 수정
  12. sudo vim /opt/sonarqube/bin/linux-x86–64/sonar.sh : sonar.sh 파일 열기
    • RUN_AS_USER 항목을 찾아서 RUN_AS_USER=sonar 로 수정

2. DB 설치

  • 최신 버전에 가까울수록 Mysql을 지원하지 않기 때문에 PostgresSQL 설치 권장(Sonarqube 7.9 버전에서는 최소 PostgresSql 9.3이상 필요!!)
  1. PostgresSQL

    1. sudo amazon-linux-extras install postgresql10 epel -y : postgresql10 설치
    2. sudo yum install postgresql-server postgresql-devel -y : Posrtgresql 관련 의존성 설치
    3. sudo postgresql-setup initdb : Posrtgresql 클러스터 생성
    4. sudo systemctl enable postgresql : 부팅 시, Posrtgresql 실행
    5. sudo systemctl start postgresql : Posrtgresql 실행
    6. sudo su - postgres : Posrtgresql 설치 시 추가된 postgres 사용자로 전환
    7. psql : psql shell 실행
    8. CREATE USER sonar WITH ENCRYPTED PASSWORD 'sonar_password'; : sonar 라는 사용자 생성
    9. CREATE DATABASE sonarqube; : sonarqube 라는 DB 생성
    10. GRANT ALL PRIVILEGES ON DATABASE sonarqube to sonar; : sonar 사용자에 sonarqube DB에 대한 모든 권한 설정
    11. SHOW hba_file; : hba_file 경로 확인
    12. \q : psql shell 종료
    13. exit : ec2-user로 전환
    14. sudo vim $hba_file경로 : 10에서 확인한 경로 붙여넣어 파일 열기 - 아래의 내용으로 수정
     ```java
     # TYPE  DATABASE        USER            ADDRESS                 METHOD
    
     # "local" is for Unix domain socket connections only
     local   all             all                                     peer
     local   all             sonar                                   md5
     # IPv4 local connections:
     host    all             all             127.0.0.1/32            md5
     # IPv6 local connections:
     host    all             all             ::1/128                 md5
     ```
    
    1. sudo systemctl restart postgresql : Posrtgresql 재실행
  2. Mysql(Sonarqube 7.2 버전에서는 동작 확인)

    1. sudo yum install -y https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm : mysql 5.7 버전 설치
    2. sudo yum install -y mysql-community-client : mysql commutiy client 설치
    3. sudo yum install -y mysql-server : mysql server 설치
    4. sudo service mysqld start : mysqld 실행
      • service mysqld status를 통해 이미 실행이 된 상태라면 넘어가도 된다.
    5. sudo grep 'temporary password' /var/log/mysqld.log :
      • mysql 초기 설정된 비밀번호 출력
    6. mysql -u root -p : root 계정으로 mysql 접속
      • 5번에서 출력된 비밀번호 입력
    7. ALTER USER 'root'@'localhost' identified by 'password’; : localhost root 계정 비밀번호 수정
      • ERROR 1819 (HY000): Your password does not satisfy the current policy requirements , 변경하려는 패스워드가 패스워드 설정 요구 조건에 맞지 않을 경우, 위와 같은 에러가 발생한다.
        • 해결 방법

          1. SHOW VARIABLES LIKE 'validate_password%'; : 패스워드 검증 관련 변수들을 출력

            mysql password policy medium

          2. set global validate_password_policy=LOW; : LOW로 설정

            mysql password policy low

          • LOW : 패스워드 길이 (default 8자 이상)
          • MEDIUM : 패스워드 길이 (default 8자 이상) + 숫자, 대문자, 소문자, 특수문자 모두 포함
          • STRONG : 패스워드 길이 (default 8자 이상) + 숫자, 대문자, 소문자, 특수문자 모두 포함 + dictionary file 등록 (파일에 포함된 단어는 비밀번호로 사용할 수 없다.)
    8. CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_bin; : sonar라는 DB 생성 (문자 인코딩 utf8 로 하며 binary 값으로 정렬)
    9. GRANT ALL PRIVILEGES ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar password'; : localhost sonar 계정 생성 + sonar 관련 DB에 모든 권한을 준다.
    10. FLUSH PRIVILEGES; : 설정한 권한 바로 적용

3. Sonarqube 설정

  1. sudo vim /opt/sonarqube/conf/sonar.properties : sonarqube 환경 설정 파일 열기

    sonar.jdbc.username=sonar
    sonar.jdbc.password=sonarqube password
    Postgresql // sonar.jdbc.url=jdbc:postgresql://localhost/sonarqube
    Mysql // sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance
    sonar.web.context=/sonarqube // for reverse proxy
    • Nginx를 앞단에서 reverse proxy로 사용하고 있기 때문에 sonarqube로 우회할 수 있도록 추가해준다. reverse proxy 사용을 안하면 위의 3줄만 추가해주면 됨.
      • 현재 Nginx에서 jenkins/ 일 경우 우회하도록 설정해놓았기 때문에, sonarqube/sonarqube로 해줌
  2. sudo vim /etc/nginx/nginx.conf : nginx 설정 파일 열기

    • 80번 포트(Nginx)로 들어올 시 9000번 포트(Sonarqube)로 연결해주는 아래의 설정을 추가해줘야 한다.
    location /sonarqube {
    		proxy_pass http://localhost:9000;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
    		proxy_set_header X-Forwarded-Proto $scheme;
    }
    
  3. sudo /opt/sonarqube/bin/linux-x86-64/sonar.sh console : sonarcube 실행 및 콘솔로 출력

    • # There is insufficient memory for the Java Runtime Environment to continue. 메모리 에러 부족 발생 시
    • [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] 가상 메모리 에러 발생 시
      • 해결 방안
        • sudo sysctl -w vm.max_map_count=262144 : 임시로 vm.max_map_count=262144 설정
          • 영구적으로 설정하기 위해서는 sudo vim /etc/sysctl.confvm.max_map_count=262144 추가
  4. sudo vim /etc/systemd/system/sonarqube.service : sonarqube를 위한 service 파일 생성 및 열기

    [Unit]
    Description=SonarQube service
    After=syslog.target network.target
    
    [Service]
    Type=simple
    User=sonar
    Group=sonar
    PermissionsStartOnly=true
    ExecStart=/opt/sonarqube/bin/linux-x86-64/sonar.sh start
    ExecStop=/opt/sonarqube/bin/linux-x86-64/sonar.sh stop
    ExecReload=/opt/sonarqube/bin/linux-x86-64/sonar.sh restart
    PIDFile=/opt/sonarqube/bin/linux-x86-64/./SonarQube.pid
    TimeoutStartSec=5
    Restart=always
    SuccessExitStatus=143
    
    [Install]
    WantedBy=multi-user.target
    • 위의 코드 추가
  5. sudo systemctl enable sonarqube.service : sonarqube 서비스 활성화(부팅 시 자동 구동)

  6. sudo systemctl start sonarqube.service : sonarqube service 시작

  7. 브라우저에서 http://EC2's public ip/sonarqube : sonarqube로 접속

    • Log in 버튼을 누르고 로그인 (default id : admin, password : admin)

    ec2 sonarqube connect

  8. 프로젝트 생성 - token 생성

    sonarqube token sonarqube generated token
  9. (선택) IntelliJ gradle 에서 sonarqube를 실행하고 싶다면 좌측 상단에 표시된 sonarqube 플러그인 추가 및 실행

    sonarqube project
  10. 비밀번호 변경

    • My Account - Security

      sonarqube password change

3. Jenkins 연동

1. Jenkins 접속 및 플러그인 설치

  • Jenkins 관리 - 플러그인 관리

  • SonarQube Scanner 설치

    jenkins sonarqube scanner plugin
    • Jenkins 관리 - Global Tool Configuration - SonarQube Scanner

      sonarqbue sonarqube scanner add
  • Jenkins에 Sonarqube servers 추가

    1. Jenkins 관리 - 시스템 설정 - Sonarqube servers 에서 아래와 같이 입력 후 Add 버튼 클릭

      jenkins sonarqube servers
    2. 아래와 같이 내용 입력 (Secret 에는 8번에서 생성한 token 값 입력)

      jenkins add credentials
    3. 생성된 토큰 추가

      jenkins sonarqube servers complete
  • GitHub Pull Request Builder 설치

    sonarqube github pull request plugin
    • Jenkins 관리 - 시스템 설정 - GitHub Pull Request Builder

      jenkins github pull request builder set up
      • 위의 ADD 버튼 클릭 후 Secret 에 자신의 Github personal token 입력 (Github personal token 생성 방법 settings -> Developer Settings -> Personal Access tokens -> Generate new token)

        jenkins github pull request builder credential
      • Connect to API 클릭하여 연결 확인

        jenkins github pull request builder

2. 프로젝트 생성

  1. 프로젝트 생성

    jenkins project create
  2. Github project 탭에 project url 추가

    jenkins project url
  3. 소스 코드 관리 탭에 Git 설정

    1. .git 으로 끝나는 project url 추가

    2. Add 버튼 눌러 Github username(아이디 X, 자신의 github 프로필 밑에 작게 볼드체 되어있는 글자), password 추가

      jenkins github username password credential
    3. Refspec, 브랜치 설정

    • Name 항목에 origin 추가
    • Refspec 항목에 +refs/pull/${ghprbPullId}/*:refs/remotes/origin/pr/${ghprbPullId}/* 추가 : PR 요청에 대해서만 빌드를 하겠다는 의미
    • +refs/heads/*:refs/remotes/origin/* +refs/pull/${ghprbPullId}/*:refs/remotes/origin/pr/${ghprbPullId}/* 추가 : PR, 브랜치 모두 빌드
  • Branch Specifier에 ${sha1} 추가 : PR하는 브랜치 모두를 의미

    jenkins sourcecode management

  1. 빌드 유발 탭에 GitHub Pull Request Builder 체크

    1. Admin list 추가

    2. Use github hooks for build triggering 체크 (자신의 Github repo에 대한 webhook이 자동 생성된다

      • Jenkins 포트가 8080이라서 webhook url 포트가 8080으로 설정이 되는데, 현재 설치 과정에서는 nginx 80번 포트를 통해 Jenkins를 접속하기 때문에 꼭 80으로 변경해줘야 한다.
      jenkins build trigger
  2. Build 탭에서 Excute shell 추가

    jenkins excute shell

  3. Build 탭에서 Execute SonarQube Scanner 추가

    1. Analysis properties의 아래에 내용 추가 (Analysys parameters 참고)
    sonar.host.url = SonarQube url
    sonar.login = SonarQube에서 생성한 project token
    sonar.projectKey = SonarQube에서 생성한 project key
    sonar.projectName = SonarQube에서 생성한 project name
    sonar.projectVersion = SonarQube에서 분석한 소스의 버전
    sonar.language = 작성한 코드 언어
    sonar.sources = 분석할 소스 파일의 경로
    sonar.tests = 분석할 테스트 파일의 경로
    sonar.java.binaries = 바이너리 파일을 분석 경로
    sonar.sourceEncoding = 소스 인코딩
    jenkins Execute SonarQube Scanner

3. Jenkins에서 수동 수행

  1. Build Now 버튼 클릭하여 빌드 수행

    jenkins build start
  2. console output 클릭하여 빌드 결과 보기

    jenkins console output button jenkins console output result
    • 위의 네모칸 클릭 후 Sonarqube 결과 페이지로 이동하여 결과 확인

      sonarqube result

4. Pull Request를 통한 자동 수행

  • PR 요청 결과
    1. Github repo

      PR check
    2. Jenkins

      jenkins auto pr check

참조

One point stop for Installing SonarQube server in an AWS EC2 instance

A Complete Guide to Install SonarQube Server in Amazon Linux

SonarQube on AWS EC2 - Installation and integration with Jenkins

코드 분석 도구 적용기 - 3편, SonarQube 적용하기

Proxy 뒤에서 SonarQube 서버를 보호하기

GitHub Pull Request Builder Plugin

빌드/테스트는 내가 해줄게. 너는 코딩에 집중해 (by GitHub Pull Request Builder)

GitHub의 Pull Request를 로컬로 가져오기

[Jenkins] [github] Jenkins와 github 연동하기

Clone this wiki locally