====== SonarQube ====== * http://www.sonarsource.org/ [[java:static_analysis|Java Static Analysis]] 도구 * 코드 품질 관리 툴 * [[programming:static_analysis:sonarcloud|SonarCloud]] * [[gradle:sonarqube|Gradle SonarQube]] ===== SonarQube Scanner for Jenkins ===== * [[ci:jenkins|Jenkins]] 사용시 [[https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner+for+Jenkins|Jenkins용 SonarQube Scanner]]를 사용하면 멀티 모듈 프로젝트를 하나로 묶는것이 더 좋고, 자동으로 sonarqube 에 대한 링크까지 생성된다. * Maven이나 Gradle Plugin이 아닌 Jenkins 혹은 명령행 Scanner 사용시 [[https://docs.sonarqube.org/display/PLUG/Java+Plugin+and+Bytecode|Java Plugin and Bytecode]]에 있는 ''sonar.java.binaries'', ''sonar.java.libraries''이 올바로 설정이 안되어 Lombok 등에 대한 false alarm이 발생하게 된다. * 따라서 위 프라퍼티들을 올바로 설정할 자신이 없으면 그냥 [[gradle:sonarqube|Gradle SonarQube]] 사용 권장 * [[https://stackoverflow.com/questions/46362965/sonarqube-lombok-false-positives/46365394|sonarqube + lombok = false positives]] 참조 ===== False Positive ===== * [[https://docs.sonarqube.org/display/PLUG/Java+FAQ|Java FAQ - Plugins - Doc SonarQube]] 참조 * 해당 규칙이 false positive 인 경우 ''NOSONAR'' 보다는 Rule 자체를 변경하는 것이 좋겠다. * ''%%//%%NOSONAR''시에 항상 왜 그럴 수 밖에 없었는지 이유를 작성하자. SonarQube 의 코드 퀄리티를 만족시키기 위해서 우리 사정상 어쩔 수 없거나 SonarQube 의 경고 자체가 잘못된 경우가 있는데, 억지로 이게 맞추려고 코드를 꼬아서 만들거나 해서는 안 된다. 이게 오히려 버그를 만든다. 이럴때는 즉각 팀에 공유하고, 다른 방안을 도출하거나, 아래의 방법으로 처리한다. ==== @SuppressWarnings("all") ==== * ''@SuppressWarnings("all")''를 클래스에 붙이면 해당 클래스의 모든 규칙 위반을 무시한다. ==== NOSONAR ==== * 규칙 위반을 고치는게 불가능할 경우 해당 위반의 줄 맨 끝에 ''%%//%%NOSONAR''를 붙인다. ==== @SuppressWarnings("squid:룰번호") ==== * ''@SuppressWarnings({"squid:S2078", "squid:S2076"})'' 처럼 ''@SuppressWarnings''와 ''squid:S룰번호'' 를 사용한다. ===== 참고 자료 ===== * [[https://docs.sonarqube.org/display/SONAR/Analysis+Parameters|Analysis Parameters - SonarQube Documentation - Doc SonarQube]] * [[https://docs.sonarqube.org/display/PLUG/SonarJava|SonarJava - Plugins - Doc SonarQube]] * [[http://java.dzone.com/articles/sonars-quality-alphabet|Sonar's Quality Alphabet]] ===== Web API ===== * 분석 및 분석 결과등을 API로 제공 * [[https://docs.sonarqube.org/display/DEV/Web+API|Web API]] * ''자신의sonarqube.주소/web_api''를 통해 현재 시스템이 제공하는 API 목록 및 문서 확인 가능. # 현재 이슈 목록 curl http://sonarqube.example.com/api/issues/search?componentKeys=project:module # 현재 프로젝트의 메트릭(위반 갯수 등) curl 'http://sonarqube.example.com?componentKeys=project:module&severities=BLOCKER,MAJOR,CRITICAL' * [[https://docs.sonarqube.org/display/SONAR/Metric+Definitions|Metric Definitions - SonarQube Documentation - Doc SonarQube]] : ''metricKeys'' 에 넣을 값들 * [[https://gist.github.com/kwon37xi/a293a4bbc86f1286ce0b150863861009|Groovy 로 API 호출]] ===== Quality Gates ===== * [[https://docs.sonarqube.org/display/SONAR/Quality+Gates|SonarQube Quality Gates]] * 분석 결과 품질이 저하되거나 하면 알림을 줄 수 있다. * 알림은 자기 계정의 **My Account -> Notifications**에서 프로젝트 단위, 혹은 전체 프로젝트를 지정할 수 있다. ==== sonar.qualitygate.wait=true ==== * [[https://docs.sonarqube.org/8.5/analysis/gitlab-cicd/|GitLab CI/CD | SonarQube Docs]] * sonarqube 8.x 에서는 client 에서 ''sonar.qualitygate.wait=true'' 프라퍼리트를 지정하면 sonarqube quality gate 통과여부를 검사하고 해당 job 을 성공/실패시킬 수 있다. ===== Jenkins Pipeline에서 Quality Gate 응답 대기 ===== * sonarqube 8.x 에서는 불필요. sonarqube gradle/maven plugin 프라퍼티에 ''sonar.qualitygate.wait=true'' 사용. * [[https://www.jenkins.io/doc/pipeline/steps/sonar/|SonarQube Scanner for Jenkins]] 플러그인 설치 상태에서 * Jenkins 설정에서 sonarqube URL / 인증등을 설정해주고서 * [[https://plugins.jenkins.io/sonar-quality-gates/|sonar-quality-gates]] 플러그인은 사용 안하는게 나은듯. * Quality Gate 응답을 기다리고 실패이면 UNSTABLE로 변경 timeout(time: 10, unit: 'MINUTES') { def qg = waitForQualityGate() if (qg.status != 'OK') { println "Pipeline unstable due to SoanrQube quality gate failure: ${qg.status}" currentBuild.result = 'UNSTABLE' } } * Declarative Pipeline 에서 아래 사용시 무조건 FAILURE로 바꿔버림 stage("Quality Gate") { steps { timeout(time: 2, unit: 'MINUTES') { waitForQualityGate abortPipeline: true } } } * Sonarqube의 [[https://docs.sonarqube.org/latest/project-administration/webhooks/|Administration -> Configuration -> Web Hooks]] 에서 ''http://JENKINS-SERVER/sonarqube-webhook/'' 설정 필요. ===== Installing Sonar ===== * [[http://docs.codehaus.org/display/SONAR/Installing+Sonar|Installing Sonar]] * Sonar 웹서버를 다운로드하여 압축을 풀면 설치가 끝난다. ==== 설정 ==== * ''conf/sonar.properties'' 파일에서 데이터베이스를 지정해준다. 설정 파일에서 주석만 제거하면 될 정도로 예제가 다 나와있다. sonar.jdbc.url: the URL of the database sonar.jdbc.driver: the class of the driver sonar.jdbc.user: the username sonar.jdbc.password: the password * ''bin/아키텍처/실행파일''를 실행한다. * DB 생성과 권한 설정만 해 두면 나머지는 테이블 생성은 알아서 진행된다. * 실행시 디버그 정보를 보려면 ''-Dsonar.verbose=true'' 시스템 프라퍼티를 지정한다. ==== Annotation Magic number ==== * **MagicNumber** 항목을 찾아서 ''ignoreAnnotation'', ''ignoreHashCode'' 등을 true로 변경한다. ==== Plugin ==== * [[http://docs.codehaus.org/download/attachments/230396085/JavaEcosystem-2.0.zip|sonar java ecosystem 2.0]] : SonarQube 3.x 대의 가장 최종 Java 플러그인 ==== exclude ==== * **General Settings -> Exclusions -> Global Source File Exclusions**에서 ''file:**/generated/**''를 통해 ''generated'' 이하 파일들 모두 제외 ===== Powermock ===== * Powermock + jacoco 사용시에는 코드 커버리지가 작동하지 않는다. * Cobertura를 사용하면 작동한다. ===== Findbug timeout ===== * [[http://stackoverflow.com/questions/27025472/jenkins-findbug-threshold-issue|sonarqube - Jenkins findbug threshold issue]] Can not execute SonarQube analysis: Can not execute Findbugs with a timeout threshold value of 600000 milliseconds * 위와 같은 오류 발생시에는 SonarQube **Settings -> General Settings -> Java -> FindBugs**에 들어가 FindBug에서 timeout을 늘려줘야한다. ===== Analysis Parameter ===== * https://docs.sonarqube.org/latest/analysis/analysis-parameters/ ==== duplication exclude ==== * ''sonar.cpd.exclusions=sonar.cpd.exclusions=**/AssemblyInfo.cs,**/*.g.cs,**/Mappings/*.cs'' ===== 참조 ===== * [[http://www.popit.kr/java-%ea%b0%9c%eb%b0%9c%ec%9e%90%eb%a5%bc-%ec%9c%84%ed%95%9c-maven-sonarqube-docker-%ec%8b%9c%ec%9e%91%ed%95%98%eb%8a%94-%ec%bd%94%eb%93%9c-%ec%a0%95%ec%a0%81-%eb%b6%84%ec%84%9d/|Java 개발자를 위한 Maven + SonarQube + Docker로 시작하는 코드 정적 분석 | Popit]] * [[https://www.sonarsource.com/docs/CognitiveComplexity.pdf|SonarQube 인지적 복잡도 Cognitive Complexity]] * [[https://github.com/SonarQubeCommunity/sonar-build-breaker|SonarQubeCommunity/sonar-build-breaker: Build Breaker Plugin for SonarQube]] * [[https://medium.com/@joypinkgom/%EC%86%8C%EC%8A%A4-%EC%A0%95%EC%A0%81-%EB%B6%84%EC%84%9D%EB%8F%84%EA%B5%AC-sonarqube-%EB%A6%AC%EC%84%9C%EC%B9%AD-9d48fc62b01f|소스 정적 분석도구 SonarQube 리서칭 - Chan Ahn - Medium]]