SonarQube 와 Jenkins 서버를 가지고 있다는 전제 하에 시작되는 이야기입니다.
개인이 아닌 팀 규모의 개발팀에서는 보통 CI 관련하여 Jenkins 등을 많이 사용하고 있습니다.
이 Jenkins
에 SonarQube
를 활용하여 사용하는 이야기 입니다.
먼저 시나리오를 써봅니다. 어떤 시나리오냐?
Jenkins 와 SonarQube 를 언제 어떤 용도로 사용하느냐에 대한 시나리오 입니다.
보통은 소스 관리를 하기 위해 GitHub, GitLab 등을 사용을 합니다.
그러면 보통은 아래와 같은 구성들이 나오겠죠
- GitHub - Jenkins - SonarQube
- GitLab - Jenkins - SonarQube
제가 사용하던 동작 흐름은 아래와 같습니다.
- 소스 작업 commit 후 push
- GitLab 에서 변화 감지후 Jenkins로 WebHook 발생
- Jenkins에서 WebHook 인지 후 소스 pull 후 build
- build 완료 후 deploy
이 중에 build 전후로 SonarQube 를 추가해보기로 합니다.
그러기 위해서 Jenkins에서 SonarQube 를 연동하는 법을 정리해봅니다.
제가 알아본 방법은 크게 2가지가 있었습니다.
- Jenkins Plugin 으로 사용하는 방법
- gradle Task 추가 후 사용하는 방법
1. Jenkins Plugin 사용하는 방법
먼저 Jenkins 에 SonarQube Scanner 플러그인을 설치합니다.
SonarQube Scanner for Jenkins
Jenkins 관리
- 플러그인 관리
- SonarQube Scanner for Jenkins
설치
(https://plugins.jenkins.io/sonar)
그리고 적용하려는 프로젝트 구성에 SonarQube 연동하는 스텝을 추가합니다.
Jenkins
- 프로젝트
- 구성
- Add build step
- Execute SonarQube Scanner
추가
Analysis properties
작성
아래 이미지와 같이 작성하며, 아래 요소들을 주의하여 작성합니다.
- sonar.host_url : SonarQube 서버 url 및 port
- sonar.login : SonarQube ID 혹은 token
- sonar.password : SonarQube Password (ID에서 token 사용시는 공백)
- sonar.projectKey : SonarQube 프로젝트 값 참조
- sonar.projectName : SonarQube 프로젝트 값 참조
- sonar.java.binaries : Jenkins workspace 내에서 컴파일 후 생성된 class binary 경로
- sonar.profile : SonarQube 프로젝트 값 참조
- sonar.coverage.jacoco.xmlReportPaths : Jenkins workspace 내에서 JaCoCo Report 생성 경로 (JaCoCo 미사용시 skip)
위 Step을 추가 후 빌드를 돌려봅니다.
빌드가 잘 되었으면 콘솔 로그도 한번 구경해봅니다.
+) Coverage Report를 작성해주는 JaCoCo 플러그인도 있습니다.
JaCoCo plugin
Jenkins 관리
- 플러그인 관리
- JaCoCo plugin
설치
(https://plugins.jenkins.io/jacoco)
적용하려는 프로젝트 구성에 Coverage Report를 작성하는 스텝을 추가합니다.
Jenkins
- 프로젝트
- 구성
- Add build step
- Record JaCoCo coverage report
추가
아래의 항목들을 추가 작성합니다.
-
Inclusions (e.g.: **/*.class)
: **/*.class -
Exclusions (e.g.: **/*Test*.class)
: **/R.class, **/R$*.class, **/BuildConfig.*, **/Manifest*.*, com/android/**/*.class
변경한 구성을 저장 후 빌드를 진행해 봅니다.
빌드가 성공하였다면 역시나 콘솔 로그를 확인해봅니다.
2. gradle Task 추가 후 사용하는 방법
먼저 Android 앱 소스에 gradle Task 추가하는 방법은 아래 링크를 참고하시면 됩니다.
- SonarQube : https://nobase-dev.tistory.com/279
- JaCoCo : https://nobase-dev.tistory.com/278
그리고 Jenkins 프로젝트 구성에서 아래와 같이 gradlew 명령을 직접 써주시면 됩니다.
Jenkins
- 프로젝트
- 구성
- Add build step
- Execute shell
추가
chmod +x gradlew
# JaCoCo 커버리지 리포트 작성
./gradlew coverageReport
# SonarQube 분석
./gradlew sonarqube
빌드 후 확인을 해봅니다.
3. 2가지 방법의 차이?
먼저 플러그인을 사용하면 프로젝트 소스 레벨에서 추가할 부분이 없습니다.
그리고 Jenkins 프로젝트 상태 화면에 관련 UI도 이쁘게 생긴답니다.
하지만 JaCoCo플러그인 은 빌드 후 조치
구성에서만 추가가 가능하였고, Build
구성에는 추가가 불가하였습니다. SonarQube 플러그인은 Build
구성에서만 추가가 가능하였고요.
(Jenkins 프로젝트가 Maven 프로젝트였다면 다 가능한 걸로 보였습니다.)
gradle Task 방식으로 진행하면 Excute shell
항목에서 SonarQube, JaCoCo 사용이 자유롭게 가능합니다.
하지만 프로젝트 소스 레벨에서 gradle Task를 추가해야 했으며, Jenkins 프로젝트 상태 화면도 다시 평범해졌습니다.
두 방식을 사용시 장단점들이 있는 상태였습니다.
그 후...
저 이 후로 GitLab MergeRequest 시 Jenkins가 위 동작들을 처리 후 SonarQube 결과를 GitLab에 MR 메세지로 남길 수 있지 않을까 했습니다만...
특히나 검색해보니 GitHub 플러그인 사용시 아래와 같이도 사용이 가능해 보였습니다.
하지만 제가 써야 하는 건 GitLab 이었고, GitLab 플러그인은 지원이 중단되었습니다...
정확히는 기존에 있던 개인 개발자가 만들던 플러그인이 SonarQube 7.7 버전부터 중단되었습니다.
https://github.com/gabrie-allaigre/sonar-gitlab-plugin/issues/222
위 링크의 코멘트나 아래 링크를 보면 GitLab과 콜라보레이션을 위해 SonarQube 에서 플러그인 지원을 중단한 것으로 보입니다...
아쉬운 대로 Jenkins에서 빌드 후 조치
에 GitLab 관련된 플러그인 기능을 사용해 보았지만.... 이렇네요..
네 그래서 일단은 접었습니다.
추후에 여유가 생긴다면 다른 방법들을 생각해보던지 해야겠습니다.
'IT > ETC' 카테고리의 다른 글
Eclipse Copilot (0) | 2024.10.17 |
---|---|
Copilot 리서칭 (1) | 2024.10.17 |
[SonarQube] SonarQube 도입기? (0) | 2020.02.07 |
[Docker] Docker란? (0) | 2018.03.23 |
Expert Beginner란... (0) | 2018.03.12 |