DevOps/Sonarqube

Sonarqube 설치 및 Plugin 설치 방법

Jeffrey Oh 2023. 5. 13. 04:07
반응형

Sonarqube 를 다음에도 사용해 보려고 설치 방법을 정리한다.

  1. nginx 설치 및 도메인 설정
  2. docker 및 docker-compose 설치
  3. docker-compose 파일 작성
vi sonarqube.yml
version: "3"
services:
  sonarqube:
    image: sonarqube:9.9.1-community
    hostname: sonarqube
    container_name: sonarqube
    depends_on:
      - db
    environment:
      SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
      SONAR_JDBC_USERNAME: sonar
      SONAR_JDBC_PASSWORD: sonar
    volumes:
      - sonarqube_data:/opt/sonarqube/data
      - sonarqube_extensions:/opt/sonarqube/extensions
      - sonarqube_logs:/opt/sonarqube/logs
    ports:
      - "9000:9000"
    restart: always
  db:
    image: postgres:13
    hostname: postgresql
    container_name: postgresql
    environment:
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonar
      POSTGRES_DB: sonar
    volumes:
      - postgresql:/var/lib/postgresql
      - postgresql_data:/var/lib/postgresql/data

volumes:
  sonarqube_data:
  sonarqube_extensions:
  sonarqube_logs:
  postgresql:
  postgresql_data:
  1. vm.max_map_count 늘리기
    es 를 사용하기 때문에 max_map_count 를 es 설정과 똑같이 해야함
    vi /etc/sysctl.conf vm.map_max_count=262144
    위의 방식은 재부팅되면 사라지니 아래 처럼 파일에 추가해 영구로 적용할 것
  2. sudo sysctl -w vm.max_map_count=262144
  3. sonarqube 구동
docker-compose -f sonarqube.yml up -d
  1. 초기 비밀번호 재설정
    admin / admin
  2. 연동할 플랫폼 설정
    bitbucket cloud 연동방법
    workspace settings > OAuth consumers 에서 신규로 키를 생성

Configuration name 아무거나 입력 (회사명 정도 ?)
Workspace ID 추가
OAuth Key 및 OAuth Secret 추가


Grant access to your repositories

username : 계정의 이름 (https://bitbucket.org/account/settings/)
계정 설정 > Bitbucket 프로필 설정 > 사용자 명
app apssword : 없으면 만들어서 입력
신규로 생성 시 레포지토리 READ 권한 필수

  1. Token 생성 및 Jenkins Credentials 추가
    sonarqube Web 의 우측 상단 프로필을 클릭 후 My Account 로 진입
    Security 탭에서 Name, UserType, 기간 무제한으로 Token 생성

Jenkins Credentials 에 이름(있다가 JenkinsFile 파이프라인 내에서 credentialsId 값과 연결됨) 및 값 설정

  1. CI Jenkins 연동
    Jenkins 플러그인에서 다음을 설치
    SonarQube Scanner for Jenkins

설치 후 Jenkins 관리 > 시스템 설정 > SonarQube servers 항목으로 이동
Name 에 원하는 값을 입력 (있다가 Jenkinsfile 파이프라인 내에서 installationName 값과 연결됨)
Server URL 호스트 추가

  1. Global properties 추가
    Jenkins 관리 > 시스템 설정 > Global properties
    SONARQUBE_TOKEN 값 설정
  2. Spring build.gradle 의존성 추가
buildscript {
    repositories {
        mavenCentral()
        maven { url 'https://plugins.gradle.org/m2/' }
    }
    dependencies {
        classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.0" <- 이부분
    }
}

// 멀티 모듈이라서 plugin 적용 추가
dependencies {
    apply plugin: 'org.sonarqube'
    apply plugin: 'jacoco' // test 결과 리포트 전달을 위한 플러그인
}

jacoco {
    toolVersion = "0.8.7"
}

jacocoTestReport {
    dependsOn tasks.test

    reports {
        xml.enabled(true)
        html.enabled(true)
        xml.destination(new File("build/reports/jacoco.xml"))
    }
}

def SONARQUBE_TOKEN = System.getenv("SONARQUBE_TOKEN")
def SONARQUBE_PROJECT_KEY = System.getenv("SONARQUBE_PROJECT_KEY")

sonarqube {
    properties {
        property "sonar.host.url", "sonarqube 서버 url"
        property "sonar.token", "${SONARQUBE_TOKEN}"
        property "sonar.projectKey", "${SONARQUBE_PROJECT_KEY}"
        property "sonar.projectName", "프로젝트명"
        property "sonar.sources", "src"
        property "sonar.language", "java"
        property "sonar.sourceEncoding", "UTF-8"
        property "sonar.profile", "Quality Gates 프로필 별도 지정한 경우 여기에 프로필명 입력"
        property "sonar.coverage.jacoco.xmlReportPaths", "build/reports/jacoco.xml"
        property 'sonar.java.binaries', "${buildDir}/classes"
        property "sonar.test.inclusions", "**/*Test.java"
        property 'sonar.exclusions', '**/test/**, **/Q*.java, **/*Doc*.java, **/resources/**'
    }
}

// sonarqube task 수행시 jacocoTestReport 를 우선 실행하기 위한 설정
tasks["sonarqube"].dependsOn(jacocoTestReport)
  1. Jenkinsfile Pipeline 항목에 다음을 추가
    stage('SonarQube Analysis') {
    post {
    success {
     slackSend(channel: SLACK_CHANNEL, color: SLACK_SUCCESS_COLOR, message: 'SonarQube Analysis에 성공하였습니다.')
    }
    failure {
     slackSend(channel: SLACK_CHANNEL, color: SLACK_FAIL_COLOR, message: 'SonarQube Analysis에 실패하였습니다.\n==================================================================')
    }
    }
    steps {
    withSonarQubeEnv(credentialsId:"Jenkins 에서 설정한 값", installationName:"Jenkins 에서 설정한 값") {
     sh "./gradlew :app-api:sonarqube '-Dsonar.token=${SONARQUBE_TOKEN}' '-Dsonar.branch.name=${BRANCH_NAME}' -x test"
    }
    }
    }

sonarqube gradlew 명령어로 실행 시 Jenkins Global properties 에서 지정한 Token 값을 전달하고 수행 중에 test 는 앞서 Clean Buile Test 를 할 것이기 때문에 건너뛴다. 브랜치는 빼고 진행 (파이프라인에서만 추가)
만약 sonarqube 만 실행한다면 -x test 는 빼야함

  1. 유료 버전 기능 PR Decoration 을 사용하기 위한 무료 버전 Plugin 설치
    참고 : https://mangkyu.tistory.com/229

2023-05-13 기준 혹시나 설치한 버전이 Community EditionVersion 10.x 이라면 다운그레이드 해야한다. 아직 10 버전 이상 플러그인을 지원하지 않는 듯 함
https://github.com/mc1arke/sonarqube-community-branch-plugin#compatibility
위 링크에서 말하기를 9.8+ 는 1.14.0 을 설치하라고 나와있기 때문에 해당 버전으로 다운받는다

root 계정으로 container 접근

docker exec -u 0 -it sonarqube /bin/bash

-u 0 옵션을 붙이면 root로 접근이 되는데 이걸 안하고 접근 시 계정으로 컨테이너에 접속 되며 sudo 명령어가 없다고 하는 경우가 있음

extensions/plugins 폴더로 이동 후 다음을 실행

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

그 다음 상위쪽에 conf 로 이동하여 sonar.properties 를 열어 맨 아래에 추가한다

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

만약 vi 명령어가 없는경우 다음을 실행한 다음 위의 절차 진행

apt-get update -y
apt-get install -y vim

sonarqube 재실행

docker restart sonarqube

Error

  1. postgresql db 관련 unknownhost 뜨면 docker postgresql volumes 싹 지우고 새로 해볼 것 (여러 버전 설치하면서 충돌 났을 가능성)
반응형