본문 바로가기
Gradle

Gradle Build Lifecycle

by codeok 2024. 4. 27.
반응형

Spring Boot를 사용할 때 Gradle을 사용하면 build 명령어를 사용해서 주로 jar를 만들고 사용하고 있었습니다.

내부적으로 어떻게 동작을 해서 jar가 만들어지는 공부하기 위해서 Gradle Build LifeCycle을 공부한 내용을 정리해보려고 합니다.

 

Gradle은 7.5 버전을 사용을 했고 하단 링크를 참고한 Gradle Build LifeCycle 링크입니다.

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

 

 

Gradle Task Graph(작업 그래프)

Gralde은 task라는 단위로 작업을 나누고 작업을 실행하기 전에 작업 그래프를 작성을 합니다.

Gradle build라는 태스크를 실행하면 DAG(방향성 비순환 그래프)로 하단과 같이 build 하위의 태스크들을  역순으로 실행합니다.

  1. compileJava, processResources
  2. classes
  3. jar
  4. test
  5. assemble
  6. check
  7. build

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

 

 

Gradle Build Phases(빌드 단계)

Gradle의 빌드 단계는 3단계로 이루어집니다.

  • 초기화(Initalization) => 구성(Configuration) => 실행(Execution)

각 단계 상세 내용은 하단과 같습니다.

 

  1. Phase 1. 초기화(Initialization)
    1. settings.gradle 파일을 감지한다.
    2. Settings 인스턴스를 생성한다.
    3. 설정 파일을 평가하여 빌드를 구성하는 프로젝트 및 포함된 빌드를 결정한다.
    4. 모든 프로젝트에 대한 Project 인스턴스를 생성한다.
  2. Phase 2. 구성(Configuration)
    1. build.gradle에 있는 모든 프로젝트의 빌드 스크립트를 평가한다.
    2. 요청된 작업에 대한 작업 그래프를 생성한다. (방향성 비순환 그래프 - DAG)
  3. Phase 3.실행(Execution)
    1. 선택한 task를 예약하고 실행한다.
    2. task 간의 종속성에 따라 실행 순서가 결정된다.
    3. task 실행은 병렬로 발생할 수 있다.

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

 

 

Gradle build 실행

자신의 gradle 프로젝트가 있는 곳이나 gradle의 환경변수가 잡힌 곳에서 Spring Boot 프로젝트에 gradle build 명령어를 입력하면 build 태스크를 실행한 결과물들인 classes, jar 등이 있는 것을 볼 수 있습니다.

 

./gradlew build

 

 

Gradle build 실행 상세정보

./gradlew build 명령어를 실행할 때 --info 옵션을 주면 상세정보를 확인 가능합니다.

실행되는 내용들을 자세하게 볼 수 있고 초기화 구문과 compileJava 태스크를 시작으로 build 태스크를 마지막으로 실행하고 종료가 되는 것을 볼 수 있습니다.

./gradlew build --info

Initialized native services in: C:\Users\jaedeok\.gradle\native
Initialized jansi services in: C:\Users\jaedeok\.gradle\native
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Using 8 worker leases.
Now considering [C:\Users\jaedeok\gradle-sample\start-gradle\java-app-sample, C:\Users\jaedeok\gradle-sample\start-gradle\java-app-and-lib\buildSrc, C:\Users\jaedeok\gradle-sample\start-gradle\java-app-and-lib] as hierarchies to watch
Watching the file system is configured to be enabled if available
File system watching is active
Starting Build
Settings evaluated using settings file 'C:\Users\jaedeok\gradle-sample\start-gradle\java-app-sample\settings.gradle'.
Projects loaded. Root project using build file 'C:\Users\jaedeok\gradle-sample\start-gradle\java-app-sample\build.gradle'.
Included projects: [root project 'demo', project ':app']

> Configure project :
Evaluating root project 'demo' using build file 'C:\Users\jaedeok\gradle-sample\start-gradle\java-app-sample\build.gradle'.

> Configure project :app
Evaluating project ':app' using build file 'C:\Users\jaedeok\gradle-sample\start-gradle\java-app-sample\app\build.gradle'.
All projects evaluated.
Task name matched 'build'
Selected primary task 'build' from project :
Tasks to be executed: [task ':app:compileJava', task ':app:processResources', task ':app:classes', task ':app:jar', task ':app:startScripts', task ':app:distTar', task ':app:distZip', task ':app:assemble', task ':app:compileTestJava', task ':app:processTestResources', task ':app:testClasses', task ':app:test', task ':app:check', task ':app:build']
Tasks that were excluded: []
Resolve mutations for :app:compileJava (Thread[Execution worker,5,main]) started.
Resolve mutations for :app:compileJava (Thread[Execution worker,5,main]) completed. Took 0.0 secs.
:app:compileJava (Thread[included builds,5,main]) started.

> Task :app:compileJava UP-TO-DATE
Caching disabled for task ':app:compileJava' because:
  Build cache is disabled
Skipping task ':app:compileJava' as it is up-to-date.
:app:compileJava (Thread[included builds,5,main]) completed. Took 0.016 secs.
Resolve mutations for :app:processResources (Thread[Execution worker,5,main]) started.
Resolve mutations for :app:processResources (Thread[Execution worker,5,main]) completed. Took 0.0 secs.
:app:processResources (Thread[included builds,5,main]) started.

> Task :app:processResources NO-SOURCE
Skipping task ':app:processResources' as it has no source files and no previous output files.
:app:processResources (Thread[included builds,5,main]) completed. Took 0.0 secs.
Resolve mutations for :app:classes (Thread[Execution worker,5,main]) started.
Resolve mutations for :app:classes (Thread[Execution worker,5,main]) completed. Took 0.0 secs.
:app:classes (Thread[included builds,5,main]) started.

> Task :app:classes UP-TO-DATE
Skipping task ':app:classes' as it has no actions.
:app:classes (Thread[included builds,5,main]) completed. Took 0.0 secs.
Resolve mutations for :app:jar (Thread[Execution worker,5,main]) started.
Resolve mutations for :app:jar (Thread[Execution worker,5,main]) completed. Took 0.0 secs.
:app:jar (Thread[included builds,5,main]) started.

> Task :app:jar UP-TO-DATE
Caching disabled for task ':app:jar' because:
  Build cache is disabled
Skipping task ':app:jar' as it is up-to-date.
:app:jar (Thread[included builds,5,main]) completed. Took 0.003 secs.
Resolve mutations for :app:startScripts (Thread[Execution worker,5,main]) started.
Resolve mutations for :app:startScripts (Thread[Execution worker,5,main]) completed. Took 0.0 secs.
:app:startScripts (Thread[included builds,5,main]) started.

> Task :app:startScripts UP-TO-DATE
Caching disabled for task ':app:startScripts' because:
  Build cache is disabled
Skipping task ':app:startScripts' as it is up-to-date.
:app:startScripts (Thread[included builds,5,main]) completed. Took 0.004 secs.
Resolve mutations for :app:distTar (Thread[Execution worker,5,main]) started.
Resolve mutations for :app:distTar (Thread[Execution worker,5,main]) completed. Took 0.0 secs.
:app:distTar (Thread[included builds,5,main]) started.

> Task :app:distTar UP-TO-DATE
Caching disabled for task ':app:distTar' because:
  Build cache is disabled
Skipping task ':app:distTar' as it is up-to-date.
:app:distTar (Thread[included builds,5,main]) completed. Took 0.001 secs.
Resolve mutations for :app:distZip (Thread[Execution worker,5,main]) started.
Resolve mutations for :app:distZip (Thread[Execution worker,5,main]) completed. Took 0.0 secs.
:app:distZip (Thread[included builds,5,main]) started.

> Task :app:distZip UP-TO-DATE
Caching disabled for task ':app:distZip' because:
  Build cache is disabled
Skipping task ':app:distZip' as it is up-to-date.
:app:distZip (Thread[included builds,5,main]) completed. Took 0.001 secs.
Resolve mutations for :app:assemble (Thread[Execution worker,5,main]) started.
Resolve mutations for :app:assemble (Thread[Execution worker,5,main]) completed. Took 0.0 secs.
:app:assemble (Thread[included builds,5,main]) started.

> Task :app:assemble UP-TO-DATE
Skipping task ':app:assemble' as it has no actions.
:app:assemble (Thread[included builds,5,main]) completed. Took 0.0 secs.
Resolve mutations for :app:compileTestJava (Thread[Execution worker,5,main]) started.
Resolve mutations for :app:compileTestJava (Thread[Execution worker,5,main]) completed. Took 0.0 secs.
:app:compileTestJava (Thread[included builds,5,main]) started.

> Task :app:compileTestJava UP-TO-DATE
Caching disabled for task ':app:compileTestJava' because:
  Build cache is disabled
Skipping task ':app:compileTestJava' as it is up-to-date.
:app:compileTestJava (Thread[included builds,5,main]) completed. Took 0.007 secs.
Resolve mutations for :app:processTestResources (Thread[Execution worker,5,main]) started.
Resolve mutations for :app:processTestResources (Thread[Execution worker,5,main]) completed. Took 0.0 secs.
:app:processTestResources (Thread[included builds,5,main]) started.

> Task :app:processTestResources NO-SOURCE
Skipping task ':app:processTestResources' as it has no source files and no previous output files.
:app:processTestResources (Thread[included builds,5,main]) completed. Took 0.0 secs.
Resolve mutations for :app:testClasses (Thread[Execution worker,5,main]) started.
:app:testClasses (Thread[included builds,5,main]) started.
Resolve mutations for :app:testClasses (Thread[Execution worker,5,main]) completed. Took 0.0 secs.

> Task :app:testClasses UP-TO-DATE
Skipping task ':app:testClasses' as it has no actions.
:app:testClasses (Thread[included builds,5,main]) completed. Took 0.0 secs.
Resolve mutations for :app:test (Thread[Execution worker Thread 3,5,main]) started.
Resolve mutations for :app:test (Thread[Execution worker Thread 3,5,main]) completed. Took 0.0 secs.
producer locations for task group 0 (Thread[Execution worker Thread 2,5,main]) started.
:app:test (Thread[included builds,5,main]) started.
producer locations for task group 0 (Thread[Execution worker Thread 2,5,main]) completed. Took 0.0 secs.

> Task :app:test UP-TO-DATE
Caching disabled for task ':app:test' because:
  Build cache is disabled
Skipping task ':app:test' as it is up-to-date.
:app:test (Thread[included builds,5,main]) completed. Took 0.004 secs.
Resolve mutations for :app:check (Thread[Execution worker Thread 2,5,main]) started.
Resolve mutations for :app:check (Thread[Execution worker Thread 2,5,main]) completed. Took 0.0 secs.
:app:check (Thread[included builds,5,main]) started.

> Task :app:check UP-TO-DATE
Skipping task ':app:check' as it has no actions.
:app:check (Thread[included builds,5,main]) completed. Took 0.0 secs.
Resolve mutations for :app:build (Thread[Execution worker Thread 2,5,main]) started.
Resolve mutations for :app:build (Thread[Execution worker Thread 2,5,main]) completed. Took 0.0 secs.
:app:build (Thread[included builds,5,main]) started.

> Task :app:build UP-TO-DATE
Skipping task ':app:build' as it has no actions.
:app:build (Thread[included builds,5,main]) completed. Took 0.0 secs.

 

 

정리

Gradle Build LifyCycle과 Gradle build 명령어를 실행하면 어떤 task들이 실행되는지 알아봤습니다.

 

감사합니다.

반응형