티스토리 뷰

반응형

SonarQube 유료 버전의 기능으로 Pull Request에 대해 정적 분석 코멘트를 남겨주는 Pull Request Decoration이 있습니다. 하지만 무료 플러그인을 사용하면 유료 버전이 아니여도 해당 기능을 사용할 수 있는데, 이번에는 해당 작업 과정을 살펴보도록 하겠습니다.

 

 

 

 

1. 소나큐브 PR 데코레이션 소개 및 동작 흐름


[ PR 데코레이션 소개 ]

SonarQube 유료 버전의 기능으로 Pull Request에 대해 정적 분석 코멘트를 남겨주는 Pull Request Decoration이 있다. 해당 기능은 다음과 같이 작성한 Pull Request에 대해 정적 분석한 정보를 보여준다.

 

 

추가로 GitHub의 작업 내역에서 다음과 같이 분석한 내용을 볼수도 있다.

 

문제는 이러한 기능이 기본적으로 유료 버전에서만 사용가능하다는 것이다. 하지만 무료 플러그인을 사용하면 유료 버전을 사용하지 않아도 해당 기능을 사용할 수 있는데, 이번에는 해당 작업 과정을 살펴보도록 하자.

 

 

[ PR 데코레이션 동작 흐름 ]

PR Decoration에 대한 기본적인 동작 흐름은 다음과 같다. 아래의 과정을 알고 있어야 올바르게 설정을 진행할 수 있다. 그러므로 아래의 흐름을 반드시 읽고 설정을 진행하도록 하자.

  1. 작업한 내용 Push 및 GitHub에서 PR 작성
  2. GitHub이 Jenkins로 Job 실행에 대한 웹훅 전송
  3. Jenkins가 타겟 브랜치에 대한 Sonar Scanner 실행 전달 및 Sonar Qube 분석 시작
  4. SonarQube가 분석 결과를 Jenkins로 전달
  5. SonarQube가 분석 결과에 대한 PR Decoration을 GitHub App에게 전달
  6. GitHub App이 PR에 코멘트 작성

 

 

 

[ 요구사항 ]

  • 소나큐브 버전 8.6 이상
  • Jenkins 2.2.70 이상

아래의 내용대로 설정을 진행하려면 소나큐브 버전은 8.6 이상, 젠킨스 버전은 2.2.70 이상이 되어야 한다. 만약 이 조건을 충족시켜주지 못한다면 버전을 높여주도록 하자.

 

 

소나큐브 버전 올리기

아래의 내용대로 PR 데코레이션을 하기 위해서는 소나큐브 버전이 8.6 이상이 되어야 한다. 만약 소나큐브 버전이 낮다면 버전을 높여주도록 하자. 이전 버전도 가능은 한 것 같은데, 설정 화면이 달라서 맞춰주는 것이 좋다.

버전을 높이는 것은 간단하다. 버전을 높인 소나큐브를 설치한 다음에 {소나큐브URL}/setup으로 접속해서 DB 마이그레이션을 해주면 된다.

ex) http://127.0.0.1:9000/setup.

 

 

만약 소나큐브가 8.6 이상이라면 ALM Integrations가 보여야한다. 추가로 하단에서 버전 정보를 확인할 수 있으니, 참고하도록 하자.

 

 

젠킨스 버전 올리기

1. yum으로 설치한 경우

젠킨스 버전을 올리는 것도 간단하다. 만약 yum으로 install 했다면 젠킨스 실행을 종료한 후에 yum update를 해주면 된다.

sudo service jenkins stop
sudo yum update jenkins -y

 

 

만약 public key가 없다는 에러 메세지가 나온다면 아래의 명령어를 실행한 후에 다시 업데이트를 하면 된다.

sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key

 

 

 

2. 직접 다운로드해서 설치한 경우

젠킨스는 war 파일로 실행되므로 war 파일만 최신 버전으로 교체해주면 된다. 가장 최신의 LTS 젠킨스의 war 파일을 받은 후에 젠킨스가 다운로드된 디렉토리로 옮겨주도록 하자. 그리고 실행하면 업데이트가 마무리 된다.

wget http://mirrors.jenkins-ci.org/war-stable/latest/jenkins.war
mv {다운받은war경로} {젠킨스가설치된war경로}

 

 

 

 

2. PR 데코레이션 설정 진행


[ 1. 플러그인 설치 ]

PR 데코레이션 기능을 사용하기 위해서는 소나큐브 버전에 맞는 올바른 버전의 플러그인을 설치해야 한다.

이 링크를 통해 Git 주소로 들어가면 소나큐브 버전에 맞는 플러그인 버전이 나와있는데, 해당 버전의 파일을 소나큐브 서버에 받으면 된다. 아래의 예시 코드들과 버전이 다르면 버전 정보를 변경해주도록 하자.

wget https://github.com/mc1arke/sonarqube-community-branch-plugin/releases/download/1.8.1/sonarqube-community-branch-plugin-1.8.1.jar

 

 

플러그인을 설치하는 방법은 받은 jar 파일을 extensions/plugin 폴더로 넣어주면 된다. 버전이 다르면 버전 정보를 변경해주도록 하자.

mv sonarqube-community-branch-plugin-1.8.1.jar {sonarDirectory}/extensions/plugins/

 

 

그리고 config/sonar.properties에 아래의 2가지를 추가해주면 된다. 버전이 다르면 버전 정보를 변경해주도록 하자.

sonar.web.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.8.1.jar=web
sonar.ce.javaAdditionalOpts=-javaagent:./extensions/plugins/sonarqube-community-branch-plugin-1.8.1.jar=ce

 

 

그리고 소나큐브를 재시작한 후에 접속하면 외부 플러그인을 쓸꺼냐고 나오는데 accept를 눌러주면 된다. 그리고 설치된 플러그인 목록에 아래와 같이 Community Branch Plugin이 정상적으로 보이면 설치가 완료된 것이다.

 

 

 

 

 

[ 2. GitHub이 Jenkins로 Job 실행에 대한 웹훅 전송 ]

만약 깃 허브에서 ghprbhook으로 이미 젠킨스 잡을 트리거하고 있다면 아래의 내용은 넘어가도 됩니다.

앞서서 GitHub이 젠킨스로 Job 실행에 대한 웹훅을 전송해 젠킨스 잡을 트리거한다고 하였다. 그러므로 깃 레포지토리 설정에서 웹훅을 보낼 젠킨스 정보를 등록해줘야 한다. 정상적이라면 다음과 같은 웹훅이 등록되어 있어야 한다.

  • 웹훅 URL: ${젠킨스 주소} + "/jenkins/ghprbhook/"
  • Which events would you like to trigger this webhook?로 아래 두가지 이벤트 선택
    • Pull requests
    • Pushes

 

 

 

[ 3. GitHub 앱 생성 ]

SonarQube로 분석한 내용을 받기 위해서는 Github Apps를 추가해야 한다.

GitHub App은 GitHub의 Settings > Developer settings에서 New GitHub App을 통해 생성할 수 있다.

 

 

 

앱을 생성할 때 다음의 항목은 반드시 입력해주어야 한다. 그 중에서 Callback URL과 Webhook URL은 소나큐브 주소를 입력해주어야 하고, Homepage URL은 아무거나 입력해도 상관없다.

  • 앱 이름
  • Homepage URL
  • Callback URL
  • Webhook URL

 

 

 

그 다음은 앱의 권한을 설정하는 부분이다. 아래와 같이 설정을 해주면 된다.

 

 

개인 레포지토리가 아닌 다른 레포지토리들에서도 사용하려면 any account를 눌러주면 된다.

 

 

개인키까지 다운받았으면 봇의 설정 화면에서 install을 해주면 된다. 알림을 받을 레포지토리를 선택하고 인스톨해주도록 하자.

 

 

그러면 advanced에서 다음과 같이 delivery에 내용이 추가되는 것을 볼 수 있다.

 

 

 

[ 4. GitHub 앱 생성 ]

이제 SonarQube와 Github API 호출 과정에서 사용할 private key를 다운받아야 한다.

 

 

그리고 AppId, ClientId을 확인하고 ClientSecret까지 발급받으면 이제 github에서는 준비가 완료되었으므로, sonarqube에서 이 값을 이용해 GitHub와 연동 설정을 해주도록 하자.

 

 

소나큐브의 Administration > Configuration > General Settings에서 ALM Integrations를 설정해주어야 한다. 소나큐브에서 API를 보낼 깃허브 앱 정보라고 생각하면 된다. 하위의 이미지처럼 Create Configuration을 눌러주면 앱 정보를 입력하는 화면이 나온다.

 

 

 

앞서 깃허브에서 얻은 정보들을 입력하고 연동을 하면 다음과 같이 체크 표시가 나온다. 그러면 성공적으로 GitHub와 연결된 것이다.

 

 

 

[ 5. Jenkins와 SonarQube 연동 ]

PR용 소나큐브 프로젝트 추가 및 설정

일반적인 빌드용 소나큐브와 PR용 소나큐브 프로젝트를 함께 사용하면 커버리지 수치의 확인이 불분명해진다. 예를 들어 마지막 분석 작업이 PR이였으면 기본 브랜치를 다시 빌드해주어야 한다. 그러므로 일반적으로 PR용 소나큐브 프로젝트를 따로 만들어주는 것이 좋다.

그러므로 PR용 소나큐브 프로젝트를 별도로 생성해주도록 하자. Add Project > Manually에서 직접 추가할 수 있다.

 

 

Project Key와 Display name에로는 식별가능한 프로젝트 이름을 넣어주면 된다.

 

 

그러면 다음과 같이 토큰을 생성하는 화면이 나오는데, 토큰 생성을 위한 값을 입력해주며 토큰이 발급된다. 해당 토큰은 나중에 Jenkins에서 입력되므로 보관해두도록 하자.

 

 

 

그리고 이제 새롭게 만든 PR용 프로젝트에서 GitHub의 어떤 레포지토리와 연결시켜줄 것인지 설정을 해야한다.

Project Settings > General Settings > Pull Request Decoration에서 다음과 같이 설정해주도록 하자.

 

 

 

소나 큐브 무료 버전에서 브랜치 분석은 1개의 브랜치에 대해 밖에 불가능하다. 기본적으로는 master로 설정되어있는데, 변경하기를 원한다면 Project Settings > Branches & Pull Requests에서 master로 설정된 브랜치를 분석할 기본 대상 브랜치로 변경해주도록 하자.

나의 경우에는 dev를 기준으로 PR을 작성하므로 메인 브랜치 이름을 dev로 변경하였다.

 

 

젠킨스와 연동

Jenkins에서 SonarQube를 통해 분석하기 위해서는 SonarScanner 플러그인을 설치해야 한다. SonarQubeScanner for Jenkisn 플러그인을 먼저 설치해주도록 하자.

 

 

그리고 더 설치해야하는 플러그인이 있는데, 그것은 바로 Parameterized Trigger plugin이다. 앞서 설명하였듯 젠킨스는 소나 큐브로 PR 분석에 대한 요청을 보내야 한다. 그리고 PR 분석을 위해서는 다음과 같은 3가지 정보가 필요하다.

  • sonar.pullrequest.key : PR 아이디
  • sonar.pullrequest.base : 새롭게 작성한 PR 브랜치
  • sonar.pullrequest.branch : 기존에 작성되어 머지될 PR 브랜치

이 플러그인을 설치하면 젠킨스의 빌드 파라미터로 위의 3가지를 얻을 수 있고, 이 정보를 소나큐브에게 그대로 전달해줄 수 있다.

 

 

이제 젠킨스와 소나큐브를 연동해야 한다. Global Tool Configuration > SonarQube Scanner 에서 소나 큐브 스캐너를 설치해주자.

 

 

그리고 Configure System > 시스템 설정 > SonarQube servers 에서 서버 주소를 추가해주도록 하자. 아까 소나큐브에서 발급받은 토큰을 여기에 입력해주면 된다.

 

 

젠킨스와 Job에서 소나큐브 스캐너 실행

가장 먼저 수정해야 하는 부분인 빌드 매개변수의 추가이다. General에서 다음과 같이 빌드 매개변수를 추가할 수 있다. PR 분석을 위한 다음의 3가지 String Parameter를 추가해주도록 하자.

  • ghprbPullId: PR 아이디
  • ghprbSourceBranch: 새롭게 작성한 PR 브랜치
  • ghprbTargetBranch: 기존에 작성되어 머지될 PR 브랜치

 

 

기본적인 프로젝트 Git 주소가 입력되어 있다는 가정 하에 소스 코드 관리 부분은 넘어가도록 하자. 다만 여기서 주의할 점이 있는데 파라미터로 받은 ghprbSourceBranch 브랜치로 분석을 하려면 Refspec 값이 아무것도 없어야 한다는 것이다. 해당 값이 있다면 비워두자.

 

 

그리고 빌드할 브랜치 정보를 파라미터로 받은 값으로 수정해주도록 하자.

 

 

그리고 이제 빌드 작업 이후에 소나 큐브 스캐너 실행을 추가해야 한다. 그런데 여기서 주의해야 할 점이 있는데, PR 분석을 위해서는 먼저 머지될 브랜치를 분석한 후에 PR 브랜치를 분석해야 한다는 것이다. 즉, 총 2번의 소나 스캐너 작업을 해주어야 하는 것이다.

먼저 Post Steps의 Add post-build step에서 Execute SonarQube Scanner를 통해 머지될 브랜치 분석을 먼저 추가해주도록 하자.

Task to run은 비워두면 되고, JDK는 11을 선택해주면 된다. 그리고 Analysis properties에는 분석할 때 사용할 정보를 넣어주어야 하는데, 기본적으로 sonar.branch.name, sonar.projectName, sonar.projectKey를 변경해주면 된다.

 

 

sonar.projectName=myproject
sonar.projectKey=myproject
sonar.branch.name=dev
sonar.sources=src/main
sonar.issuesReport.console.enable=true
sonar.tests=src/test
sonar.language=java
sonar.java.source=1.8
sonar.java.binaries=target/classes
sonar.junit.reportPaths=target/surefire-reports
sonar.sourceEncoding=UTF-8

 

 

앞서 설명해주었듯 무료 버전에서는 1개의 브랜치에 대해서만 PR 분석이 가능하므로, 위의 경우에는 dev로 고정해두었다. 만약 기본 브랜치가 다르다면 상황에 맞게 수정해주면 된다. 또한 위의 설정에서는 자바 버전 역시 1.8로 되어있으므로 올바르게 수정해주면 된다.

 

그 다음으로는 PR 브랜치에 대한 소나 스캐너 작업을 추가해야 한다. 마찬가지로 Execute SonarQube Scanner를 추가해주고, Anaylysis properties를 조금 변경해주도록 하자. 먼저 sonar.branch.name을 제거해주어야 한다. 만약 PR 브랜치 분석에 sonar.branch로 시작하는 값이 전달되면 PR 분석이 아닌 해당 브랜치에 대한 분석이 진행된다. 대신 다음의 3가지 값을 넘겨주어야 한다.

  • sonar.pullrequest.key : PR 아이디
  • sonar.pullrequest.base : 새롭게 작성한 PR 브랜치
  • sonar.pullrequest.branch : 기존에 작성되어 머지될 PR 브랜치

 

여기서 플러그인을 설치해서 받은 String 파라미터를 넘길 수 잇으므로 다음과 같이 설정해주면 된다.

 

sonar.projectName=myproject
sonar.projectKey=myproject
sonar.pullrequest.key=${ghprbPullId}
sonar.pullrequest.base=${ghprbTargetBranch}
sonar.pullrequest.branch=${ghprbSourceBranch}
sonar.sources=src/main
sonar.issuesReport.console.enable=true
sonar.tests=src/test
sonar.language=java
sonar.java.source=1.8
sonar.java.binaries=target/classes
sonar.junit.reportPaths=target/surefire-reports
sonar.sourceEncoding=UTF-8

 

 

 

젠킨스는 소나큐브로부터 정적 분석 결과를 받기 위해 웹훅을 날릴 것 인데, 소나큐브에서 Jenkins로 훅을 보낼 Webhook URL을 등록해주어야 한다. Administration > Configuration > Webhooks에서 모든 프로젝트에 설정되도록 글로벌 설정으로 추가해주도록 하자.

  • ${JENKINS_URL}/sonarqube-webhook/

 

 

 

 

[ 6. PR 데코레이션 확인 ]

그리고 PR을 작성해보면 다음과 같이 분석 후에 알림이 오는 것을 확인할 수 있다. 만약 머지 제한을 하고자 한다면 설정에서 가능하므로 필요에 따라 추가해주도록 하자.

 

 

 

반응형
댓글
댓글쓰기 폼
반응형
공지사항
Total
2,853,164
Today
315
Yesterday
4,328
TAG
more
«   2022/08   »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
글 보관함