[Infra] Gradle build 최적화

이열음·2022년 10월 25일

왜 해야하나?

  • 젠킨스 안에서 빌드 시간이 너무 오래 걸려서
    • 무중단 스크립트까지 돌면 시간이 더 오래 걸릴 것 같아서
  • 캐시사용으로 빌드때 발생하는 부하를 줄이기 위해서
  • 수정사항 반영이 급하고, 새로운 테스트를 짜지 않는 핫픽스에 적합할 것 같아서

뭘 했나?

크게 두가지를 했다.

clean task 삭제

  • 이전 빌드 내역을 지우는 테스크를 삭제함으로써 증분빌드를 가능케함

org.gradle.caching=true 설정 추가

  • 캐시 활용 설정 추가
  • 병렬실행 옵션은 EC2가 성능이 안나와서 안했음.
    • 스위칭 비용이 더 들 것이라 판단.

테스트 로그

본 테스트 로그는 무중단 배포 이전을 기준으로 함

캐시 적용전

Clean 안하고 1차 build -> 1분 22초

Clean 안하고 2차 build  -> 1분 18초

캐시 적용 후

Clean 안하고 1차 build -> 1분 30초

Clean 안하고 1차 build -> 14초

캐시 삭제 후 빌드 = 캐시 미사용 (3m 8s)

 **Task :clean** UP-TO-DATE

 **Task :compileJava**

Note: /var/lib/jenkins/workspace/ternoko/backend/src/main/java/com/woowacourse/ternoko/auth/application/JwtProvider.java uses or overrides a deprecated API.

Note: Recompile with -Xlint:deprecation for details.

Note: /var/lib/jenkins/workspace/ternoko/backend/src/main/java/com/woowacourse/ternoko/auth/config/AuthenticationPrincipalConfig.java uses unchecked or unsafe operations.

Note: Recompile with -Xlint:unchecked for details.

 **Task :processResources**

 **Task :classes**

 **Task :bootJarMainClassName**

 **Task :compileTestJava**

 **Task :processTestResources**

 **Task :testClasses**

 **Task :test**

12 actionable tasks: 11 executed, 1 up-to-date

변경없이 재빌드 = 캐시 사용  (14s) - v1

 **Task :clean** UP-TO-DATE

 **Task :compileJava** FROM-CACHE

 **Task :processResources**

 **Task :classes**

 **Task :bootJarMainClassName**

 **Task :compileTestJava** FROM-CACHE

 **Task :processTestResources**

> **Task :testClasses**

> **Task :test** FROM-CACHE

> **Task :asciidoctor** FROM-CACHE

> **Task :copyDocument**

12 actionable tasks: 7 executed, 4 from cache, 1 up-to-date

테스트 코드 추가 후 빌드 = 캐시 안씀 (1m 11s) - v2

> **Task :clean** UP-TO-DATE

> **Task :compileJava** FROM-CACHE

> **Task :processResources**

> **Task :classes**

> **Task :bootJarMainClassName**

> **Task :compileTestJava**

> **Task :processTestResources**

> **Task :testClasses**

> **Task :test**

12 actionable tasks: 10 executed, 1 from cache, 1 up-to-date

변경 없이 테스트코드 추가본 빌드  = 캐시 사용(14s) - v2

> **Task :clean** UP-TO-DATE

> **Task :compileJava** FROM-CACHE

> **Task :processResources**

> **Task :classes**

> **Task :bootJarMainClassName**

> **Task :compileTestJava** FROM-CACHE

> **Task :processTestResources**

> **Task :testClasses**

> **Task :test** FROM-CACHE

> **Task :asciidoctor** FROM-CACHE

> **Task :copyDocument**

12 actionable tasks: 7 executed, 4 from cache, 1 up-to-date

테스트코드 삭제본 빌드 = 캐시 사용(14s) - v3

> **Task :clean** UP-TO-DATE

> **Task :compileJava** FROM-CACHE

> **Task :processResources**

> **Task :classes**

> **Task :bootJarMainClassName**

> **Task :compileTestJava** FROM-CACHE

> **Task :processTestResources**

> **Task :testClasses**

> **Task :test** FROM-CACHE

> **Task :asciidoctor** FROM-CACHE

> **Task :copyDocument**

12 actionable tasks: 7 executed, 4 from cache, 1 up-to-date

클래스파일 추가 후 빌드 = 캐시 미사용 (1m 13s) - v4

> **Task :clean** UP-TO-DATE

> **Task :compileJava**

Note: /var/lib/jenkins/workspace/ternoko/backend/src/main/java/com/woowacourse/ternoko/auth/application/JwtProvider.java uses or overrides a deprecated API.

Note: Recompile with -Xlint:deprecation for details.

Note: /var/lib/jenkins/workspace/ternoko/backend/src/main/java/com/woowacourse/ternoko/auth/config/AuthenticationPrincipalConfig.java uses unchecked or unsafe operations.

Note: Recompile with -Xlint:unchecked for details.

> **Task :processResources**

> **Task :classes**

> **Task :bootJarMainClassName**

> **Task :compileTestJava**

> **Task :processTestResources**

> **Task :testClasses**

> **Task :test**

12 actionable tasks: 11 executed, 1 up-to-date

클래스 추가 후 변경없이 재빌드 = 캐시 사용(14s) - v4

> **Task :clean** UP-TO-DATE

> **Task :compileJava** FROM-CACHE

> **Task :processResources**

> **Task :classes**

> **Task :bootJarMainClassName**

> **Task :compileTestJava** FROM-CACHE

> **Task :processTestResources**

> **Task :testClasses**

> **Task :test** FROM-CACHE

> **Task :asciidoctor** FROM-CACHE

> **Task :copyDocument**

> **Task :buildDocument**

캐시 + 증분빌드 설정 추가 후

본 결과는 무중단 배포 이후를 기준으로 함

  • 캐시 미적용시 1m 55s

  • 캐시 적용시 48s → 변경사항크기에 따라 시간이 달라질 수 있음.

Reference

https://docs.gradle.org/current/userguide/performance.html

https://gradle.org/gradle-vs-maven-performance/#gradle-is-up-to-100-times-faster-than-maven

https://ryumodrn.tistory.com/18

http://daplus.net/gradle-gradle이-종속성을-다시-다운로드하도록하려면-어떻게/

https://stackoverflow.com/questions/29028748/why-run-gradle-clean-build-instead-of-gradle-build

0개의 댓글