Sonarqube 를 다음에도 사용해 보려고 설치 방법을 정리한다.
- nginx 설치 및 도메인 설정
- docker 및 docker-compose 설치
- 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:
- vm.max_map_count 늘리기
es 를 사용하기 때문에 max_map_count 를 es 설정과 똑같이 해야함vi /etc/sysctl.conf vm.map_max_count=262144
위의 방식은 재부팅되면 사라지니 아래 처럼 파일에 추가해 영구로 적용할 것 sudo sysctl -w vm.max_map_count=262144
- sonarqube 구동
docker-compose -f sonarqube.yml up -d
- 초기 비밀번호 재설정
admin / admin - 연동할 플랫폼 설정
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 권한 필수
- Token 생성 및 Jenkins Credentials 추가
sonarqube Web 의 우측 상단 프로필을 클릭 후My Account
로 진입Security
탭에서 Name, UserType, 기간 무제한으로 Token 생성
Jenkins Credentials 에 이름(있다가 JenkinsFile 파이프라인 내에서 credentialsId
값과 연결됨) 및 값 설정
- CI Jenkins 연동
Jenkins 플러그인에서 다음을 설치SonarQube Scanner for Jenkins
설치 후 Jenkins 관리 > 시스템 설정 > SonarQube servers 항목으로 이동
Name 에 원하는 값을 입력 (있다가 Jenkinsfile 파이프라인 내에서 installationName
값과 연결됨)
Server URL 호스트 추가
- Global properties 추가
Jenkins 관리 > 시스템 설정 > Global properties
SONARQUBE_TOKEN 값 설정 - 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)
- 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
는 빼야함
- 유료 버전 기능 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
- postgresql db 관련 unknownhost 뜨면 docker postgresql volumes 싹 지우고 새로 해볼 것 (여러 버전 설치하면서 충돌 났을 가능성)