Github Actions CI 소요시간 단축시키기 (Gradle 빌드)

1. gradlew 명령어 (build vs bootJar)

etc-image-0
gradlew bootJar 작업에서 수행되는 하위 작업들

 

etc-image-1
gradlew build 작업에서 수행되는 하위 작업들

 

gradlew bootJar는 실행가능한 jar 파일을 만드는데 필요한 작업들만 수행하고 있다. 위 그림과 같이 build 작업은 bootJar 작업 이외에도 test, check, assemble 같은 작업들이 포함된다. (check는 test에 의존적인 작업으로 test가 수행된 후에 진행됨)

 

etc-image-2
절반 이상 차이나는 CI 시간

 

따라서 이처럼 CI 워크플로우 동작시 시간차이가 발생하게 된다. 하지만 bootJar에는 test 작업이 포함되지 않는다. 모든 test를 통과해야만 실행가능한 jar 파일을 만들어야 한다면 bootJar를 test에 의존적인 작업으로 만들면 된다. 이는 build.gradle을 통해 추가할 수 있다.

 

// build.gradle에 추가

bootJar {
    dependsOn test // bootJar 작업을 test 작업이 실행됐을 때, 실행하도록 설정
}

 

etc-image-3

 

이처럼 bootJar 작업을 수행했을 때, test 작업이 먼저 선행되는 것을 알 수 있다. 수행되는 작업을 출력하기 위해서는 끝에 --console=plain을 추가하면 된다.

 

etc-image-4

 

Runner에서도 정상적으로 동작하는 것을 알 수 있다.

 

etc-image-5
clean build
etc-image-6
clean bootJar(task 작업 선행)

 

CI 소요시간이 35% 가량 감소하였다. (3분 21초 -> 2분 10초)

 

2. gradle-setup 액션을 통해 빌드 캐시 사용

https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle#caching-dependencies

 

Building and testing Java with Gradle - GitHub Docs

You can create a continuous integration (CI) workflow in GitHub Actions to build and test your Java project with Gradle.

docs.github.com

etc-image-7

캐싱된 빌드 스크립트는 이후 CI에서 다시 컴파일되지 않으며, 의존성 또한 원격 저장소로부터 다시 다운받지 않게 된다. 따라서 CI/CD가 빈번할 경우, 소요 시간을 단축함에 있어서 효과적인 방법이다.

 

https://github.com/marketplace/actions/gradle-build-action

 

Gradle Build Action - GitHub Marketplace

Configures Gradle for GitHub actions, caching state and generating a dependency graph via Dependency Submission

github.com

etc-image-8
gradle-build-action이 setup-gradle로 대체됨

 

etc-image-9

 

test 작업이 포함되지 않은 bootJar에 대한 CI 소요시간을 비교한 결과, 7초 정도 차이가 있었다.

 

etc-image-10
7초 단축됨

 

출처)

https://stir.tistory.com/239

 

gradle build bootJar 차이

gradle build gradle build는 bootJar와 달리 내부 동작이 더 길다. 그리고 그 내부 동작에는 bootJar를 포함한다. build는 test 코드가 있다면 테스트도 수행을 한다. build와 bootJar가 다른 것 중 대표적인 것은 L

stir.tistory.com

https://velog.io/@gnlals1/gradlew%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-ec2%EC%97%90-spring-boot-%EC%84%9C%EB%B2%84-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0-feat.-jasypt

 

gradlew을 이용하여 ec2에 spring boot 서버 배포하기 (feat. jasypt)

spring boot 프로젝트를 EC2에 배포하면서 알게된 내용을 요약 정리하는 글입니다.application.yml에는 데이터베이스 커넥션을 위한 DB정보들이 담깁니다.실제 운영서버에서는 어떻게든 이 DB 정보들을

velog.io

https://umanking.github.io/2023/03/05/processor-architecture-x86-arm/

 

x86과 ARM: 둘의 차이점

컴퓨터 소프트웨어를 개발하는데 있어서, 프로세서의 아키텍쳐는 매우 중요한 역할을 합니다. 이번 글에서는 가장 인기 있는 아키텍처인 x86과 ARM에 대해 비교하고자 합니다. 둘의 차이점은 무

umanking.github.io

https://btcd.tistory.com/1108

 

[Docker] Docker Buildx 란?

베하~! BTC_녹차공원 팀의 하동녹차 입니다. 벌써 5월이 얼마 남지 않았는데요! 시간이 정말 빠른 것 같습니다🤣 이번주는 Docker Buildx 에 대한 설명과 Docker buildx 사용법에 대해 설명 해드리겠습니

btcd.tistory.com