Feat… CI 적용기(jacoco + checkStyle + sonar cloud + Github Action)
0. 상황
- 프로젝트에 CI를 적용하기 위해 project를 test한 뒤 build 하도록 github action을 생성하던 도중, test가 두번 실행되는 로그를 확인했다.
1. 원인
- 혹시 build만 해도 test를 실행하는게 아닐까 하는 의심이 들어 build의 task를 살펴보게 되었다.
오전 7:20:16: Executing 'build'...
> Task :compileJava UP-TO-DATE
> Task :processResources UP-TO-DATE
> Task :classes UP-TO-DATE
> Task :bootWarMainClassName
> Task :bootWar
> Task :war
> Task :assemble
> Task :compileTestJava
> Task :processTestResources NO-SOURCE
> Task :testClasses
> Task :test
> Task :check
> Task :build
BUILD SUCCESSFUL in 18s
7 actionable tasks: 5 executed, 2 up-to-date
오전 7:20:35: Execution finished 'build'.
디용..? build Task에 버젓이 test가 들어가있는것이 아닌가?
Gradle의 공식문서를 살펴보니 Testing in Java & JVM projects에서도 아래처럼 모든 test는 build시에 포함되어야한다고 표현했다.
Testing on the JVM is a rich subject matter.
There are many different testing libraries and frameworks, as well as many different types of test.
All need to be part of the build, whether they are executed frequently or infrequently.
3. 해결방안
- 물론 정확하게는 더 상세하게 이 test가 내가 원하는 결과물을 만들기 위한 test를 모두 실행하는지는 확인해봐야겠지만, ci과정에서 혹시라도 불필요하게 test가 두번 실행되는일은 없도록 파이프라인을 설계해야겠다.
어쩔 수 없이 test를 별도의 gitHub Ation Step으로 분리해야한다면, build시에는 test를 수행하지 않는 것도 방법중에 하나일까?
CF) Build시 test를 실행하지 않도록 설정하는 방법
//gradle build시 test task 제외하고 실행하는 방법
gradle build -x test
- CI 파이프라인에서 가능한 한 빨리 실패를 감지하는 것이 중요하기 때문에 Test를 별도의 Step으로 분리해 build보다 먼저 실행하도록 하는것도 방법중에 하나가 될 수 있을 것 같다..!
이와 관련해서 주의해야할 부분이 있을까?
- Gradle에서 Test Excuction에 대해서 살펴보면, Test Task는 main build process와는 별도의 JVM에서 실행되며 이를 통해 클래스 경로 오염과 빌드 프로세스에 대한 과도한 메모리 소비를 방지 할 수 있다고 되어있다.
Test execution
Gradle executes tests in a separate ('forked') JVM, isolated from the main build process. This prevents classpath pollution and excessive memory consumption for the build process.
It also allows you to run the tests with different JVM arguments than the build is using.
- 그렇다면 실제 build시 실행될 test와, test Task를 통해 실행될 test의 결과가 다를 수도 있다는걸까..?
- 추후에 실제로 test 가 실행되는데에 얼마나 시간적 차이가 있는지 확인해보는것도 좋을 것 같다.
4. 후일담
- 주변 백엔드 개발자분들과, 백엔드 개발을 희망하는 친구들에게 gradle build시 test가 default로 실행되는지 아닌지 퀴즈를 내보았는데, 모르고 계신 분들이 정말 많아서 재밌게 살펴볼 수 있었다 :)
'Web_Backend > Spring' 카테고리의 다른 글
[spring] 모듈 분리의 필요성(Feat.. 파일업로드 - 프로필 이미지 업로드, 게시물 사진 업로드) (0) | 2024.01.24 |
---|---|
[Java, kakao Rest API login] HttpURLConnection은 왜 지양되어야 하는가? (Feat RestTemplate, WebClient) (0) | 2024.01.24 |
[Servlet] Dispatcher Servlet (0) | 2023.05.28 |
[Spring] Spring AOP(Aspect Oriented Programming) (2) | 2023.05.28 |
[Spring, JPA] JPA Persistence Context (0) | 2023.05.28 |
야나의 코딩 일기장 :) #코딩블로그 #기술블로그 #코딩 #조금씩,꾸준히
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!