Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: CD 파이프라인 이미지 최적화 및 빌드 성능 개선을 위한 Docker Multi-stage Build, Spring Layered JAR 및 BuildKit 도입 완료 #617

Merged
merged 22 commits into from
Nov 27, 2024

Conversation

limehee
Copy link
Collaborator

@limehee limehee commented Nov 23, 2024

Summary

#616

기존의 단일 단계 Docker 빌드 방식의 한계를 극복하고, 빌드 속도 및 이미지 크기를 최적화하기 위해 Docker Multi-stage Builds, Spring Layered JAR, Docker BuildKit을 도입하였습니다. 또한, Jenkins CD 파이프라인을 최적화하여 전체적인 CD 효율성을 향상시켰습니다. 이를 통해 더 작고 안전한 Docker 이미지를 생성하고, 빌드 시간을 단축하며, 유지 관리성을 높일 수 있게 되었습니다.

Tasks

  • 멀티 스테이지 빌드 적용

    • 빌드 환경과 런타임 환경을 분리하여 단계별 최적화
    • 빌드 스테이지: 빌드 도구 및 종속성을 포함한 빌드 환경 구성
    • 런타임 스테이지: 최소한의 런타임 구성 요소만 포함한 경량 이미지 생성
  • Spring Layered JAR 도입

    • Spring Boot의 Layertools를 활용하여 JAR 파일을 레이어별로 분리
    • Dockerfile에서 레이어별로 필요한 파일만 복사하여 캐싱 효율성 증대
  • Docker BuildKit 활성화 및 최적화

    • 환경 변수 설정을 통해 BuildKit을 기본 빌드 도구로 활성화
  • Jenkins CD 파이프라인 최적화

    • 불필요한 작업 제거: 빌드 및 배포 과정에서 중복되거나 불필요한 단계를 식별하고 제거
    • 병렬화 도입: 가능한 작업을 병렬로 실행하여 전체 빌드 및 배포 시간을 단축
    • 캐시 활용 강화: 이전 빌드의 아티팩트 및 캐시를 효과적으로 재사용하여 빌드 시간을 줄임
  • Dockerfile 및 Jenkinsfile 업데이트

    • 멀티 스테이지 빌드와 Spring Layered JAR를 반영한 Dockerfile 작성
    • BuildKit을 활용한 최적화된 빌드 명령어 및 파이프라인 설정
    • Jenkins 파이프라인에서 병렬 빌드를 구현하고, Docker BuildKit 및 레이어 캐시 활용

ETC

  • Gradle 버전이 8.5에서 8.11.1로 업데이트되었습니다.
  • Nginx의 멤버스 설정 파일명이 default.conf에서 members.conf로 변경되었습니다.

Screenshot

빌드 속도: 17.19% 개선 (2m 37s -> 2m 10s / 별도의 라즈베리파이 5 환경에서 테스트 진행)
이미지 크기: 68.58% 개선 (596.09 MB -> 187.27 MB)

적용 전
image
image

적용 후
image
image

@limehee limehee added 🔨 Refactor 코드 수정 및 개선 🌎 Intra 서버 인프라 및 도메인 관련 labels Nov 24, 2024
Copy link
Contributor

@SongJaeHoonn SongJaeHoonn left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

도커를 공부하면서, 스프링 프로젝트는 결국 JAR파일이 하나로 묶여있어 빌드시 캐시를 어떻게 활용할 수 있을지 의문이었는데요, JAR파일도 Layer화해서 캐싱을 통해 최적화가 가능한 것이었군요..!
소소한 충격입니다

jenkins/prod/Dockerfile Outdated Show resolved Hide resolved
Copy link
Collaborator

@mingmingmon mingmingmon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

좋은 작업 감사합니다! .jar니까 springboot 기반 서버에서는 캐시 효율성을 끌어낼 수 없는건가?라고 생각한 제가 새롭게 배웠습니다.

jenkins/stage/Dockerfile Show resolved Hide resolved
@limehee limehee merged commit 3ca00d5 into develop Nov 27, 2024
3 checks passed
@limehee limehee deleted the refactor/#616 branch November 27, 2024 14:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🌎 Intra 서버 인프라 및 도메인 관련 🔨 Refactor 코드 수정 및 개선
Projects
None yet
3 participants