스프링부트 + Github Actions + Docker 사용 시 빌드 에러 해결

1. 기존에 사용하던 방식 소개

# 소스 빌드용 Base 이미지(Maven, Gradle에 호환되는 JDK 이미지)
FROM amazoncorretto:17-alpine3.19 as build

WORKDIR /app

# 의존성을 가져오기 위해 필요한 파일만 우선 복사
COPY gradle gradle
COPY build.gradle settings.gradle ./
COPY gradlew ./

RUN chmod +x ./gradlew

# Gradle 빌드 명령어 실행 (CI/CD 환경에서 일관된 빌드를 위해 데몬 프로세스 실행 X)
RUN ./gradlew dependencies --no-daemon

COPY src src

# 스프링부트 프로젝트를 Jar 파일로 빌드
RUN ./gradlew clean build

# 빌드된 파일을 실행하는 Base 이미지 : JRE만 포함된 이미지
FROM amazoncorretto:17-alpine3.19

# 빌드된 jar 파일을 "app.jar"라는 이름으로 복사
COPY --from=build /app/build/libs/*.jar app.jar

# 어플리케이션 실행 (/ 루트(절대 경로)에 있는 app.jar 파일을 실행)
ENTRYPOINT ["java","-jar","/app.jar"]

etc-image-0

 

작성한 스프링부트 프로젝트를 도커 이미지로 관리하기 위해 작성한 도커파일이다. 이미지의 크기를 줄이기 위해 멀티 스테이지 빌드 방식으로 작성하였다. 문제는 여기서 발생했던 걸까... RUN ./gradlew clean build 레이어가 실행되는 부분에서 통합 테스트를 계속해서 실패했던 것이다.

 

etc-image-1
삽질의 흔적...

 

2. 바꾼 방식 소개

1) Dockerfile 내에서 빌드 스테이지 제거

일단 도커 파일에서 빌드 스테이지를 제거하였다. 기본적으로 빌드를 실행하는 곳은 Runner(Github Actions가 제공하는 호스트)이기 때문에 Runner에서 직접 Gradlew 명령어를 사용할 수 있도록 하였다.

 

멀티 스테이지 빌드 방식은 어느 환경에서나 동일하게 빌드하고 실행할 수 있다는 장점이 있다. 하지만 Runner에는 통합 테스트에 필요한 MySQL이 필요하기 때문에 Workflow에서 빌드 작업을 상세하게 설정하는 것이 문제를 해결할 수 있는 방법이라고 판단했다.

 

2) Github Actions에서 빌드하기 위한 작업 설정

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

 

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

Github Actions 공식문서에서도 자바 프로젝트를 빌드하고 테스트하기 위한 CI 워크플로우를 지정하는 방법으로 직접 Gradle을 Runner에 세팅하는 방법을 소개하고 있다. (처음부터 공식문서를 읽었더라면 문제를 빨리 해결했을 것...)

 

etc-image-2
깃허브 저장소의 상단에 있는 Actions 탭

 

깃허브 저장소의 상단에 Actions를 들어가서 워크플로우 파일의 템플릿을 지정할 수 있다. 여기서 Java with Gradle을 누르면 JDK 버전 세팅(17)과 Gradle을 설치하는 작업이 추가되어 있는 것을 확인할 수 있다.

 

etc-image-3

 

필자는 앞선 두 가지 세팅(JDK, Gradle)과 함께 MySQL을 설정하는 작업도 지정하였다.

 

https://github.com/actions/runner-images/blob/main/images/ubuntu/Ubuntu2204-Readme.md

 

runner-images/images/ubuntu/Ubuntu2204-Readme.md at main · actions/runner-images

GitHub Actions runner images. Contribute to actions/runner-images development by creating an account on GitHub.

github.com

etc-image-4
ubuntu-latest 이미지에 기본으로 설치되어 있는 MySQL

 

Runner의 실행환경이 ubuntu-latest일 경우, 기본적으로 MySQL이 내장되어 있다. 따라서 sudo 권한으로 명령어 실행 시 MySQL을 실행할 수 있다. 하지만 위와 같이 모듈화된 액션을 사용할 경우, 포트, 데이터베이스 이름, 비밀번호 등을 편리하게 지정할 수 있다.

 

참고로 Github Actions에서 서비스 컨테이너 기능을 사용해서 데이터베이스를 연결할 수도 있다.

https://docs.github.com/ko/actions/using-containerized-services/about-service-containers

 

서비스 컨테이너 정보 - GitHub Docs

서비스 컨테이너를 사용하여 데이터베이스, 웹 서비스, 메모리 캐시 및 기타 도구를 워크플로에 연결할 수 있습니다.

docs.github.com

 

 

출처)

https://ncookie21.tistory.com/23

 

Github Actions 데이터베이스 연동 및 설정 파일 자동 배포

서론 지난번에 Github Actions을 사용하여 로컬에서 master 브랜치에 푸시를 하면 aws 서버에 배포까지 되도록 해보았다. 그 때 사용했던 프로젝트는 start.spring.io에서 받은 파일을 거의 그대로 사용했

ncookie21.tistory.com