본 문서는 SonarQube를 GitLab 및 Jenkins와 연동하여 GitLab Merge Request 페이지에서 SonarQube의 Merge Request 분석 결과를 확인할 수 있는 기능(Decoration)에 대한 설정 가이드입니다.
사전 설정
Merge Request Decoration 설정
Multibranch Pipeline Job 생성
Jenkins Dashboard 왼쪽 메뉴 - 새로운 Item을 클릭합니다.
Multibranch Pipeline 유형 선택 후, 프로젝트 이름을 입력하고 OK를 클릭합니다.
Branch Sources 섹션에서 Add source > GitLab Project를 선택합니다.
GitLab Project 정보를 입력합니다.
Server: GitLab Server를 선택합니다.
Checkout Credentials: GitLab 접근을 위한 인증 정보를 선택하거나 추가합니다.
Owner: GitLab 사용자 또는 그룹명을 입력합니다.
Projects: 대상 프로젝트를 선택합니다.
Behaviors에서 다음과 같이 설정합니다.
Discover branches: Only branches that are not also filed as MRs을 선택합니다.
Discover merge requests from origin: The current merge request revision을 선택합니다.
Ref Spec 지정을 위해 Add 클릭하여 Specify ref specs를 선택합니다.
다음과 같이 설정합니다.(기본값)
Specify ref specs: +refs/heads/*:refs/remotes/@{remote}/*
GitLab Webhook 추가
GitLab Project > Settings > Webhooks로 이동합니다.
Add new webhook을 클릭합니다.
다음 정보를 입력합니다.
URL: JENKINS_SERVER_URL/gitlab-webhook/post
Trigger에서 다음 항목을 체크합니다.
Push events
Merge request events
Add webhook을 클릭하여 webhook을 추가합니다.
Jenkinsfile 생성
빌드 도구/언어에 따라 다른 옵션을 추가합니다. 아래는 maven에 대한 Jenkinsfile 설정입니다.
Gitlab 저장소에 아래 코드를 추가하여 Jenkinsfile을 생성합니다.
node { stage('SCM') { checkout scm } stage('SonarQube Analysis') { def mvn = tool 'maven'; withSonarQubeEnv() { sh "${mvn}/bin/mvn clean verify sonar:sonar -Dsonar.projectKey=sonarqubetest_sonarqube-multi-pipeline-test_fdb755e4-32e3-4e0e-a820-bd1ddec62015 -Dsonar.projectName='sonarqube-multi-pipeline-test'" } } }
def mvn = tool 'Default Maven'; : Jenkins 관리 > Tools에 미리 정의된 Maven 이름을 사용해야 합니다.
-Dsonar.projectKey=YOUR_PROJECT_KEY: SonarQube의 프로젝트 키 값을 입력합니다.
-Dsonar.projectName='YOUR_PROJECT_NAME': SonarQube의 프로젝트 이름을 입력합니다.
Merge Request 분석 확인
새로운 Merge Request를 생성하여 Jenkins 빌드 실행을 확인합니다.
SonarQube Overview페이지에서 분석 결과를 확인합니다.
Gitlab Merge Request페이지에서 SonarQube 분석 정보가 정상적으로 표시되는지 확인합니다.
품질게이트가 실패할 경우 Merge 방지
SonarQube 품질 게이트가 실패하면 Jenkins 파이프라인이 자동으로 실패하도록 설정하고, GitLab에서 모든 파이프라인이 성공해야만 Merge가 가능하도록 조건을 적용하여 품질 게이트 실패 시 Merge되는 것을 방지할 수 있습니다.
Jenkins에서 SonarQube 품질 게이트 실패 시 파이프라인 자동 실패 처리
SonarQube 서버에서 프로젝트에 대한 웹훅을 추가합니다.
URL에 <yourJenkinsInstance>/sonarqube-webhook/를 입력합니다.
Jeknins 파일에 아래와 같이 waitForQualityGate단계를 추가합니다.
- Scripted pipelinenode { stage('SonarQube analysis') { withSonarQubeEnv('<sonarqubeInstallation>') { sh 'mvn clean verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar' } // submitted SonarQube taskId is automatically attached to the pipeline context } } // No need to occupy a node stage("Quality Gate"){ timeout(time: 1, unit: 'HOURS') { // Just in case something goes wrong, pipeline will be killed after a timeout def qg = waitForQualityGate() // Reuse taskId previously collected by withSonarQubeEnv if (qg.status != 'OK') { error "Pipeline aborted due to quality gate failure: ${qg.status}" } } }
GitLab Merge Request에서 모든 Pipeline 성공 조건 설정
GitLab 프로젝트의 Settings > General > Merge requests로 이동합니다.
Merge checks 섹션에서 Pipelines must succeed를 선택합니다.
Save changes를 클릭하여 변경 사항을 저장합니다.
품질게이트 실패 시, Jenkins 파이프라인이 실패하며 GitLab에서 Merge가 Block됩니다.