본문 바로가기
개발/SpringBoot

SonarQube 설치 및 구성

by 궁즉변 변즉통 통즉구 2021. 11. 30.
반응형

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까지는 기본 경로)

 

반응형

댓글