mirror of
https://github.com/cna-bootcamp/phonebill.git
synced 2025-12-06 16:16:23 +00:00
- Kustomize 기반 환경별 배포 구조 구성 * Base: 공통 매니페스트 (29개 파일) * Overlays: dev/staging/prod 환경별 설정 (39개 파일) * 환경별 리소스 및 보안 정책 차별화 - Jenkins 파이프라인 구현 * JDK 21, Podman, Kustomize 통합 * SonarQube 품질 분석 및 Quality Gate * 환경별 이미지 태그 및 배포 자동화 * Pod 자동 정리로 리소스 최적화 - 운영 도구 및 스크립트 * 수동 배포 스크립트 (deploy.sh) * 리소스 검증 스크립트 (validate-resources.sh) * 환경별 설정 파일 관리 - 완전한 가이드 문서 * Jenkins 설정 및 Credentials 등록 방법 * SonarQube 연동 및 Quality Gate 설정 * 배포 실행 및 트러블슈팅 가이드 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
377 lines
10 KiB
Markdown
377 lines
10 KiB
Markdown
# phonebill Jenkins CI/CD 파이프라인 구축 가이드
|
|
|
|
## 📋 개요
|
|
|
|
본 가이드는 phonebill 프로젝트를 위한 Jenkins + Kustomize 기반 CI/CD 파이프라인 구축 방법을 제공합니다.
|
|
|
|
### 프로젝트 정보
|
|
- **시스템명**: phonebill
|
|
- **서비스 목록**: api-gateway, user-service, bill-service, product-service, kos-mock
|
|
- **JDK 버전**: 21
|
|
- **Azure 환경**:
|
|
- ACR: acrdigitalgarage01
|
|
- 리소스 그룹: rg-digitalgarage-01
|
|
- AKS 클러스터: aks-digitalgarage-01
|
|
- 네임스페이스: phonebill-dg0500
|
|
|
|
## 🏗️ 파이프라인 아키텍처
|
|
|
|
### 주요 구성 요소
|
|
- **빌드**: Gradle 기반 멀티모듈 빌드
|
|
- **품질 검증**: SonarQube 분석 & Quality Gate
|
|
- **컨테이너화**: Podman 기반 이미지 빌드
|
|
- **배포**: Kustomize를 통한 환경별 배포
|
|
- **인프라**: AKS (Azure Kubernetes Service)
|
|
|
|
### 환경별 설정
|
|
| 환경 | Replicas | CPU Request | Memory Request | CPU Limit | Memory Limit |
|
|
|------|----------|-------------|----------------|-----------|--------------|
|
|
| dev | 1 | 256m | 256Mi | 1024m | 1024Mi |
|
|
| staging | 2 | 512m | 512Mi | 2048m | 2048Mi |
|
|
| prod | 3 | 1024m | 1024Mi | 4096m | 4096Mi |
|
|
|
|
## 🚀 Jenkins 서버 환경 구성
|
|
|
|
### 1. Jenkins 필수 플러그인 설치
|
|
|
|
Jenkins 관리 > Plugin Manager에서 다음 플러그인들을 설치해주세요:
|
|
|
|
```bash
|
|
# Jenkins 필수 플러그인 목록
|
|
- Kubernetes
|
|
- Pipeline Utility Steps
|
|
- Docker Pipeline
|
|
- GitHub
|
|
- SonarQube Scanner
|
|
- Azure Credentials
|
|
```
|
|
|
|
### 2. Jenkins Credentials 등록
|
|
|
|
**Manage Jenkins > Credentials > Add Credentials**에서 다음 인증 정보들을 등록해주세요:
|
|
|
|
#### Azure Service Principal
|
|
```
|
|
Kind: Microsoft Azure Service Principal
|
|
ID: azure-credentials
|
|
Subscription ID: {구독ID}
|
|
Client ID: {클라이언트ID}
|
|
Client Secret: {클라이언트시크릿}
|
|
Tenant ID: {테넌트ID}
|
|
Azure Environment: Azure
|
|
```
|
|
|
|
#### ACR Credentials
|
|
```
|
|
Kind: Username with password
|
|
ID: acr-credentials
|
|
Username: acrdigitalgarage01
|
|
Password: {ACR_PASSWORD}
|
|
```
|
|
|
|
#### Docker Hub Credentials (Rate Limit 해결용)
|
|
```
|
|
Kind: Username with password
|
|
ID: dockerhub-credentials
|
|
Username: {DOCKERHUB_USERNAME}
|
|
Password: {DOCKERHUB_PASSWORD}
|
|
참고: Docker Hub 무료 계정 생성 (https://hub.docker.com)
|
|
```
|
|
|
|
#### SonarQube Token
|
|
```
|
|
Kind: Secret text
|
|
ID: sonarqube-token
|
|
Secret: {SonarQube토큰}
|
|
```
|
|
|
|
## 📂 Kustomize 구조
|
|
|
|
```
|
|
deployment/cicd/kustomize/
|
|
├── base/
|
|
│ ├── kustomization.yaml # Base 설정
|
|
│ ├── common/ # 공통 리소스
|
|
│ │ ├── cm-common.yaml
|
|
│ │ ├── secret-common.yaml
|
|
│ │ ├── secret-imagepull.yaml
|
|
│ │ └── ingress.yaml
|
|
│ ├── api-gateway/ # API Gateway 리소스
|
|
│ │ ├── deployment.yaml
|
|
│ │ ├── service.yaml
|
|
│ │ └── cm-api-gateway.yaml
|
|
│ ├── user-service/ # User Service 리소스
|
|
│ │ ├── deployment.yaml
|
|
│ │ ├── service.yaml
|
|
│ │ ├── cm-user-service.yaml
|
|
│ │ └── secret-user-service.yaml
|
|
│ ├── bill-service/ # Bill Service 리소스
|
|
│ │ ├── deployment.yaml
|
|
│ │ ├── service.yaml
|
|
│ │ ├── cm-bill-service.yaml
|
|
│ │ └── secret-bill-service.yaml
|
|
│ ├── product-service/ # Product Service 리소스
|
|
│ │ ├── deployment.yaml
|
|
│ │ ├── service.yaml
|
|
│ │ ├── cm-product-service.yaml
|
|
│ │ └── secret-product-service.yaml
|
|
│ └── kos-mock/ # KOS Mock 리소스
|
|
│ ├── deployment.yaml
|
|
│ ├── service.yaml
|
|
│ └── cm-kos-mock.yaml
|
|
└── overlays/
|
|
├── dev/ # 개발 환경
|
|
│ ├── kustomization.yaml
|
|
│ ├── cm-common-patch.yaml
|
|
│ ├── secret-common-patch.yaml
|
|
│ ├── ingress-patch.yaml
|
|
│ ├── deployment-*-patch.yaml (각 서비스별)
|
|
│ └── secret-*-patch.yaml (Secret 보유 서비스)
|
|
├── staging/ # 스테이징 환경
|
|
│ └── (dev와 동일한 구조)
|
|
└── prod/ # 운영 환경
|
|
└── (dev와 동일한 구조)
|
|
```
|
|
|
|
## 🔧 Jenkins Pipeline Job 생성
|
|
|
|
### 1. 새 Pipeline Job 생성
|
|
1. Jenkins 대시보드에서 **New Item** 클릭
|
|
2. **Pipeline** 선택하고 프로젝트명 입력
|
|
3. **OK** 클릭
|
|
|
|
### 2. Pipeline 설정
|
|
#### General 탭
|
|
- **Build Parameters** 추가:
|
|
```
|
|
ENVIRONMENT: Choice Parameter
|
|
Choices: dev, staging, prod
|
|
Default: dev
|
|
|
|
IMAGE_TAG: String Parameter
|
|
Default: latest
|
|
Description: 이미지 태그 (기본값: latest)
|
|
|
|
SKIP_SONARQUBE: String Parameter
|
|
Default: true
|
|
Description: SonarQube 분석 건너뛰기 (true/false)
|
|
```
|
|
|
|
#### Pipeline 탭
|
|
```
|
|
Definition: Pipeline script from SCM
|
|
SCM: Git
|
|
Repository URL: {Git저장소URL}
|
|
Branch: main (또는 develop)
|
|
Script Path: deployment/cicd/Jenkinsfile
|
|
```
|
|
|
|
## 📊 SonarQube 프로젝트 설정
|
|
|
|
### 1. 각 서비스별 SonarQube 프로젝트 생성
|
|
- phonebill-api-gateway-{환경}
|
|
- phonebill-user-service-{환경}
|
|
- phonebill-bill-service-{환경}
|
|
- phonebill-product-service-{환경}
|
|
- phonebill-kos-mock-{환경}
|
|
|
|
### 2. Quality Gate 설정
|
|
```
|
|
Coverage: >= 80%
|
|
Duplicated Lines: <= 3%
|
|
Maintainability Rating: <= A
|
|
Reliability Rating: <= A
|
|
Security Rating: <= A
|
|
```
|
|
|
|
## 🚀 배포 실행 방법
|
|
|
|
### 1. Jenkins Pipeline 실행
|
|
1. Jenkins > {프로젝트명} > **Build with Parameters** 클릭
|
|
2. 파라미터 설정:
|
|
- **ENVIRONMENT**: dev/staging/prod 선택
|
|
- **IMAGE_TAG**: 이미지 태그 입력 (선택사항)
|
|
- **SKIP_SONARQUBE**: SonarQube 분석 건너뛰려면 "true", 실행하려면 "false"
|
|
3. **Build** 클릭
|
|
|
|
### 2. 수동 배포 (스크립트 사용)
|
|
```bash
|
|
# 개발 환경 배포
|
|
./deployment/cicd/scripts/deploy.sh dev 20241230120000
|
|
|
|
# 스테이징 환경 배포
|
|
./deployment/cicd/scripts/deploy.sh staging 20241230120000
|
|
|
|
# 운영 환경 배포
|
|
./deployment/cicd/scripts/deploy.sh prod 20241230120000
|
|
```
|
|
|
|
### 3. 배포 상태 확인
|
|
```bash
|
|
# Pod 상태 확인
|
|
kubectl get pods -n phonebill-dg0500
|
|
|
|
# 서비스 상태 확인
|
|
kubectl get services -n phonebill-dg0500
|
|
|
|
# Ingress 상태 확인
|
|
kubectl get ingress -n phonebill-dg0500
|
|
|
|
# 특정 서비스 로그 확인
|
|
kubectl logs -f deployment/user-service -n phonebill-dg0500
|
|
```
|
|
|
|
## 🔍 리소스 검증
|
|
|
|
### 리소스 검증 스크립트 실행
|
|
```bash
|
|
# 모든 Kustomize 리소스 검증
|
|
./deployment/cicd/scripts/validate-resources.sh
|
|
```
|
|
|
|
### 수동 검증 명령어
|
|
```bash
|
|
# Base 검증
|
|
kubectl kustomize deployment/cicd/kustomize/base/
|
|
|
|
# 환경별 검증
|
|
kubectl kustomize deployment/cicd/kustomize/overlays/dev/
|
|
kubectl kustomize deployment/cicd/kustomize/overlays/staging/
|
|
kubectl kustomize deployment/cicd/kustomize/overlays/prod/
|
|
```
|
|
|
|
## 🔄 롤백 방법
|
|
|
|
### 1. Kubernetes 롤백
|
|
```bash
|
|
# 특정 버전으로 롤백
|
|
kubectl rollout undo deployment/{서비스명} -n phonebill-dg0500 --to-revision=2
|
|
|
|
# 롤백 상태 확인
|
|
kubectl rollout status deployment/{서비스명} -n phonebill-dg0500
|
|
```
|
|
|
|
### 2. 이미지 태그 기반 롤백
|
|
```bash
|
|
# 이전 안정 버전 이미지 태그로 업데이트
|
|
cd deployment/cicd/kustomize/overlays/{환경}
|
|
kustomize edit set image acrdigitalgarage01.azurecr.io/phonebill/{서비스명}:{환경}-{이전태그}
|
|
kubectl apply -k .
|
|
```
|
|
|
|
## 🎯 파이프라인 단계별 설명
|
|
|
|
### 1. Get Source
|
|
- Git 저장소에서 소스코드 체크아웃
|
|
- 환경별 설정 파일 로드
|
|
|
|
### 2. Setup AKS
|
|
- Azure CLI를 통한 AKS 클러스터 연결
|
|
- 네임스페이스 생성 (phonebill-dg0500)
|
|
|
|
### 3. Build
|
|
- Gradle을 통한 멀티모듈 빌드
|
|
- 테스트는 SonarQube 단계에서 실행
|
|
|
|
### 4. SonarQube Analysis & Quality Gate
|
|
- 각 서비스별 개별 테스트 실행
|
|
- JaCoCo 코드 커버리지 리포트 생성
|
|
- SonarQube 정적 분석
|
|
- Quality Gate 통과 검증
|
|
|
|
### 5. Build & Push Images
|
|
- Podman을 통한 컨테이너 이미지 빌드
|
|
- 환경별 태그로 ACR에 푸시
|
|
- 30분 타임아웃 설정
|
|
|
|
### 6. Update Kustomize & Deploy
|
|
- Kustomize를 통한 이미지 태그 업데이트
|
|
- 환경별 매니페스트 적용
|
|
- 배포 완료까지 대기 (5분 타임아웃)
|
|
|
|
### 7. Pipeline Complete
|
|
- 파이프라인 완료 상태 로깅
|
|
- Pod 자동 정리 (3초 후 종료)
|
|
|
|
## ⚠️ 주의사항
|
|
|
|
### 1. 파드 자동 정리
|
|
- 파이프라인 완료 시 에이전트 파드 자동 삭제
|
|
- `podRetention: never()` 설정으로 즉시 정리
|
|
- 리소스 절약을 위한 필수 설정
|
|
|
|
### 2. 변수 참조 문법
|
|
- Jenkins Groovy에서는 `${variable}` 사용
|
|
- `\${variable}` 사용 시 "syntax error: bad substitution" 오류 발생
|
|
|
|
### 3. 쉘 호환성
|
|
- Jenkins 컨테이너 기본 쉘이 `/bin/sh`인 경우
|
|
- Bash 배열 문법 `()` 미지원으로 공백 구분 문자열 사용
|
|
|
|
### 4. 환경별 설정 차이점
|
|
- **DEV**: SSL 리다이렉트 비활성화, 기본 도메인 사용
|
|
- **STAGING/PROD**: SSL 리다이렉트 활성화, 사용자 정의 도메인, 인증서 설정
|
|
|
|
## 🛠️ 트러블슈팅
|
|
|
|
### 1. 빌드 실패
|
|
```bash
|
|
# Gradle 캐시 클리어
|
|
./gradlew clean build
|
|
|
|
# JDK 버전 확인
|
|
java -version
|
|
```
|
|
|
|
### 2. 이미지 푸시 실패
|
|
```bash
|
|
# ACR 로그인 확인
|
|
az acr login --name acrdigitalgarage01
|
|
|
|
# Docker Hub rate limit 확인
|
|
docker info | grep -i rate
|
|
```
|
|
|
|
### 3. 배포 실패
|
|
```bash
|
|
# 네임스페이스 확인
|
|
kubectl get namespaces
|
|
|
|
# 리소스 상태 확인
|
|
kubectl describe deployment/{서비스명} -n phonebill-dg0500
|
|
```
|
|
|
|
### 4. SonarQube 분석 실패
|
|
- SonarQube 서버 연결 상태 확인
|
|
- 토큰 유효성 검증
|
|
- Quality Gate 설정 확인
|
|
|
|
## 📈 모니터링 및 로그
|
|
|
|
### 1. Jenkins 빌드 히스토리
|
|
- 각 단계별 실행 시간 추적
|
|
- 실패 단계 및 원인 분석
|
|
|
|
### 2. 애플리케이션 로그
|
|
```bash
|
|
# 실시간 로그 모니터링
|
|
kubectl logs -f deployment/{서비스명} -n phonebill-dg0500
|
|
|
|
# 특정 기간 로그 확인
|
|
kubectl logs deployment/{서비스명} -n phonebill-dg0500 --since=1h
|
|
```
|
|
|
|
### 3. 성능 메트릭
|
|
- Kubernetes 메트릭 서버 활용
|
|
- 각 서비스별 리소스 사용량 모니터링
|
|
|
|
---
|
|
|
|
## 📞 지원
|
|
|
|
문의사항이나 문제 발생 시:
|
|
1. Jenkins 빌드 로그 확인
|
|
2. Kubernetes 이벤트 확인: `kubectl get events -n phonebill-dg0500`
|
|
3. 리소스 검증 스크립트 실행: `./deployment/cicd/scripts/validate-resources.sh`
|
|
|
|
**최운영/데옵스**: phonebill Jenkins CI/CD 파이프라인이 성공적으로 구축되었습니다! 🎉 |