빌드 및 배포
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_IMAGE | S2I 빌드 및 실행용 베이스 이미지 | openjdk:11, tomcat:9 |
| HOST | Ingress 접속 URL | homepage-openmaru.apps.cop.rnd01.local |
| NEXUS_URL | Maven/Gradle 내부 저장소 서버 URL | http://nexus.internal:8081 |
지원하는 빌드 도구
- Maven
- Gradle

자동 생성되는 리소스
Jenkins에서 신규 프로젝트를 생성하면 다음 항목이 자동으로 생성됩니다:
1. Kubernetes 리소스
- Namespace: 애플리케이션 격리 환경
- Deployment: 애플리케이션 Pod 배포 및 관리
- Service: 내부 네트워크 통신 엔드포인트
- Ingress: 외부 접속을 위한 라우팅 규칙

2. Jenkins Job
- Build Job: S2I 빌드 및 이미지 Registry 푸시
- 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
빌드 프로세스
- Git 저장소에서 소스 코드 체크아웃
- Maven/Gradle을 사용하여 애플리케이션 빌드 (테스트 제외)
- 빌드된 JAR/WAR 파일을 베이스 이미지에 포함
- 컨테이너 이미지 생성 및 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의 롤링 업데이트 전략을 사용하여 무중단 배포를 수행합니다:
- 새 버전의 Pod 생성
- 새 Pod가 Ready 상태가 되면 기존 Pod 종료
- 모든 Pod가 새 버전으로 교체될 때까지 반복
4. 배포 확인
배포가 완료되면 COP 콘솔에서 상태를 확인할 수 있습니다.


애플리케이션 접속
접속 정보
배포된 애플리케이션은 Ingress Host를 통해 접속할 수 있습니다.
Bastion 터미널을 통한 빌드 및 배포
Bastion 터미널에서도 빌드 및 배포 스크립트를 이용하여 실행할 수 있습니다.
디렉토리 구조
cd /data/workspaces/apps/openmaru/homepage
# 디렉토리 및 파일 목록
drwxr-xr-x 5 root root 65 8월 18 13:42 git # Git 저장소 (소스 코드)
-rwxr--r-- 1 root root 573 8월 14 19:44 build-app.sh # S2I 빌드 스크립트
-rwxr--r-- 1 root root 540 8월 14 19:44 build-push.sh # 이미지 Registry 푸시 스크립트
-rwxr--r-- 1 root root 601 8월 14 19:44 build-deploy.sh # Kubernetes 배포 스크립트
-rwxr--r-- 1 root root 180 8월 14 19:44 build-history.sh # 배포 히스토리 조회 스크립트
-rwxr--r-- 1 root root 305 8월 14 19:44 build-rollback.sh # 이전 버전 롤백 스크립트
스크립트 설명
| 스크립트 | 기능 | 설명 |
|---|---|---|
| build-app.sh | S2I 빌드 | 소스 코드를 컨테이너 이미지로 빌드 |
| 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 파이프라인에 스크립트 통합 가능
- 디버깅: 빌드 및 배포 과정을 직접 확인 및 수정 가능