본문 바로가기

Build/Gradle

Gradle 도큐먼트: 빌드 최적화를 위한 증분 빌드(Incremental build)

더보기

Gradle은 빌드를 다양한 방면으로 최적화합니다. Gradle의 최적화 방법 중 하나로 증분 빌드(Incremental build)가 있습니다.

Incremental build를 사용하면 이전 빌드 이후로 입력이 변경되지 않은 Task를 실행하지 않습니다.

이 문서의 시작에 앞서 이 블로그의 문서: Gradle 플러그인(Plugin) 적용하기를 선행해야 합니다.

Incremental build가 동작하려면 Task입력(Input)출력(Output)으로 정의되어야 합니다.

빌드가 진행 될 때 Gradle은 Input과 Output에 변경 사항이 있는지 검사합니다.

I/O에 변경 사항이 있다면 빌드를 진행할 것이고, 변경 사항이 없다면 해당 Task는 진행하지 않고 건너뜁니다.

Incremental build 사용하기

Incremental build를 확인하기 위해서 콘솔에서 출력되는 내용을 확장합니다.

tutorial 프로젝트의 루트 디렉토리에서 gradle.properties 파일을 생성합니다.

$ touch gradle.properties

파일에 org.gradle.console=verbose 프로퍼티를 추가합니다.

org.gradle.console=verbose

./gradlew :app:clean :app:build를 실행해 cleanbuild Task를 수행합니다.

$ ./gradlew :app:clean :app:build

> Task :app:clean
> Task :app:compileJava
> Task :app:processResources NO-SOURCE
> Task :app:classes
> Task :app:jar
> Task :app:startScripts
> Task :app:distTar
> Task :app:distZip
> Task :app:assemble
> Task :app:compileTestJava
> Task :app:processTestResources NO-SOURCE
> Task :app:testClasses
> Task :app:test
> Task :app:check
> Task :app:build

BUILD SUCCESSFUL in 1s
8 actionable tasks: 8 executed

Gradle이 모든 Task를 호출하였으며 성공적으로 진행되었습니다.

다시 한번 ./gradlew :app:build를 실행하고 콘솔에서 출력되는 로그의 차이점을 확인합니다.

$ ./gradlew :app:build

> Task :app:compileJava UP-TO-DATE
> Task :app:processResources NO-SOURCE
> Task :app:classes UP-TO-DATE
> Task :app:jar UP-TO-DATE
> Task :app:startScripts UP-TO-DATE
> Task :app:distTar UP-TO-DATE
> Task :app:distZip UP-TO-DATE
> Task :app:assemble UP-TO-DATE
> Task :app:compileTestJava UP-TO-DATE
> Task :app:processTestResources NO-SOURCE
> Task :app:testClasses UP-TO-DATE
> Task :app:test UP-TO-DATE
> Task :app:check UP-TO-DATE
> Task :app:build UP-TO-DATE

BUILD SUCCESSFUL in 409ms
7 actionable tasks: 7 up-to-date

대부분의 Task가 UP-TO-DATE 레이블과 함께 출력되었습니다.

UP-TO-DATE는 Gradle이 Task의 I/O의 변경을 감지하지 못해 Task를 수행하지 않고 건너뛰었음을 의미합니다.

레이블(Labels) 유형

Gradle 프로퍼티 org.gradle.console=verbose가 활성 상태에서 표시되는 레이블은 다음 4가지입니다.

레이블(Outcome labels) 비고
UP-TO-DATE Incremental build에 의해서 이전에 이미 실행되었으며 I/O 변경이 없는 Task입니다.
SKIPPED Task가 명시적으로 실행 차단된 경우입니다.
FROM-CACHE Task 출력(Output)빌드 캐시(Build cache)에 존재하는 이전 빌드로부터 로컬 디렉토리에 복사되었습니다.
NO-SOURCE 필요한 Input을 사용 할 수 없어 Task 역시 실행되지 않은 경우입니다.
더보기

콘솔에서 레이블을 표시하도록 되어있으나 레이블이 없으면 Task가 새로 실행된 경우입니다.

정리 및 복습

  • Gradle의 빌드 최적화 중 하나는 증분 빌드(Incremental build)입니다.
  • Incremental build는 Task의 입력(Input)과 출력(Output)에 변경 사항이 없을 때 수행하지 않고 건너뛰게 됩니다.
  • Gradle 프로젝트에서 프로퍼티를 적용하려면 루트 디렉토리에 gradle.properties를 생성합니다.
  • 프로퍼티 org.gradle.console=verbose는 Gradle 명령문에서 레이블을 표시합니다.
  • 표시되는 레이블은 UP-TO-DATE SKIPPED FROM-CACHE NO-SOURCE가 있습니다.
  • 레이블이 등록되지 않은 Task는 Gradle에 의해서 새로 실행된 경우입니다.