Add SonarQube Custom Rule
2024, Apr 13
요구사항
- 산출물 중 테이블 명세서를 자동으로 생성하게 되는데, 그 때 사용할 컬럼 설명으로 @Comment를 활용하고 있다.
- 누락되는 경우를 방지하기 위해 코드 컨벤션 항목으로 한다.
환경
- sonarqube 9.9.1
- java 17
룰 코드 작성
- 룰
- Rule 1 : @Table 어노테이션이 선언된 클래스는 반드시 @Comment어노테이션을 통해 테이블 설명이 정의되어야한다.
- Rule 2: Jpa에 사용될 데이터 모델 Jpo클래스의 멤버 변수는 반드시 @Comment 어노테이션을 통해 컬럼명을 정의해야 한다.
- BaseTreeVisitor를 상속받아서 ClassTree 또는 MethodTree 또는 VariableTree등 다양한 방식으로 코드에 접근한다.
- 멤버 변수에 어노테이션이 있는지 체크하고자 처음에 VariableTree로 체크했더니 로컬은 잘되는데 서버에서는 멤버 변수가 다 코드스멜 대상으로 검출되었다. 그래서 다시 ClassTree로 바꾸고 annotationType으로 필터
@Override
public void visitClass(ClassTree tree) {
String className = tree.simpleName().name();
if (className.contains("Jpo")) {
tree.members().stream()
.filter(member -> member.is(Tree.Kind.VARIABLE))
.forEach(member -> {
if (!hasComment((Tree) member)) {
context.reportIssue(this, member, "Member fields of Jpo class must be annotated with @Comment.");
}
});
}
}
private boolean hasComment(Tree tree) {
List<AnnotationTree> annotations = ((VariableTree) tree).modifiers().annotations();
for (AnnotationTree annotation : annotations) {
IdentifierTree idf = (IdentifierTree) annotation.annotationType();
if (idf.name().equals("EmbeddedId")) {
return true;
}
if (idf.name().equals("Comment")) {
return true;
}
}
return false;
}
룰을 설명하는 html과 json파일을 작성한다.
<p>@Table을 사용할 경우 @Comment도 작성했는지 검출한다.</p> <h2>Noncompliant Code Example</h2> <pre> @Table // Noncompliant public class TicketJpo { } </pre> <h2>Compliant Solution</h2> <pre> @Table @Comment(value = "티켓") public class TicketJpo { } </pre>
배포
- 작성한 코드를 jar로 생성하고
extensions/plugins
하위에 jar파일 업로드한다. - 서비스 재시작 ./sonar.sh stop, start
- jar가 적용되었는지 확인하는방법
- 9000번 콘솔 접속 후 어드민으로 로그인
- Administration → Marketplace → installed 메뉴 이동하면
- 하단에
[Java Custom Rules]
에서 pom.xml 버전으로 확인이 가능하다. - 룰도 추가되었는지 확인한다.
- 상단 Rules 메뉴로 이동해서 검색
적용
- 상단 Rules 메뉴로 이동해서 검색
- 상세화면으로 들어가서
**Quality Profiles**
에서 activate할 profile을 선택한다.- 운영에 바로 적용하면, 오탐 가능성이 있어서 테스트용 Profile을 생성하고 테스트용 프로젝트만 연결했다.
- 여러팀에서 사용하는 프로필이기 때문에 테스트용 프로필을 복사생성해서 거기에 선 적용하는 방식으로 검증 작업을 진행하고 실적용을 하도록 하자.
테스트
- @Comment가 없는 Jpo클래스를 푸시 후 젠킨스를 돌려본다. 🥁🥁
- 테스트 코드를 통해 로컬에서 테스트했지만 서버에 적용하면 오탐이 되는 등 차이가 발생했는데, intellij에 소나큐브 설정을 한 후 해볼 수 있을 것 같다.