ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • gradle build 속도 개선하기
    프로젝트/선착순 쿠폰 발급 시스템 2023. 4. 25. 00:01
    728x90

    개요

    project가 잘 build 되는지 , 테스트는 제대로 수행되는지 ./gradlew build  명령어를 수행하곤 합니다.

    하지만 매번 오래걸리는 빌드를 더 빠르게 수행할 수 없을까? 에서 출발해서 속도를 개선해보고자 합니다.

     

     

    현재 build time

    BUILD SUCCESSFUL in 49s

    49초가 걸렸습니다.

    현재 프로젝트는 멀티모듈구조에 kafka embedded test 한건이 존재했습니다.

     

    IntelliJ IDEA로 build 하기

     

    If you have a pure Java or a Kotlin project, it is sometimes better to select IntelliJ IDEA for building a project. IntelliJ IDEA supports the 
    incremental build
     which significantly speeds up the building process. Yet, keep in mind that the IntelliJ IDEA compiler does not support some parts of the Gradle project build processing and might cause problems in building your project correctly.

     

    Intellij IDEA 공식문서의 내용 중 일부입니다.

     

    간단히 요약하자면 pure Java 또는 Kotlin 프로젝트라면 때때로 Intellij IDEA를 통해 빌드하는 게 더 빠를 수 있다고 제시합니다.

    하지만 때로는 지원하지 않는 부분도 있다고 합니다.

     

    설정 변경

    File -> Settings -> Build, Execution, Deployment -> Gradle -> Build and run using, Run tests using(Intellij IDEA로 변경)

    * 해당 옵션은 추후에 Spring Boot Applciation을 실행할 때 에러가 나와서 gradle로 설정하였으며, 아래에 소개할 개선작업들을 수행했을 때 속도가 크게 차이 나지 않았습니다.

     

    gradle clean build

    ./gradlew clean build
    BUILD SUCCESSFUL in 33s

    처음에 gradlew build만 수행했을 때 4초가 나와 clean build를 수행해 보니 33초가 수행되었습니다.

     

     

    gradle 공식문서에서 제시하는 속도를 개선하는 방법

    • 최신상태로 유지하기
      • gradle을 최대한 최신 상태로 유지하라
      • java를 최대한 최신 상태로 유지하라
      • 최신 버전의 plugins을 사용하라
    • 병렬 실행하기
      • 단일 하위 프로젝트에 의해 지배되는 빌드는 전혀 이점이 없습니다.
    • deamon으로 실행하기
      • gradle은 기본적으로 deamon을 가능하도록 합니다.
    • 캐시 추가하기
      • gralde은 기본적으로 캐시 구성을 사용하지 않습니다.
    • heap size 증가시키기
      • 기본적으로 512MB가 세팅되어 있습니다. 이를 2048로 증가시킵니다.
    • 병렬로 테스트 수행하기

     

     

    병렬로 실행하기

    gradle.properties 파일을 project root에 만듭니다.

    org.gradle.parallel=true

    clean build를 수행하면 18초로 줄어들었습니다.

     

    Deamon으로 실행하기

    gradle.properties 파일에 설정을 추가합니다.

    org.gradle.daemon=true

     

    기본적으로 설정되어 있어서 그런지 성능개선이 이루어지지 않았습니다.
     

    캐시구성 가능하게 하기

    gradle.properties 파일에 설정을 추가합니다.

    org.gradle.caching=true
    이 또한 gradle clean build 했을때 성능 개선이 이루어지지 않았습니다.
     

     

    heap size 증가시키기

    gradle.properties 파일에 설정을 추가합니다.

    org.gradle.jvmargs=-Xmx2048M
    이 또한 크게 개선되지 않았습니다.
     

    병렬로 테스트 적용하기

    tasks.withType(Test).configureEach {
        maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1
    }

     

    병렬 테스트는 독립적이어야 합니다. 

    파일이나 데이터베이스와 같은 리소스를 공유해서는 안 됩니다. 

    테스트가 리소스를 공유하는 경우 예측할 수 없는 무작위 방식으로 서로 간섭할 수 있습니다.

     

     

    실무 프로젝트에 적용

    • 기존 시간 : 3m 20s
    • gradle.properties 적용 후 시간 : 1m 55s
    • 병렬 테스트 적용 후 시간 : 1m 18s
     

    결론

    이외에도 build script를 수정하는 다양한 방식들이 존재하지만 최대한 간단한 것 위주로 테스트해보았습니다.
    얼마 안되는 시간으로 49초에서 18초대로 270%정도의 성능개선이 일어났습니다.
    이는 개발생산성을 올려줄것으로 기대됩니다.

    심지어 gradle에서는 gradle build dcache deep dive등과 같은 무료 온라인 hands-on training을 제공합니다.

     

    관심 있으신분들은 참고하세요

    https://gradle.com/training/#build-cache-deep-dive

     

    Trainings Archive

     

    gradle.com

     

     

     

     

     

     

     

     

    참고자료

    https://www.jetbrains.com/help/idea/gradle-settings.html

     

    Gradle settings | IntelliJ IDEA

     

    www.jetbrains.com

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

     

    Improve the Performance of Gradle Builds

    Build performance is critical to productivity. The longer builds take to complete, the more likely they’ll disrupt your development flow. Builds run many times a day, so even small waiting periods add up. The same is true for Continuous Integration (CI)

    docs.gradle.org

     

    댓글

Designed by Tistory.