[Gradle]그래들 알아보기 9 - Gradle Incremental Builds and Build Caching
SW개발/Spring

[Gradle]그래들 알아보기 9 - Gradle Incremental Builds and Build Caching

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

 

Gradle Incremental Builds and Build Caching

An incremental build is a build that avoids running tasks whose inputs have not changed since the previous build. Re-executing such tasks is unnecessary if they would only re-produce the same output. For incremental builds to work, tasks must define their

docs.gradle.org

 

Gradle Incremental Builds and Build Caching

그래들은 빌드 시간을 줄이기 위해 증분된 빌드와 빌드 캐싱이라는 두가지 기능을 사용합니다.

 

 

Incremental builds

이전에 빌드 이후 변경된 입력이 존재하지 않는 경우에 태스크를 수행하는 것을 방지합니다. 동일한 출력만 재생성하는 경우 태스크를 다시 수행할 필요가 없습니다.

 

증분 빌드가 작동하려면 태스크에서 입력과 출력을 정의해야 합니다. 그래들은 빌드 시에 입력 또는 출력이 변경되었는지 확인합니다. 변경된 경우 그래들이 태스크를 실행하고, 변경되지 않았다면 태스크를 실행하지 않습니다.

 

증분 빌드는 항상 활성화 되어 있으며, 이를 확인할 수 있는 가장 좋은 방법은 verbose 모드를 활성화 하는 것입니다. verbose 모드에서는 각각의 태스크가 빌드 동안에 라벨링 됩니다.

$ ./gradlew compileJava --console=verbose

> Task :buildSrc:generateExternalPluginSpecBuilders UP-TO-DATE
> Task :buildSrc:extractPrecompiledScriptPluginPlugins UP-TO-DATE
> Task :buildSrc:compilePluginsBlocks UP-TO-DATE
> Task :buildSrc:generatePrecompiledScriptPluginAccessors UP-TO-DATE
> Task :buildSrc:generateScriptPluginAdapters UP-TO-DATE
> Task :buildSrc:compileKotlin UP-TO-DATE
> Task :buildSrc:compileJava NO-SOURCE
> Task :buildSrc:compileGroovy NO-SOURCE
> Task :buildSrc:pluginDescriptors UP-TO-DATE
> Task :buildSrc:processResources UP-TO-DATE
> Task :buildSrc:classes UP-TO-DATE
> Task :buildSrc:jar UP-TO-DATE
> Task :list:compileJava UP-TO-DATE
> Task :utilities:compileJava UP-TO-DATE
> Task :app:compileJava UP-TO-DATE

BUILD SUCCESSFUL in 374ms
12 actionable tasks: 12 up-to-date

태스크를 실행할 때 이전에 실행되었고 변경 사항이 없다면 UP-TO-DATE가 태스크 오른쪽에 출력됩니다.

 

Build caching

증분 빌드는 이미 완료된 작업을 방지하는데 훌륭한 최적화입니다. 만약 개발자가 하나의 파일을 변경하였을 때 프로젝트의 모든 다른 파일에 대해서 다시 빌드할 필요가 없을 것입니다.

 

그러나, 같은 개발자가 지난주에 생성된 새 브랜치로 전환하면 어떻게 될까요? 개발자가 이전에 빌드된 항목을 빌드하는 경우에도 파일이 다시 빌드됩니다.

이러한 상황에서 빌드 캐싱이 도움됩니다.

 

빌드 캐시는 이전 빌드 결과를 저장하고 필요할 때 복원합니다. 이는 시간이 많이 걸리고 비용이 많이드는 프로세스를 실행하는 데 따른 중복 작업과 비용을 방지합니다.

 

빌드 캐시를 사용하여 로컬 디렉토리를 다시 채우면 태스크 오른쪽에 FROM-CACHE로 마킹됩니다.

$ ./gradlew compileJava --build-cache

> Task :buildSrc:generateExternalPluginSpecBuilders UP-TO-DATE
> Task :buildSrc:extractPrecompiledScriptPluginPlugins UP-TO-DATE
> Task :buildSrc:compilePluginsBlocks UP-TO-DATE
> Task :buildSrc:generatePrecompiledScriptPluginAccessors UP-TO-DATE
> Task :buildSrc:generateScriptPluginAdapters UP-TO-DATE
> Task :buildSrc:compileKotlin UP-TO-DATE
> Task :buildSrc:compileJava NO-SOURCE
> Task :buildSrc:compileGroovy NO-SOURCE
> Task :buildSrc:pluginDescriptors UP-TO-DATE
> Task :buildSrc:processResources UP-TO-DATE
> Task :buildSrc:classes UP-TO-DATE
> Task :buildSrc:jar UP-TO-DATE
> Task :list:compileJava FROM-CACHE
> Task :utilities:compileJava FROM-CACHE
> Task :app:compileJava FROM-CACHE

BUILD SUCCESSFUL in 364ms
12 actionable tasks: 3 from cache, 9 up-to-date

로컬 디렉토리가 한번 채워지면, 다음 실행은 FROM-CACHE가 아닌 UP-TO-DATE로 표시됩니다.

 

빌드 캐시를 사용하면 팀 전체에서 변경되지 않은 빌드 및 테스트 출력을 공유하고 재사용할 수 있습니다. 새로운 코드 변경에 영향을 받지 않는 바이너리를 다시 빌드하는데 사이클이 낭비되지 않아 로컬 및 CI 빌드 속도가 빨라집니다.

 

728x90