Kubernetes 이야기

(docker) PMD 사용하기 본문

Kubernetes/devops

(docker) PMD 사용하기

kmaster 2022. 3. 22. 11:58
반응형

PMD 

 

PMD 는 애플리케이션 코드 내에서 발견된 문제에 대해 보고 하는 오픈 소스 정적 소스 코드 분석기이다. 최근에는 SonarQube를 활용한 코드 분석이 많이 사용되고 있으나, 아직까지 PMD도 많이 사용되고 있다.

 

Argo 에서 Sonarqube를 연동하는 방법을 아래를 참고한다.

 

https://kmaster.tistory.com/22

 

Argo workflow 를 활용하여 CI/CD 구축하기 (SonarQube)

argo workflow 와 설치 방법은 아래를 참고한다. https://kmaster.tistory.com/25 Argo workflow 를 활용하여 CI/CD 구축하기 (기본설치) Argo Workflow Argo Workflows는 Kubernetes에서 병렬 작업을 오케스트레..

kmaster.tistory.com

 

공공 분야에서는 전자정부 프레임워크에서 기본적으로 제공하는 PMD ruleset으로 검증을 거친 후 배포하는 과정을 진행하고 있다.

 

PMD Ruleset

 

전자정부 표준프레임워크 표준 Inspection 룰셋을 다운로드 받는다. 

 

egovframework:dev2:imp:inspection [eGovFrame]

정의된 규칙(Rule)을 기반으로 개발자가 작성한 소스 코드를 검사하여, 오류 및 위험 요인을 식별하여 알려 주는 기능을 제공한다. 전자정부 표준프레임워크 적용 시 Code Inspection 구현도구를 통해

www.egovframe.go.kr

 

PMD Docker

 

전자정부 표준프레임워크 표준 Inspection 룰셋은 PMD 5.x 를 사용하는 있는것으로 보인다.

PMD Container를 5.x 최신버전으로 제작해 보자.

 

FROM openjdk:8-jre-alpine3.9

ARG PMD_VERSION=${PMD_VERSION:-5.8.1}

RUN mkdir -p /opt

RUN cd /opt \
      && apk add --no-cache --virtual .build-deps wget unzip \
      && wget -nc -O pmd.zip https://github.com/pmd/pmd/releases/download/pmd_releases/${PMD_VERSION}/pmd-bin-${PMD_VERSION}.zip \
      && unzip pmd.zip \
      && rm -f pmd.zip \
      && mv pmd-bin-${PMD_VERSION} pmd \
      && apk del .build-deps

RUN apk add --update --no-cache dumb-init

ENTRYPOINT [ "/usr/bin/dumb-init", "/usr/bin/java", "-classpath", "/opt/pmd/lib/*", "net.sourceforge.pmd.PMD" ]

 

빌드 후 실행해 보자.

 

# docker run -v $PWD:/src ghcr.io/kmaster8/pmd:1.0 -language java -dir /src/jpetstore-6 -rulesets /src/EgovInspectionRules_kor-3.5.xml
Applying rule set filter: The rule "EmptyCatchBlock" has been moved from ruleset "basic" to "empty". Please change your ruleset!
Mar 15, 2022 7:47:55 AM net.sourceforge.pmd.RuleSetFactoryCompatibility$RuleSetFilter apply
WARNING: Applying rule set filter: The rule "EmptyCatchBlock" has been moved from ruleset "basic" to "empty". Please change your ruleset!
Applying rule set filter: The rule "EmptyCatchBlock" has been moved from ruleset "basic" to "empty". Please change your ruleset!
Mar 15, 2022 7:47:55 AM net.sourceforge.pmd.RuleSetFactoryCompatibility$RuleSetFilter apply
WARNING: Applying rule set filter: The rule "EmptyCatchBlock" has been moved from ruleset "basic" to "empty". Please change your ruleset!
Applying rule set filter: The rule "EmptyCatchBlock" has been moved from ruleset "basic" to "empty". Please change your ruleset!
Mar 15, 2022 7:47:55 AM net.sourceforge.pmd.RuleSetFactoryCompatibility$RuleSetFilter apply
WARNING: Applying rule set filter: The rule "EmptyCatchBlock" has been moved from ruleset "basic" to "empty". Please change your ruleset!
/src/jpetstore-6/src/main/java/org/mybatis/jpetstore/service/OrderService.java:119:     가공되지 않은 Exception을 throw하는 것은 비추천
/src/jpetstore-6/src/main/java/org/mybatis/jpetstore/service/SimpleDeadLock.java:7:     사용되지 않는 Private field 'index' 가 선언되었음
/src/jpetstore-6/src/main/java/org/mybatis/jpetstore/service/SimpleDeadLock.java:17:    System.out.print 가 사용됨.
/src/jpetstore-6/src/main/java/org/mybatis/jpetstore/service/SimpleDeadLock.java:20:    System.out.print 가 사용됨.
/src/jpetstore-6/src/main/java/org/mybatis/jpetstore/service/SimpleDeadLock.java:22:    System.out.print 가 사용됨.
/src/jpetstore-6/src/main/java/org/mybatis/jpetstore/service/SimpleDeadLock.java:30:    System.out.print 가 사용됨.
/src/jpetstore-6/src/main/java/org/mybatis/jpetstore/service/SimpleDeadLock.java:33:    System.out.print 가 사용됨.
/src/jpetstore-6/src/main/java/org/mybatis/jpetstore/service/SimpleDeadLock.java:35:    System.out.print 가 사용됨.
/src/jpetstore-6/src/main/java/org/mybatis/jpetstore/web/actions/CartActionBean.java:118:       내용이 없는 Catch Block이 존재
/src/jpetstore-6/src/test/java/org/mybatis/jpetstore/service/OrderServiceTest.java:55:  빈 Method에 주석을 추가할것

 

위에서 WARNING을 없애려면

 

        <rule ref="rulesets/java/basic.xml/EmptyCatchBlock" language="java" message="내용이 없는 Catch Block이 존재">

--->

        <rule ref="rulesets/java/empty.xml/EmptyCatchBlock" language="java" message="내용이 없는 Catch Block이 존재">

 

변경 후 다시 다시 실행해 보자.

 

# docker run -v $PWD:/src ghcr.io/kmaster8/pmd:1.0 -language java -dir /src/jpetstore-6 -rulesets /src/EgovInspectionRules_kor-3.5.xml
/src/jpetstore-6/src/main/java/org/mybatis/jpetstore/service/OrderService.java:119:     가공되지 않은 Exception을 throw하는 것은 비추천
/src/jpetstore-6/src/main/java/org/mybatis/jpetstore/service/SimpleDeadLock.java:7:     사용되지 않는 Private field 'index' 가 선언되었음
/src/jpetstore-6/src/main/java/org/mybatis/jpetstore/service/SimpleDeadLock.java:17:    System.out.print 가 사용됨.
/src/jpetstore-6/src/main/java/org/mybatis/jpetstore/service/SimpleDeadLock.java:20:    System.out.print 가 사용됨.
/src/jpetstore-6/src/main/java/org/mybatis/jpetstore/service/SimpleDeadLock.java:22:    System.out.print 가 사용됨.
/src/jpetstore-6/src/main/java/org/mybatis/jpetstore/service/SimpleDeadLock.java:30:    System.out.print 가 사용됨.
/src/jpetstore-6/src/main/java/org/mybatis/jpetstore/service/SimpleDeadLock.java:33:    System.out.print 가 사용됨.
/src/jpetstore-6/src/main/java/org/mybatis/jpetstore/service/SimpleDeadLock.java:35:    System.out.print 가 사용됨.
/src/jpetstore-6/src/main/java/org/mybatis/jpetstore/web/actions/CartActionBean.java:118:       내용이 없는 Catch Block이 존재
/src/jpetstore-6/src/test/java/org/mybatis/jpetstore/service/OrderServiceTest.java:55:  빈 Method에 주석을 추가할것

 

 

 

 

반응형
Comments