SonarQube
- 코드 정적분석 툴(Tool)
- 정적분석: 실제 프로그램을 실행하지 않고 코드의 패턴을 바탕으로 Bug, Code Smell, 보안취약점 등을 분석
- 기타 정적분석 툴: PMD, FindBugs, CheckStyle
다운로드 및 설치
- JDK 1.8 기준 테스트
wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.8.zip
// non-root user(root user로 실행 불가)
unzip ./sonarqube-7.8.zip
// 실행 옵션 [console | start | stop | force-stop | restart | status | dump]
sonarqube-7.8/bin/linux-x86-64/sonar.sh console
- localhost:9000 접속, 디폴트 계정: admin/admin
Maven 프로젝트 정적분석
- Maven의 settings.xml 파일에 SonarQube 서버 설정 추가
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
https://maven.apache.org/xsd/settings-1.0.0.xsd">
<pluginGroups>
<pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
</pluginGroups>
...
<profiles>
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!-- Optional URL to server. Default value is http://localhost:9000 -->
<sonar.host.url>
http://localhost:9000
</sonar.host.url>
</properties>
</profile>
</profiles>
</settings>
- 프로젝트 디렉토리(pom.xml 이 존재하는 디렉토리)에서 Maven Goal을 실행
$ mvn sonar:sonar // 프로젝트 파일들에 대한 접근 권한 필요
- 접속 확인
Jenkins 연동
1. SonarQube 프로젝트 생성
2. SetUp 클릭 후 토큰 생성(생성된 토큰은 Jenkins 구성 시 활용)
3. Jenkins WebHook 등록
- Jenkins에서 요청한 정적분석 후 결과를 Jenkins Webhook으로 알려줌으로써 Jenkins QualifyGate로 응답 수신
- WebHook URL 형식: http://{JENKINS_URL}:{JENKINS_PORT}/sonarqube-webhook/
4. Jenkins 설정
- SonarQube Scanner, Sonar Quality Gates 플러그인을 설치
- Jenkins 관리 > 시스템 설정 > SonarQube servers에서 SonarQube Server 정보를 등록
- 'Server authentication token'은 Credentials 관리에서 'Secret text' 타입으로 생성
(SonarQube 프로젝트에서 생성한 Token입력)
- Jenkins 관리 > Global Tool Configuration > SonarQube Scanner에서 SonarQube Scanner 정보 등록, Install Automatically
- Jenkins Pipeline 구성 방법
stages {
stage('checkout'){
steps {
echo 'start checkout...'
checkout ([
$class: 'GitSCM',
branches: [[name: '*/master']],
userRemoteConfigs: [[
credentialsId: 'gitlab_account',
url: 'http://gitlab.myable.net:8989/demo/spring-boot-jsp.git']]
])
}
}
stage('SonarQube Analysis') {
steps{
withSonarQubeEnv('sonarqube_local'){ // 시스템설정 값
sh "mvn clean package"
sh "mvn sonar:sonar -Dsonar.projectKey=jenkins_prj -Dsonar.host.url=http://localhost:9000 -Dsonar.login=61344cd942bff25b06f56a8b0d6768xxxxxxxx"
}
}
}
// SonarQube분석 결과 응답 대기
stage('SonarQube Quality Gate'){
steps{
timeout(time: 1, unit: 'MINUTES') {
script{
def qg = waitForQualityGate() // 결과 반환까지 파이프라인 중단
echo "Status: ${qg.status}"
if(qg.status != 'OK') {
echo "NOT OK Status: ${qg.status}"
updateGitlabCommitStatus(name: "SonarQube Quality Gate", state: "failed")
error "Pipeline aborted due to quality gate failure: ${qg.status}"
} else{
echo "OK Status: ${qg.status}"
updateGitlabCommitStatus(name: "SonarQube Quality Gate", state: "success")
}
}
}
}
}
- Non-Pipeline 구성 방법
- Task to run : 옵션 항목이며 필요한 경우 설정
- JDK : 프로젝트에서 사용하고 있는 JDK 버전을 선택(선택 항목에 없다면 Jenkins 관리▶ Global Tool Configuration 에서 설치)
- Path to project properties : 옵션 항목이며 sonar-project.properties 파일 지정 시 설정
- Analysis properties : SonarQube에 프로젝트를 등록하고 분석하는데 필요한 프로퍼티 정보
- sonar.projectKey: 소나에서 관리 할 프로젝트 키, 양식: [prefix : suffix] 형태(ex. my:project)
- sonar.projectName: 프로젝트 명칭
- sonar.projectVersion: 프로젝트 버전
- sonar.sources
Jenkins에서 빌드 된 소스 파일의 경로를 설정(Jenkins의 프로젝트 기본 경로 다음의 경로)
ex) myproject/src/main/java
(/var/lib/jenkins/job/project/workspace 뒤의 경로를 지정, workspace까지는 기본 경로)
'개발 > SpringBoot' 카테고리의 다른 글
java 어플리케이션 실행 시 JVM args(JAVA_OPTS) 적용 (0) | 2021.12.08 |
---|---|
SpringBoot Jsaypt 사용 application.yml 암호화 (0) | 2021.12.03 |
SpringBoot jar를 타 프로젝트에 Dependency 라이브러리로 추가 (0) | 2021.12.03 |
SpringBoot Scouter APM 구성 (0) | 2021.11.30 |
SpringBoot @Async 사용 (0) | 2021.10.27 |
댓글