[Skaffold] JIB Sync

2024. 1. 4. 16:28· CICD
목차
  1. 개요
  2. 필요 조건
  3. 구동하는 컨테이너 내부에 tar 파일 포함 시키기
  4. spring-boot-devtools 포함 시키기
  5. 테스트 및 결과
반응형

개요

  • Skaffold의 JIB를 사용해 Java spring 프로젝트를 빌드하고 배포
  • JIB Sync 기능을 활용해 변경된 파일만 sync하여 재빌드 및 배포, pod 재시작 단계 생략

 

필요 조건

Skaffold는 build 옵션으로 JIB를 지원하고 있다. 이때 File Sync 기능을 활용하면 변경된 파일을 copy 해주기 때문에 파일이 변경 되더라도 재빌드 및 배포, pod 재시작 단계 없이 구동되고 있는 pod에 변경사항을 적용시킬 수 있다.

JIB Sync 기능을 auto로 사용하기 위해서는 몇가지 필요 요건이 존재한다.

 

File Sync
  1. Sync 기능은 구동하는 컨테이너 내부에 tar가 존재해야 함. 즉, JIB가 build하는 base image에 tar가 포함되어야 함.
  2. spring dependency로 spring-boot-devtools를 포함시켜야 함.

구동하는 컨테이너 내부에 tar 파일 포함 시키기

Skaffold는 sync 규칙에 해당하는 변경 파일을 포함하여 tar 파일을 만들고, 이 파일을 컨테이너에 전송하여 변경 사항을 적용한다.

JIB는 java로 이루어진 프로젝트를 빌드할 때 base image로 gcr.io/distroless/java를 사용한다. 그런데 이 이미지는 tar파일을 포함하지 않는 이미지이기 때문에 tar를 포함하는 gcr.io/distroless/java:debug를 base image로 사용해야 한다.

gcr.io/distroless/java:debug는 linux/arm64에서 지원되지 않는 이미지이다. (linux/amd64에서만 지원)

skaffold dev --platform=linux/amd64 명령어로 위 이미지를 사용할 수 있다.

spring-boot-devtools 포함 시키기

JIB는 Spring에서 필요한 설정들을 인지하지 못하기 때문에 spring-boot-devtools를 의존성으로 주입해 주어야 한다.

공식 문서에서는 spring의 maven(또는 gradle) 파일에 profile을 만들어주고 해당 profile로 빌드할 때에만 이 의존성을 주입하도록 하는 것을 권장하고 있다.
아래 예제에서는 dev라는 profile을 만들어 의존성을 주입하고, skaffold에서는 jib를 build할 때 dev 프로필로 maven(또는 gradle)을 동작시킨다.

<profiles>
  <profile>
    <id>dev</id>
    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <!-- <optional>true</optional> not required -->
      </dependency>
    </dependencies>
  </profile>
</profiles>
dependencies {
  ...
  if (project.hasProperty('dev')) {
    implementation "org.springframework.boot:spring-boot-devtools"
    // do not use developmentOnly
  }
}
# skaffold 추가할 내용
build:
  artifacts:
  - image: test-file-sync
    jib: {}

profiles:
- name: dev
  patches:
  - op: add
    path: /build/artifacts/0/sync
    value:
      - auto: true
  - op: add
    path: /build/artifacts/0/jib/args
    value:
    - -Pdev

 

테스트 및 결과

파일 변경을 감지하고 대응되는 pod에 해당 파일을 copy 하는 것을 볼 수 있다.
이 과정에서 rebuild, redeploy, restart pod 단계는 없으며 spring만 재시작 된다.

Rebuild, Redeploy 과정이 없기 때문에 Helm release의 교체가 없다. 즉, revision이 변경되지 않으므로 버전 관리가 되지 않는다. 버전 관리가 필요하다면 그 시점에 helm repository로 release 배포를 해야 한다.

 

반응형

'CICD' 카테고리의 다른 글

[skaffold] Docker image 크기 및 빌드 시간 줄이기  (0) 2024.01.04
  1. 개요
  2. 필요 조건
  3. 구동하는 컨테이너 내부에 tar 파일 포함 시키기
  4. spring-boot-devtools 포함 시키기
  5. 테스트 및 결과
'CICD' 카테고리의 다른 글
  • [skaffold] Docker image 크기 및 빌드 시간 줄이기
dongb
dongb
Actions lead thoughts.
dongb
Now or Never
dongb
전체
오늘
어제
  • 분류 전체보기 (87)
    • Kotlin (23)
    • Spring (24)
    • Java (5)
    • Istio (7)
    • Kubernetes (19)
    • CICD (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Test
  • Service
  • oauth2.0
  • volume
  • kubernetes
  • 네트워크
  • configmap
  • 챗GPT
  • skaffold
  • POD
  • ChatGPT
  • Database
  • spring data jpa
  • java
  • Kotlin
  • GPT-4
  • GPT

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
dongb
[Skaffold] JIB Sync
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.