이전 회사에서 적용했던 sonaqube에 대해 정리한 내용이 있어서
블로그에 옮긴다.
SonarQube?
SonarQube는 Java, C #, JavaScript, TypeScript, C / C ++, COBOL 등 20 개 이상의 프로그래밍 언어에서 버그, 코드 냄새? (code smells) 및 보안 취약성을 탐지하기 위해 코드의 정적 분석을 통해 자동 검토를 수행하는 오픈 소스 플랫폼입니다.
프로그램의 실제 실행 없이 코드를 분석하는 것
Why
돌아가기만 하면 되는 코드’는 개발자에게도, 프로젝트에도 전혀 도움이 되지 않습니다. 잘못된 코드는 또다른 잘못된 코드를 양상하고, 떨어지는 가독성과 높아지는 복잡도 덕분에 프로젝트 코드는 시간이 지남에 따라 점점 이해하기 힘든 모습이 되어갑니다. 개발자는 더 많은 노력과 시간이 필요해 지고, 프로젝트는 언제 터질지 모르는 폭탄을 품고 살아가게 됩니다.
때문에 프로그래밍에서도 잘못된 자세를 지적해 주고 제대로 개발 할 수 있도록 이끌어줄 방법들이 필요합니다. 개발자의 필수 도서라 불리는 책들은 몇번을 읽어도 손해 볼게 없습니다.
애자일 진영에서 강조하는 페어 프로그래밍, 몹 프로그래밍이나 코드 인스펙션 활동들 역시 좋은 대안이 될 수 있습니다. 이러한 문화를 이끌어 줄 수 있는 멘토가 있다면 빠른 시간내 코드의 품질이 좋아질 수 있습니다.
문제는 ‘사람 == 시간 == 돈’ 이기 때문에 제대로 된 개발을 위해서는 그만큼 많은 비용이 필요할 수 밖에 없습니다.
결국, 이러한 부분에 대한 고민 끝에, 비용이 추가로 들지 않으면서 코드의 품질을 검토하고 잘못된 부분을 옳은 방향으로 고칠 수 있도록 멘토링하는 다양한 도구들이 만들어졌습니다.
SonarQube
SonarQube 플랫폼은 4개의 컴포넌트로 구성
- SonarQube Server
- SonarQube Database
- SonarQube Plugin
- SonarQube Scanner
SonarQube Server
3가지의 메인 프로세스를 구동
- Web Server : 사용자들에게 분석 결과를 보여주고, SonarQube 설정 페이지를 제공합니다.
- Search Server : Elasticsearch 서버를 사용하며, 사용자에게 검색기능을 제공합니다.
- Compute Engine Server : 정적 분석 결과를 생성하고 이를 SonarQube Database를 통해 저장합니다.
SonarQube Database
SonarQube의 기본 설정들(보안, Plugin 정보 등)과 프로젝트 분석 스냅샷들을 저장합니다. 설치시, 기본으로 H2 DB를 포함하며, 설정을 통해 다양한 DB 사용이 가능합니다
SonarQube Plugin
내부에서 사용하는 다양한 기능(분석 프로그램언어, 권한, 관리, SCM등)을 플러그인 형태로 설치 가능합니다.
SonarQube Scanner
프로젝트 정적 분석을 수행하는 툴로 다양한 형식으로 제공되며 CI Server와 연계하여 사용이 가능합니다.
SonarQube Integration
- 개발자는 IDE에서 코드를 작성하고, Sonar Lint등을 통해 로컬에서 코드 분석을 실행합니다.
- 개발자는 분석을 통해 수정된 완성코드를 SCM으로 Push 합니다.
- CI 서버에서 트리거된 빌드 수행시 SonarQube Scanner를 실행합니다.
- SonarQube Scanner는 생성한 분석 리포트의 처리를 위해 SonarQube로 전송합니다.
- SonarQube Server는 분석 리포트 결과를 처리하여 DB에 저장하고 결과를 웹서버를 통해 제공합니다.
- 개발자는 웹페이지에서 분석결과를 확인하여 코드를 개선합니다.
관리자는 결과 보고서를 받습니다. - SonarQube에서 데이터를 추출하기위해 API를 활용하거나 SonarQube Server 모니터링을 위해 JMX를 사용할 수 있습니다
설치
Maven 설치
기본적으로 Maven의 H2DB를 사용 > SonarQube를 설치하기 전에 Maven부터 설치 해줘야 한다
SonarQube 설치
파일을 받아서 압축을 해제하면 끝
1 | mkdir sonar-qube |
SonarQube Start
1 | cd sonarqube-6.7.5/bin/linux-x86-64 |
기본적으로 9000포트를 사용하고 있으니 다른 포트를 사용하려면 sonar.properties 수정하면된다.
SonarQube Scanner 설치
1 | wget https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.0.3.778-linux.zip |
Jenkins 연동
Jenkins 설치는 Skip
Jenkins Pluggin 설치
- Python Plugin
- GitHub Pull Request Builder
- GitHub plugin
- SonarQube Scanner for Jenkins
SonarQube Scanner for Jenks 의 경우 Jenkins 버전체크를 해줘야 한다.
플러그인 설치가능 목록에 안나오는 경우가 있으니 이런 경우 아래 url 에서 Archives 를 받아서 올려도됨
https://plugins.jenkins.io/sonar
Jenkins SonarQube server 정보 등록
server url 정보에 sonarQube 서버 url 을 넣는다
Server authentication token
Server authentication token 은 sonarQube를 접속해서 admin (password : admin) 으로 접속하면 아래 화면처럼 생성 할 수 있다.
Jenkins SonarQube scanner 정보 등록
jenkins > configure tools
Github과 Jenkins 연동
SKIP
어떻게 써볼까요?
- Jenkins Build 할때?
- Pull Request 할때?
- Local 에서?
Jenkins Build (with SonarQube)
Jenkins Sonar-scanner
Jenkins 에서 build 시 Sonar-scanner 설정법
Pull Request (with SonarQube)
해당 구조를 사용하기 위해선 GitHub WebHook사용과 Jenkins에 2개의 Job이 필요하다
- Jenkins Job
- 1번 job : pullrequest_receiver : github으로부터 web-hook을 통해 pullRequest정보를 받는 job
- 2번 job : sonaqube-job : 1번 job으로 부터 정보를 받아 SonarQube를 이용해 정적분석후 해당 pullRequest에 댓글로 리포팅 하는 Job
- GitHub WebHook
- Github에서 Jenkins Job을 호출하기 위해서는 Jenkins가 외부에 공개되어 있어야 한다
SonarLint (IntelliJ)
위와 같은 방법으로 SonarQube를 사용한다면…
코드를 작성하고 commit / push 이후에나 정적분석 피드백을 받을 수 있다.
Install
Setting > plugins > Search in repositories
SonarLint 검색
SonarQube 서버 연동
기본적인 설정만으로도 충분히 사용할 수 있으며 sonarqube 서버가 없어도 사용에 문제가 없습니다.
setting > Other Settings > SonarLing General Settings
참고
https://www.sonarqube.org/about/
http://lazyrodi.github.io/2017/02/06/2017-02-06-etc-install-sonarqube/
https://medium.com/@cgpink/소스-정적-분석도구-sonarqube-리서칭-9d48fc62b01f
https://www.popit.kr/내코드를-자동으로-리뷰해준다면-by-sonarqube/