[프로세스/관리]코드품질관리를 위한 젠킨스+Sonar 연동과 유닛테스트결과 리포팅

사내 CI툴로 젠킨스를 쓰고 있던 중, 혹시 이걸로 전체 유닛테스트 결과도 볼 수 있을까

하는 의문으로 시작해 이것저것 찾아보던 중, 코드품질관리를 해주는 오픈소스 프로젝트인

Sonar를 알게 되었다.

처음으로 CI툴을 만져보는지라 이때부터 삽질은 시작되었다.

(1) 젠킨스 버전 업그레이드

1.4 초반버전대로 동작하고 있던 기존 젠킨스에선 Sonar 플러그인이 정상작동하지 않아

젠킨스를 최신버전(1.518)으로 업데이트 하는 작업부터 진행하였다.

업그레이드는 간단하다. Jenkins 관리메뉴에서 새 버전의 jenkins.war를 다운받아

톰켓 Deploy 경로에 풀어주면  된다. 기존 내용을 그대로 유지한채 버전업된다.

(2) Sonar 관련 설정하기

버전업을 하니 젠킨스에 Sonar 플러그인이 자동으로 설치되었다.

다음으로 프로젝트 분석을 담당할 Sonar 서버를 세팅할 차례이다.

젠킨스의 관리메뉴에서 Sonar 부분을 설정한다.

jenkins13

(3) 젠킨스에 분석할 프로젝트 설정하기

이제 젠킨스에서 분석할 프로젝트를 만들고, 설정에서 Build Environment의

Pre build script에서 빌드를 실행할 스크립트를 적는다.

그리고 Sonar 분석을 위해 Build의 Add build step에서 Invoke Standalone Sonar Analysis

를 선택해서 Project properties에 설정을 추가한다.

jenkins12


################# Project properties #############################
# required metadata
sonar.projectKey=test
sonar.projectName=test-web
sonar.projectVersion=1.0

# path to source directories (required)
sonar.sources=src/main/java

# path to test source directories (optional)
sonar.tests=src/test/java

# path to project binaries (optional), for example directory of Java bytecode
sonar.binaries=build/classes

# optional comma-separated list of paths to libraries. Only path to JAR file and path to directory of classes are supported.
#sonar.libraries=path/to/library.jar,path/to/classes/dir

# The value of the property must be the key of the language.
sonar.language=java

# Additional parameters
#sonar.my.property=value

(4) 프로젝트 소스 옮기기

이젠 분석할 프로젝트의 소스파일(원래자바파일+테스트코드+클래스파일)을

Project properties에 설정한대로, 젠킨스에서 생성한 해당 job의 workspace 밑에

아래와 같은 구조로 해당 위치에 복사해서 넣어둔다.

난, 이 작업을 배포스크립트를 수정해서 처리했다.

workspace/src/main/java/원래자바파일들

workspace/src/test/java/테스트코드들

workspace/build/classes/클래스파일들

(5) 분석할 프로젝트의 빌드 실행

분석할 프로젝트의 빌드와 Sonar분석관련한 설정을 모두 마쳤으니 빌드를

실행하는 일만 남았다.

빌드를 실행하면 빌드가 끝난 후,  Sonar가 해당 프로젝트를 분석하여

데이터를 DB에 저장하고, 설정한 Sonar서버에 그 결과를 예쁘게

뿌려준다.

Rules compliance(RCI)를 통해 해당 프로젝트가 얼마나 규칙을 지키고

있는지 백분율로 표시해준다. 

그 밖에, 상세화면으로 들어가면 Violations의 Severity를 다섯단계로 나누어

어떤 부분을 고치면 되는지 자세히 어드바이스 해준다(Blocker/Critical/Major/Minor/Info)

jenkins14

(6) 테스트커버리지 대신 유닛테스트 결과 리포팅 

원래 목적인 전체적인 유닛 테스트 결과를 보려고 했던 것이 너무 멀리 와버렸다.

이제 다시 본래 목적으로 돌아가서 유닛테스트 결과를 어떻게 볼까 방법을 찾던 중,

Gradle에서 Sonar Runner Plugin이라는 훌륭한 놈을 발견했다. 아싸!

젠킨스에서 테스트커버리지를 못 본 아쉬움을 뒤로하고 이 놈을 재빠르게 적용해보기로

했다. 일단 Gradle 빌드 스크립트에서 Sonar Runner 관련 설정을 추가한다.


apply plugin: 'sonar-runner'

sonarRunner {
sonarProperties {
property "sonar.host.url", "http://localhost:9000/"
property "sonar.jdbc.url", "jdbc:mysql://localhost:3306/sonar?          useUnicode=true&characterEncoding=utf8"
property "sonar.jdbc.driverClassName", "com.mysql.jdbc.Driver"
property "sonar.jdbc.username", "test"
property "sonar.jdbc.password", "test"
property "sonar.sourceEncoding", "UTF-8"
}
 }

이제 task 실행명령만 내리면 된다.

gradle sonarRunner

빌드가 완료되면 해당프로젝트 밑에 reports\tests 밑에 각각의 유닛테스트 결과와

함께 index.html에 전체적인 유닛테스트결과가 나온다.

정말 간단한 설정만으로, 전체적인 유닛테스트 결과를 볼 수 있게 되었다.

jenkins15

(7)  마치며..

“전체적인 유닛테스트결과를 보고싶다”라는 욕구(!)에서 시작해서 처음으로

CI툴인 젠킨스를 만지는 것에서부터 시작했지만, 역시나 쉽지는 않은 작업이었다.

젠킨스 버전업부터 시작해서 프로젝트 소스를 옮기기 위한 배치스크립트 수정작업,

그리고 테스트커버리지가 나오지 않아 낙담하고 있다가 우연히 Sonar Runner plugin을

보고 적용한 후 실행결과를 보며 희열을 느낀 것 등등..

Sonar의 분석결과도 여러모로 앞으로 지속적인 리팩토링을 통한 코드개선으로

최종적으로는 설계도 개선되는 효과를 얻는데 큰 몫을 할 것이지만, 그보다 더 좋은 것은

역시나 전체적인 유닛테스트 결과를 한 눈에 일목요연하게 볼 수 있게 되었다는 점이다.

꾸준하게 나쁜 냄새가 나는 기존 코드를 리팩토링하면서 이를 뒷받침해주는 테스트코드의

신뢰성은 백번 천번 강조해도 지나치지 않다고 생각한다.

이제, 더욱 강력해진 툴들을 가지고 기쁜 마음으로 리팩토링을 하고 테스트코드를 만들면서

다음 스텝에는 “테스트커버리지 리포팅“이라는 끝판왕에 한번 도전해 볼 생각이다.

Advertisements

[프로세스/관리]코드품질관리를 위한 젠킨스+Sonar 연동과 유닛테스트결과 리포팅”에 대한 3개의 생각

  1. 핑백: [2013]올해를 마치며.. 회고 | To the Professional Programmer

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중