Jenkins와 SonarQube 연동

Violet_Evgadn·2023년 4월 25일
0

CI&CD 자동화

목록 보기
27/28

1. SonarQube Scanner Plugin 설치

Jenkins 관리 > 플러그인 관리 > SonarQube 검색 후 설치한다.

2. Credential 등록

Credential이란 "자격증"이라는 의미로 보안 상 아무나 접근할 수 없게 막아 놓은 SSH Server나 Git Repository 등에 접속할 수 있게 해주는 출입증이다.

SSH Server에 접근하기 위한 ID & Password도 Credential이고, Tomcat에 설정했던 권한을 가지고 있는 User 설정도 Credential이다.

우리는 SonarQube에 접속하기 위한 Credentials를 등록할 것이다.

2-1. Jenkins 관리 > Mange Credentials를 클릭한다.

2-2. Domains > (global) > Add credentials 클릭

2-3. New Credentials 값 입력

우리는 이전에 SonarQube에서 발급했던 Token 값을 활용할 것이다.

이전에 말했지만 한 번 발급받은 Token은 재확인할 수 없기 때문에 만약 까먹었다면 다시 만들도록 하자.

  • Kind : Secret Text
    • ID & Password가 아닌 Token 값이므로 Secret Text를 선택
  • Scope : Global
  • Secret : SonarQube Token 값
  • ID : Credential 고유 ID
  • Description : Credential을 구분할 수 있게 해주는 이름

입력을 완료했다면 Create 버튼을 눌러 Credential을 추가하자.

3. Jenkins에 SonarQube Server 등록

Jenkins 관리 > 시스템 설정 > SonarQube Servers Section에 가서 아래와 같이 값을 입력하자.

  • Environment variables 활성화
  • Name : SonarQube Server 이름 지정
    • 나중에 Pipeline Script에서 활용할 값이므로 주의 깊게 설정하자
  • Server URL : SonarQube URL
    • 이전 설정과 마찬가지로 Jenkins 실행 위치 기준으로 잡아야 한다. 필자는 Windows에서 실행했으므로 localhost로 했지만 만약 Docker Desktop으로 실습을 진행한다면 [실행 환경 IP Address]:9000으로 입력해줘야 한다.
  • Server authenitcation token : URL 접속을 위한 Credentials
    • Select Box이기 때문에 설정했던 Credential 중 2번에서 추가했던 Credential을 쉽게 찾을 수 있다.

4. Pipeline Script 입력

이전에 생성했던 Pipeline을 재활용하거나 새로운 Pipeline을 생성하면 된다.

Pipeline Script 내용은 아래와 같다.

pipeline {
    agent any
    tools { 
      maven 'Maven3.8.6'
    }
    stages {
        stage('github clone') {
            steps {
                git branch: 'main', url: 'https://github.com/idj7183/CI-CD-project'; 
            }
        }
        
        stage('build') {
            steps {
                bat '''
                    echo build start
                    mvn clean compile package -DskipTests=true
                '''
            }
        }
        
        stage('SonarQube analysis'){
            tools{
        	    jdk "jdk11"
            }
        
            steps{
                withSonarQubeEnv('SonarQube-server'){
                    bat 'mvn sonar:sonar'
                }
            }
        }
    }
}

stage('github clone')stage('build') 부분은 이전과 동일하기에 바로 stage('SonarQube analysis')로 넘어가자.

개인적으로 불편한 게 SonarQube Server에 대한 Pipeline Syntax 기능은 존재하지 않는다.

"withSonarQubeEnv"에 대한 Pipeline Syntax 기능은 존재하지만 "Credential Key" 값을 활용하는 step만 생성해줄 뿐 우리가 설정했던 SonarQube Server를 활용하는 step 생성 기능은 지원하지 않는다.

그래서 SonarQube의 DSL문법은 외워두자.

withSonarQubeEnv('[SonarQube Servers에 등록한 Name]'){
    bat 'mvn sonar:sonar'
}

먼저 Windows이기 때문에 bat으로 설정했고 만약 Docker Desktop이나 Linux 환경이라면 "sh"로 설정해야 할 것이다.

우리는 앞에서 "mvn sonar:sonar ~" 명령을 통해 SonarQube Build를 수행했다.

~ 부분은 Host URL이나 Token 값에 대한 Parameter 였는데 이는 SonarQube Server에 이미 등록되어 있는 값이므로 "mvn sonar:sonar" 부분만 등록하면 된다.

또 주의 깊게 봐야 하는 것이 stage('SonarQube Analysis') 내부에 있는 tools 구문이다.

앞서 말했듯이 SonarQube는 Java 11 Version 이상이 여야지만 Build가 가능했다. Jenkins 실행 서버의 Java Version과 관계없이 SonarQube Build 과정을 정상 동작시키기 위해서 tools를 통해 stage에서 활용할 jdk Version을 직접 정해준 것이다.

tools { } 구문 내에 있는 "jdk11"은 Jenkins 관리 > Global Tool Configuration > JDK Section에서 지정한 Name이다.

그런데 이때 주의 깊게 봐야 하는 점이 있다.

Jenkins의 "Install Oracle Java SE Development Kit from the website"에서는 Java 9 버전까지밖에 지원을 하지 않는다.

Oracle의 Licence 때문이라고 하는데 이 때문에 Java 11 Version 이상을 설치기 위해선 다른 방법을 써야 한다. 직접 tar.gz 파일(Java 11에 대한 압축 파일)을 다운로드한 뒤 이를 압축 해제하여 활용해야 하는 것이다.

Add Installer > Extract .zip/.tar.gz을 클릭한다. 그렇다면 위 사진과 같은 창이 뜰 것인데, 이 창을 아래에 기입한 값으로 채우자.

참고로 Subdirectory는 압축 해제한 Tool을 저장하는 하위 디렉터리를 정하는데 필수 입력 사항은 아니다.

이제 모든 설정이 끝났으니 Pipeline 설정을 완료시키고 Build를 수행해보자.

5. localhost:9000에 접속하여 성공 여부 확인

업로드중..

24 seconds ago라는 문구를 보았을 때 아까 수행했던 빌드가 성공적으로 끝났음을 알 수 있다.

Failed인 이유는 이전에 일부러 에러를 발생시켰던 코드를 Git에 Push 시킨 다음 그대로 Clone 하여 Test 하느라 발생했다.

profile
혹시 틀린 내용이 있다면 언제든 말씀해주세요!

0개의 댓글