Skip to main content

빌드 및 배포

COP는 S2I(Source to Image) 기반으로 애플리케이션을 쉽게 빌드하고 배포할 수 있는 환경을 제공합니다. Jenkins 또는 Bastion 터미널을 통해 빌드 및 배포를 수행할 수 있으며, Git 저장소에 소스 코드를 커밋하고 푸시하는 것만으로 배포 과정을 자동화할 수 있습니다.


개요

지원 기능

  • S2I 빌드: 소스 코드에서 컨테이너 이미지 자동 생성
  • 자동화된 배포: Jenkins 파이프라인을 통한 CI/CD 자동화
  • 버전 관리: Git 브랜치 및 리비전 기반 이미지 태깅
  • 롤백 지원: 배포 히스토리 관리 및 이전 버전 복원

배포 방식

방식설명사용 대상
Jenkins웹 UI 기반 빌드 및 배포일반 사용자, 운영팀
Bastion 터미널스크립트 기반 빌드 및 배포개발자, DevOps 엔지니어

Jenkins를 통한 빌드 및 배포

1. 신규 프로젝트 생성

Jenkins 화면에서 신규 프로젝트를 생성합니다.

필수 설정 항목

항목설명예시
NAMESPACE네임스페이스 이름 (없으면 자동 생성)openmaru
DEPLOYMENT애플리케이션 배포 이름homepage
GIT_URL빌드할 애플리케이션 Git 저장소 주소https://github.com/example/app.git
BASE_IMAGES2I 빌드 및 실행용 베이스 이미지openjdk:11, tomcat:9
HOSTIngress 접속 URLhomepage-openmaru.apps.cop.rnd01.local
NEXUS_URLMaven/Gradle 내부 저장소 서버 URLhttp://nexus.internal:8081
지원하는 빌드 도구
  • Maven
  • Gradle

자동 생성되는 리소스

Jenkins에서 신규 프로젝트를 생성하면 다음 항목이 자동으로 생성됩니다:

1. Kubernetes 리소스

  • Namespace: 애플리케이션 격리 환경
  • Deployment: 애플리케이션 Pod 배포 및 관리
  • Service: 내부 네트워크 통신 엔드포인트
  • Ingress: 외부 접속을 위한 라우팅 규칙
[COP Console에 생성된 Kubernetes Object]

2. Jenkins Job

  • Build Job: S2I 빌드 및 이미지 Registry 푸시
  • Deploy Job: 클러스터에 이미지 배포 및 롤아웃
[Jenkins에 생성된 Build/Deploy Job]

2. 빌드 Job 실행

빌드 Job을 실행하면 S2I 빌드 후 내부 이미지 Registry에 푸시됩니다.

이미지 태깅 방식

버전 정보는 다음 두 가지 태그로 푸시됩니다:

  • latest: 최신 빌드 이미지
  • {branch}-{revision}: Git 브랜치 및 커밋 해시 기반 고유 태그

빌드 실행 예시

>> Image Tag : main-4375493
>> Start build : homepage in openmaru
...
INFO Running 'mvn -DskipTests package'
[INFO] Error stacktraces are turned on.
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------< io.openmaru.example.war:war-example >-----------------
[INFO] Building example 1.0.0
[INFO] --------------------------------[ war ]---------------------------------
...
[INFO] Building war: /tmp/src/target/ROOT.war
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
...
>> Start push : homepage in openmaru
The push refers to repository [registry.cop.rnd01.local:8443/apps/homepage]
...
latest: digest: sha256:d11b2df4352ab77af3f50cafb586c8f369d9f47b7e71549e5e459874b210fd07 size: 3262
>> Image push completed: registry.cop.rnd01.local:8443/apps/homepage:main-4375493
>> Image push completed: registry.cop.rnd01.local:8443/apps/homepage:latest
>> Done
Finished: SUCCESS
빌드 프로세스
  1. Git 저장소에서 소스 코드 체크아웃
  2. Maven/Gradle을 사용하여 애플리케이션 빌드 (테스트 제외)
  3. 빌드된 JAR/WAR 파일을 베이스 이미지에 포함
  4. 컨테이너 이미지 생성 및 Registry에 푸시

3. 배포 Job 실행

배포 Job을 실행하면 클러스터의 Deployment 이미지를 업데이트하고 롤아웃합니다.

배포 실행 예시

>> Image Tag : main-4375493
>> Start deploy : homepage in openmaru
deployment.apps/homepage image updated
deployment.apps/homepage annotated
>> Waiting for rollout to complete...
Waiting for deployment "homepage" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "homepage" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "homepage" rollout to finish: 1 old replicas are pending termination...
deployment "homepage" successfully rolled out
>> Done
Finished: SUCCESS

Deployment 설정 예시

spec:
replicas: 1
selector:
matchLabels:
application: homepage
template:
metadata:
labels:
application: homepage
openmaru.io/was-agent: 'true'
spec:
containers:
- name: homepage
image: registry.cop.rnd01.local:8443/apps/homepage:main-4375493
ports:
- containerPort: 8080
protocol: TCP
롤링 업데이트

Kubernetes의 롤링 업데이트 전략을 사용하여 무중단 배포를 수행합니다:

  1. 새 버전의 Pod 생성
  2. 새 Pod가 Ready 상태가 되면 기존 Pod 종료
  3. 모든 Pod가 새 버전으로 교체될 때까지 반복

4. 배포 확인

배포가 완료되면 COP 콘솔에서 상태를 확인할 수 있습니다.

[COP 콘솔 배포 완료 화면]
[COP 콘솔 Ingress 정보]

애플리케이션 접속

접속 정보

배포된 애플리케이션은 Ingress Host를 통해 접속할 수 있습니다.

예시: https://homepage-openmaru.apps.cop.rnd01.local/


Bastion 터미널을 통한 빌드 및 배포

Bastion 터미널에서도 빌드 및 배포 스크립트를 이용하여 실행할 수 있습니다.

디렉토리 구조

cd /data/workspaces/apps/openmaru/homepage

# 디렉토리 및 파일 목록
drwxr-xr-x 5 root root 65 818 13:42 git # Git 저장소 (소스 코드)
-rwxr--r-- 1 root root 573 814 19:44 build-app.sh # S2I 빌드 스크립트
-rwxr--r-- 1 root root 540 814 19:44 build-push.sh # 이미지 Registry 푸시 스크립트
-rwxr--r-- 1 root root 601 814 19:44 build-deploy.sh # Kubernetes 배포 스크립트
-rwxr--r-- 1 root root 180 814 19:44 build-history.sh # 배포 히스토리 조회 스크립트
-rwxr--r-- 1 root root 305 814 19:44 build-rollback.sh # 이전 버전 롤백 스크립트

스크립트 설명

스크립트기능설명
build-app.shS2I 빌드소스 코드를 컨테이너 이미지로 빌드
build-push.sh이미지 푸시빌드된 이미지를 Registry에 푸시
build-deploy.sh배포 실행Kubernetes 클러스터에 배포
build-history.sh히스토리 조회배포 히스토리 및 버전 정보 확인
build-rollback.sh롤백이전 버전으로 롤백

사용 예시

1. 전체 빌드 및 배포

# 1. 소스 코드 업데이트
cd /data/workspaces/apps/openmaru/homepage/git
git pull origin main

# 2. S2I 빌드
cd ..
./build-app.sh

# 3. 이미지 푸시
./build-push.sh

# 4. 배포 실행
./build-deploy.sh

2. 배포 히스토리 확인

./build-history.sh

3. 이전 버전 롤백

./build-rollback.sh
Bastion 터미널 장점
  • 빠른 실행: Jenkins UI 없이 직접 실행
  • 자동화 통합: CI/CD 파이프라인에 스크립트 통합 가능
  • 디버깅: 빌드 및 배포 과정을 직접 확인 및 수정 가능