naver / kaist-oss-course

Introduction to Open Source Software class @ KAIST 2016
38 stars 9 forks source link

[Pinpoint] Maven Animal Sniper 플러그인 적용 #65

Open lioolli opened 8 years ago

lioolli commented 8 years ago

Pinpoint는 Java 6 JVM에서도 정상적으로 동작해야 한다. 하지만 대부분의 개발자가 Java 7 이상을 사용하기 때문에 종종 Pinpoint에 Java 7 이상에만 존재하는 API를 사용하는 소스를 추가하는 실수가 발생하고 있다. 이를 방지하기 위해 Animal Sniper 플러그인을 적용하여 maven 빌드 시, Java 6에 없는 API를 사용한 것이 있는지 확인하도록 한다.

Animal Sniper: http://www.mojohaus.org/animal-sniffer/animal-sniffer-maven-plugin/

jaemin-shin commented 8 years ago

제가 하겠습니다

lsj1888 commented 8 years ago

@999fg 진행해보시고, 잘 안되거나 궁금하신 내용있으면 이곳에 질문 올려주세요.

ktomkim10 commented 8 years ago

팀원으로 함께 참여하겠습니다

jaemin-shin commented 8 years ago

다른 머신으로 작업을 옮겨 pinpoint를 빌드하고 있는데요, 빌드에 문제가 생겨 질문 드립니다.

ubuntu 14.04 server입니다

/etc/environment 에

1 PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games" 2 JAVA_HOME="/usr/local/jvm/jdk1.8.0_91" 3 JAVA_6_HOME="/usr/local/jvm/jdk1.6.0_45" 4 JAVA_7_HOME="/usr/local/jvm/jdk1.7.0_79" 5 JAVA_8_HOME="/usr/local/jvm/jdk1.8.0_91" 6 M2_HOME="/opt/apache-maven-3.2.5" 7 GRADLE_HOME="/opt/gradle-2.13" 8 CLASSPATH="JAVA_HOME/lib/:$CLASSPATH" 9 PATH="$PATH:$JAVA_HOME/bin:$M2_HOME/bin:$GRADLE_HOME/bin"

위와 같이 JAVA_6_HOME, JAVA_7_HOME, JAVA_8_HOME을 모두 설정하였는데, pinpoint를 받아서 mvn install -Dmaven.test.skip=true를 실행하면

[INFO] ------------------------------------------------------------------------ [INFO] Building pinpoint 1.6.0-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-enforcer-plugin:1.4.1:enforce (enforce-pinpoint-build-requirements) @ pinpoint --- [WARNING] Rule 2: org.apache.maven.plugins.enforcer.RequireEnvironmentVariable failed with message: Environment variable "JAVA_6_HOME" is required for this build. [WARNING] Rule 3: org.apache.maven.plugins.enforcer.RequireEnvironmentVariable failed with message: Environment variable "JAVA_7_HOME" is required for this build. [WARNING] Rule 4: org.apache.maven.plugins.enforcer.RequireEnvironmentVariable failed with message: Environment variable "JAVA_8_HOME" is required for this build.

와 같은 log가 뜨면서 BUILD FAILURE가 납니다ㅜㅜ 제가 뭔가 실수를 했을까요? echo $JAVA_6_HOME같은거 찍어보면 잘 찍힙니다ㅜㅜ

lioolli commented 8 years ago

환경변수만 설정돼 있으면 되는데요;; maven 실행시킨 터미널에서 echo $JAVA_6_HOME 해보신 건가요?

jaemin-shin commented 8 years ago

머신을 껐다 켰더니 되더군요ㅜㅋㅋ빨리 진행하겠습니다.

jaemin-shin commented 8 years ago

어떤 branch에서 작업하고 풀리퀘 보내면 되나요?? 풀리퀘는 마스터로 바로 보내면 될까요?

lioolli commented 8 years ago

@999fg master에서 브랜치 따서 작업하시고 master로 PR 보내시면 됩니다~

jaemin-shin commented 8 years ago

pom.xml을 수정하여,

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>animal-sniffer-maven-plugin</artifactId>
            <version>1.9</version>
            <configuration>
                <signature>
                  <groupId>org.codehaus.mojo.signature</groupId>
                  <artifactId>java16</artifactId>
                  <version>1.0</version>
                </signature>
            </configuration>
            <executions>
                <execution>
                    <id>ensure-java-1.6-class-library</id>
                    <phase>test</phase>
                    <goals>
                        <goal>check</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

를 추가하고 mvn clean compile animal-sniffer:check를 실행하면 다음과 같은 에러가 발생합니다.

[ERROR] /home/ubuntu/cs494/pinpoint/pinpoint/thrift/src/main/java/com/navercorp/pinpoint/thrift/io/ByteBufferOutputStream.java:61: Undefined reference: sun.nio.ch.DirectBuffer [ERROR] /home/ubuntu/cs494/pinpoint/pinpoint/thrift/src/main/java/com/navercorp/pinpoint/thrift/io/ByteBufferOutputStream.java:62: Undefined reference: sun.nio.ch.DirectBuffer [ERROR] /home/ubuntu/cs494/pinpoint/pinpoint/thrift/src/main/java/com/navercorp/pinpoint/thrift/io/ByteBufferOutputStream.java:62: Undefined reference: sun.misc.Cleaner sun.nio.ch.DirectBuffer.cleaner() [ERROR] /home/ubuntu/cs494/pinpoint/pinpoint/thrift/src/main/java/com/navercorp/pinpoint/thrift/io/ByteBufferOutputStream.java:64: Undefined reference: void sun.misc.Cleaner.clean()

제가 pom.xml에 추가한 내용은 이 프로젝트의 api들이 java 1.6 compatible 한지 테스트하는것인데, 이렇게 에러로 걸리는 library(sun.ni.ch.DirectBuffer 등)를 검색해보니 1.6 버전도 있고 1.7버전도 있어서 맞게 한것인지, 틀리게 한것인지 모르겠습니다. 무엇이 문제였을까요?ㅜㅜpinpoint에 사용된 sun.ni.ch.DirectBuffer는 어떤 idk 버전의 라이브러리인가요?

lioolli commented 8 years ago

원래 sun으로 시작하는 패키지는 jdk에 포함되지 않는 것들이라 그런 것 같네요. Sun에서 JVM 만들 때 내부 구현용 코드들을 sun 패키지에 넣어 놓은 건데, 이런저런 이유로 sun에 있는 패키지들을 가져다 사용하는 경우가 있고 pinpoint도 마찬가지입니다.

http://www.mojohaus.org/animal-sniffer/animal-sniffer-maven-plugin/examples/checking-signatures.html 여기 보면 ignore 설정하는 방법이 있습니다. 여기 참고하셔서 sun.*을 무시하도록 하면 될 것 같습니다.

jaemin-shin commented 8 years ago

감사합니다! 덕분에 거의 다 온 것 같습니다.

말씀해 주신 대로, ignore를 하고 진행하였더니 대부분의 api가 통과하였으나, pinpoint-web에서 Long.compare 와 java.util.Object.toString 부분이 통과하지 못했습니다. 검색해 보니, java 1.7버전에서 나온 library인 것 같은데요! 이 경우 어떻게 해야 할까요..?

jaemin-shin commented 8 years ago

일단은 테스트에 걸리는 두 개의 api는 ignore하도록 하였습니다.

현재 mvn install -Dmaven.test.skip = true를 실행하며 빌드하게 되면 자동으로 animal sniffer plugin이 적용되며 java 6 compatible 한지 테스트하도록 되어 있습니다. 이 상태로 PR 보내겠습니다!

lioolli commented 8 years ago

@999fg 아, pinpoint-web은 jdk 1.7을 사용하고 있습니다. 원래대로라면 web/pom.xml에 1.7로 설정해 주어야 하는데요, ignore 처리 해서 보내주세요

jaemin-shin commented 8 years ago

그 PR 보낼 때 궁금해서요.. pinpoint repo를 fork 한 후, fork된 repo에서 브랜치를 따서 작업하고 PR을 fork된 repo의 master로 보내나요, 원래 pinpoint repo의 master로 보내나요??(가능한가요..?)

아니면 fork된 repo의 master에서 작업하고 그냥 이걸 원래 repo로 PR 보내면 될까요..?

lioolli commented 8 years ago

@999fg fork 하신 리파지토리에서는 어떤 브랜치에서 작업하시든 상관 없습니다. PR은 pinpoint의 master로 보내시면 되구요.

jaemin-shin commented 8 years ago

PR 보냈습니다!