본 문서는 SonarQube를 GitLab 및 Jenkins와 연동하여 GitLab Merge Request 페이지에서 SonarQube의 Merge Request 분석 결과를 확인할 수 있는 기능(Decoration)에 대한 설정 가이드입니다.



사전 설정

  1. GitLab에 관리자 계정으로 로그인합니다.

  2. 프로필 사진을 클릭한 후 Edit Profile을 선택합니다.

  3. 왼쪽 메뉴에서 Access Tokens를 선택한 후, Add new token을 클릭합니다.

  4. 다음 정보를 입력합니다.

    • Token Name: “SonarQube Integration Token"과 같이 쉽게 인식 가능한 이름을 입력합니다.

    • Expiration date: 만료일을 설정합니다. (선택 사항)

    • Select Scopes: 분석할 저장소에 대한 API scope를 선택합니다.

  5. Create personal access token을 클릭 후 생성된 토큰을 저장합니다.

  1. SonarQube에 관리자 계정으로 로그인합니다.

  2. Administration > Configuration > General Settings > DevOps Platform Integrations로 이동합니다.

  3. GitLab 탭에서 Create configuration을 클릭합니다.

  4. 다음 정보를 입력합니다.

    • Configuration name: 프로젝트 레벨에서 GitLab 설정을 식별하는 이름입니다.

    • GitLab API URL: GitLab API URL을 입력합니다. 예: https://gitlab.com/api/v4

    • Personal Access Token: GitLab에서 생성한 토큰 정보를 입력합니다.

  5. Save configuration을 클릭 후, Chenk Configuration을 실행하여 연결이 정상적으로 실행되는지 확인합니다.

  1. SonarQube에 관리자 계정으로 로그인합니다.

  2. 프로필 사진을 클릭하여 My Account > Security > Generate Tokens로 이동합니다.

  3. 다음 정보를 입력합니다.

    • Name: “Jenkins Token"과 같이 쉽게 인식 가능한 이름을 입력합니다.

    • Type: Token Type을 설정합니다.

    • Expires in: 만료일을 설정합니다.

  4. Generate를 클릭 후 생성된 토큰을 저장합니다.

  1. SonarQube Scanner 플러그인을 설치

    1. Jenkins Dashboard에서 Jenkins 관리 > Manage Plugins로 이동합니다

    2. SonarQube Scanner 플러그인을 검색 후 설치합니다.

  2. SonarQube Credential 등록

    1. Jenkins Dashboard에서 Jenkins 관리 > Security - Credentials > System으로 이동합니다.

    2. System에서 Global credentials(unrestricted)클릭 후 +Add Credentials을 클릭합니다.

    3. 다음 정보를 추가합니다.

      • Kind: Secret text

      • Scope: Global

      • Secret: SonarQube Token 입력

      • ID: Credential ID

      • Description: 설명 추가 가능 (선택 사항)

    4. Create 클릭하여 새로운 credential을 추가합니다.

  3. SonarQube Server 정보 등록

    1. Jenkins Dashboard에서 Jenkins 관리 > System으로 이동합니다.

    2. SonarQube Server 섹션에서 Add SonarQube를 클릭합니다.

    3. 다음 정보를 추가합니다.

      • Environment variables : 체크 시, SonarQube 관련 환경 변수가 자동으로 설정됩니다.

      • Name: SonarQube Server 이름을 입력합니다.

      • Server URL: SonarQube 서버 주소를 입력합니다.

      • Server authentication token: 2.에서 등록한 SonarQube Token을 선택합니다.

    4. 저장을 클릭하여 설정을 적용합니다.

  1. GitLab에 관리자 계정으로 로그인합니다.

  2. 프로필 사진을 클릭한 후 Edit Profile > Access Tokens > Add new token을 클릭합니다.

  3. 다음 정보를 입력합니다.

    • Token Name: “Jenkins Integration Token"과 같이 쉽게 인식 가능한 이름을 입력합니다.

    • Expiration date: 만료일을 설정합니다. (선택 사항)

    • Select Scopes: 분석할 저장소에 대한 API scope를 선택합니다.

  4. Create personal access token을 클릭하여 token을 생성합니다.

  5. 생성된 토큰 정보를 따로 저장합니다.

  1. GitLab Branch Source Plugin 플러그인 설치

    1. Jenkins Dashboard에서 Jenkins 관리 > Manage Plugins로 이동합니다

    2. GitLab Branch Source Plugin 플러그인을 검색 후 설치합니다.

      • GitLab Branch Source Plugin : Multi-Branch pipline, Merge Request 환경변수 자동 감지

  2. GitLab Credential 등록

    1. Jenkins Dashboard에서 Jenkins 관리 > Security - Credentials > System으로 이동합니다.

    2. System에서 Global credentials(unrestricted)클릭 후 +Add Credentials을 클릭합니다.

    3. 다음 정보를 추가합니다.

      • Kind: GitLab Personal Access Token

      • Scope: Global

      • Token: GitLab Token 입력

      • ID: Pipeline에서 참조할 Credential ID

      • Description: 설명 추가 가능 (선택 사항)

    4. Create 클릭하여 새로운 credential을 추가합니다.

  3. GitLab Server 정보 추가

    1. Jenkins Dashboard에서 Jenkins 관리 > System으로 이동합니다.

    2. GitLab 섹션에서 추가를 클릭합니다.

    3. 다음 정보를 추가합니다.

      • Display Name:  연결 이름

      • Server URL: GitLab 서버 주소

      • Credentials: Jenkins에 등록된 GitLab Token 사용

      • Web Hook: Manage Web Hook 체크

    4. Test connection을 클릭하여 연결 확인 후 설정을 저장합니다.


Merge Request Decoration 설정

  1. Multibranch Pipeline Job 생성

    1. Jenkins Dashboard 왼쪽 메뉴 - 새로운 Item을 클릭합니다.

    2. Multibranch Pipeline 유형 선택 후, 프로젝트 이름을 입력하고 OK를 클릭합니다.

    3. Branch Sources 섹션에서 Add source > GitLab Project를 선택합니다.

    4. GitLab Project 정보를 입력합니다.

      • Server: GitLab Server를 선택합니다.

      • Checkout Credentials: GitLab 접근을 위한 인증 정보를 선택하거나 추가합니다.

      • Owner: GitLab 사용자 또는 그룹명을 입력합니다.

      • Projects: 대상 프로젝트를 선택합니다.

    5. Behaviors에서 다음과 같이 설정합니다.

      • Discover branches: Only branches that are not also filed as MRs을 선택합니다.

      • Discover merge requests from origin: The current merge request revision을 선택합니다.

    6. Ref Spec 지정을 위해 Add 클릭하여 Specify ref specs를 선택합니다.

    7. 다음과 같이 설정합니다.(기본값)

      • Specify ref specs: +refs/heads/*:refs/remotes/@{remote}/*

  2. GitLab Webhook 추가

    1. GitLab Project > Settings > Webhooks로 이동합니다.

    2. Add new webhook을 클릭합니다.

    3. 다음 정보를 입력합니다.

      • URL: JENKINS_SERVER_URL/gitlab-webhook/post

    4. Trigger에서 다음 항목을 체크합니다.

      • Push events

      • Merge request events

    5. Add webhook을 클릭하여 webhook을 추가합니다.

  3. Jenkinsfile 생성

    1. 빌드 도구/언어에 따라 다른 옵션을 추가합니다. 아래는 maven에 대한 Jenkinsfile 설정입니다.

    2. 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의 프로젝트 이름을 입력합니다.

  4. Merge Request 분석 확인

    1. 새로운 Merge Request를 생성하여 Jenkins 빌드 실행을 확인합니다.

    2. SonarQube Overview페이지에서 분석 결과를 확인합니다.

    3. Gitlab Merge Request페이지에서 SonarQube  분석 정보가 정상적으로 표시되는지 확인합니다.

품질게이트가 실패할 경우 Merge 방지

SonarQube 품질 게이트가 실패하면 Jenkins 파이프라인이 자동으로 실패하도록 설정하고, GitLab에서 모든 파이프라인이 성공해야만 Merge가 가능하도록 조건을 적용하여 품질 게이트 실패 시 Merge되는 것을 방지할 수 있습니다.

  1. Jenkins에서 SonarQube 품질 게이트 실패 시 파이프라인 자동 실패 처리

    1. SonarQube 서버에서 프로젝트에 대한 웹훅을 추가합니다.

    2. URL에 <yourJenkinsInstance>/sonarqube-webhook/를 입력합니다.

    3. Jeknins 파일에 아래와 같이 waitForQualityGate단계를 추가합니다.
      - Scripted pipeline

      node {
        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}"
          }
        }
      }

  2. GitLab Merge Request에서 모든 Pipeline 성공 조건 설정

    1. GitLab 프로젝트의 Settings > General > Merge requests로 이동합니다.

    2. Merge checks 섹션에서 Pipelines must succeed를 선택합니다.

    3. Save changes를 클릭하여 변경 사항을 저장합니다.

  3. 품질게이트 실패 시, Jenkins 파이프라인이 실패하며 GitLab에서 Merge가 Block됩니다.




참고


  • 레이블 없음