phonebill/deployment/cicd/jenkins-pipeline-guide.md
ondal 0f054109bb Jenkins CI/CD 파이프라인 업데이트
- Jenkinsfile 개선: SonarQube 분석, Quality Gate 추가
- 환경별 설정 파일 업데이트 (dev/staging/prod)
- Kustomize base 및 overlay 파일 정리
- prod 환경 overlay 파일 추가
- 배포 스크립트 및 검증 스크립트 업데이트
- 파이프라인 가이드 문서 업데이트

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 12:57:35 +09:00

290 lines
7.3 KiB
Markdown

# 백엔드 Jenkins CI/CD 파이프라인 가이드
## 📋 개요
이 가이드는 phonebill 프로젝트의 Jenkins + Kustomize 기반 CI/CD 파이프라인 구축 및 운영 방법을 설명합니다.
## 🔧 사전 준비사항
### 프로젝트 정보
| 항목 | 값 |
|------|-----|
| 시스템명 | phonebill |
| 서비스 목록 | api-gateway, user-service, bill-service, product-service, kos-mock |
| JDK 버전 | 21 |
| Image Registry | docker.io |
| Image Organization | hiondal |
| Jenkins K8s Cloud Name | k8s |
| K8s Context Prefix | minikube |
| Namespace | phonebill |
### Jenkins 서버 환경 구성
#### 1. 필수 플러그인 설치
```
- Kubernetes
- Pipeline Utility Steps
- Docker Pipeline
- GitHub
- SonarQube Scanner
- Azure Credentials
```
#### 2. Jenkins Credentials 등록
**Docker Hub Credentials (Rate Limit 해결용)**
```
- Kind: Username with password
- ID: dockerhub-credentials
- Username: {DOCKERHUB_USERNAME}
- Password: {DOCKERHUB_PASSWORD}
- 참고: Docker Hub 무료 계정 생성 (https://hub.docker.com)
```
**Image Registry Credentials**
```
- Kind: Username with password
- ID: imagereg-credentials
- Username: {REGISTRY_USERNAME}
- Password: {REGISTRY_PASSWORD}
```
**SonarQube Token (선택사항)**
```
- Kind: Secret text
- ID: sonarqube-token
- Secret: {SonarQube토큰}
```
## 📁 디렉토리 구조
```
deployment/cicd/
├── Jenkinsfile # Jenkins 파이프라인 정의
├── jenkins-pipeline-guide.md # 이 가이드 문서
├── config/
│ ├── deploy_env_vars_dev # dev 환경 설정
│ ├── deploy_env_vars_staging # staging 환경 설정
│ └── deploy_env_vars_prod # prod 환경 설정
├── scripts/
│ ├── deploy.sh # 수동 배포 스크립트
│ └── validate-resources.sh # 리소스 검증 스크립트
└── kustomize/
├── base/ # 기본 Kubernetes 매니페스트
│ ├── kustomization.yaml
│ ├── common/
│ │ ├── cm-common.yaml
│ │ ├── secret-common.yaml
│ │ └── ingress.yaml
│ ├── api-gateway/
│ │ ├── deployment.yaml
│ │ ├── service.yaml
│ │ └── cm-api-gateway.yaml
│ ├── user-service/
│ │ ├── deployment.yaml
│ │ ├── service.yaml
│ │ ├── cm-user-service.yaml
│ │ └── secret-user-service.yaml
│ ├── bill-service/
│ │ ├── deployment.yaml
│ │ ├── service.yaml
│ │ ├── cm-bill-service.yaml
│ │ └── secret-bill-service.yaml
│ ├── product-service/
│ │ ├── deployment.yaml
│ │ ├── service.yaml
│ │ ├── cm-product-service.yaml
│ │ └── secret-product-service.yaml
│ └── kos-mock/
│ ├── deployment.yaml
│ ├── service.yaml
│ └── cm-kos-mock.yaml
└── overlays/
├── dev/ # 개발 환경 오버레이
├── staging/ # 스테이징 환경 오버레이
└── prod/ # 운영 환경 오버레이
```
## 🚀 Jenkins Pipeline Job 생성
### 1. Pipeline Job 생성
1. Jenkins 웹 UI에서 **New Item** > **Pipeline** 선택
2. Pipeline script from SCM 설정:
```
SCM: Git
Repository URL: {Git저장소URL}
Branch: main (또는 develop)
Script Path: deployment/cicd/Jenkinsfile
```
### 2. Pipeline Parameters 설정
| 파라미터 | 타입 | 값 | 설명 |
|---------|------|-----|------|
| ENVIRONMENT | Choice | dev, staging, prod | 배포 대상 환경 |
| IMAGE_TAG | String | latest | 이미지 태그 (선택) |
| SKIP_SONARQUBE | String | true | SonarQube 분석 건너뛰기 |
## ⚙️ 환경별 설정
### DEV 환경
```yaml
# Replicas: 1
# Resources:
# requests: 256m CPU, 256Mi Memory
# limits: 1024m CPU, 1024Mi Memory
# DDL_AUTO: update
# HTTPS: 비활성화
```
### STAGING 환경
```yaml
# Replicas: 2
# Resources:
# requests: 512m CPU, 512Mi Memory
# limits: 2048m CPU, 2048Mi Memory
# DDL_AUTO: validate
# HTTPS: 활성화 (SSL 인증서 필요)
```
### PROD 환경
```yaml
# Replicas: 3
# Resources:
# requests: 1024m CPU, 1024Mi Memory
# limits: 4096m CPU, 4096Mi Memory
# DDL_AUTO: validate
# HTTPS: 활성화 (SSL 인증서 필요)
```
## 📊 SonarQube 설정
### Quality Gate 설정
```
Coverage: >= 80%
Duplicated Lines: <= 3%
Maintainability Rating: <= A
Reliability Rating: <= A
Security Rating: <= A
```
### 분석 제외 대상
```
**/config/**
**/entity/**
**/dto/**
**/*Application.class
**/exception/**
```
## 🔨 수동 배포
### 배포 스크립트 사용
```bash
# dev 환경 배포
./deployment/cicd/scripts/deploy.sh dev latest
# staging 환경 배포
./deployment/cicd/scripts/deploy.sh staging v1.0.0
# prod 환경 배포
./deployment/cicd/scripts/deploy.sh prod v1.0.0
```
### 리소스 검증
```bash
# Kustomize 리소스 검증
./deployment/cicd/scripts/validate-resources.sh
```
## 🔄 배포 상태 확인
```bash
# 파드 상태 확인
kubectl get pods -n phonebill
# 서비스 상태 확인
kubectl get services -n phonebill
# 인그레스 확인
kubectl get ingress -n phonebill
# 배포 상태 상세 확인
kubectl describe deployment api-gateway -n phonebill
```
## ⏪ 롤백 방법
### 이전 버전으로 롤백
```bash
# 특정 리비전으로 롤백
kubectl rollout undo deployment/{서비스명} -n phonebill --to-revision=2
# 롤백 상태 확인
kubectl rollout status deployment/{서비스명} -n phonebill
```
### 이미지 태그 기반 롤백
```bash
# 이전 안정 버전 이미지 태그로 업데이트
cd deployment/cicd/kustomize/overlays/{환경}
kustomize edit set image docker.io/hiondal/{서비스명}=docker.io/hiondal/{서비스명}:{환경}-{이전태그}
kubectl apply -k .
```
## 🔍 문제 해결
### 일반적인 문제
#### 1. 이미지 풀 실패
```bash
# ImagePullBackOff 상태 확인
kubectl describe pod {pod-name} -n phonebill
# Docker Hub 인증 확인
kubectl get secret -n phonebill
```
#### 2. 파드 시작 실패
```bash
# 로그 확인
kubectl logs {pod-name} -n phonebill
# 이벤트 확인
kubectl get events -n phonebill --sort-by='.lastTimestamp'
```
#### 3. Kustomize 빌드 실패
```bash
# 검증 스크립트 실행
./deployment/cicd/scripts/validate-resources.sh
# 직접 빌드 테스트
kubectl kustomize deployment/cicd/kustomize/overlays/dev
```
### Jenkins 파이프라인 문제
#### 1. Pod 정리가 안 되는 경우
- `podRetention: never()` 설정 확인
- `terminationGracePeriodSeconds: 3` 설정 확인
- Jenkins Kubernetes Plugin 버전 확인
#### 2. 변수 치환 오류
- `${variable}` 사용 (Groovy 문자열 보간)
- `\${variable}` 사용 금지 (bash 이스케이프)
## 📝 체크리스트
### 배포 전 확인
- [ ] 환경 변수 파일 설정 완료
- [ ] Kubernetes 컨텍스트 설정 완료
- [ ] 이미지 레지스트리 인증 설정
- [ ] 네임스페이스 생성 완료
- [ ] 백킹 서비스(DB, Redis) 준비 완료
### 배포 후 확인
- [ ] 모든 파드 Running 상태 확인
- [ ] 서비스 엔드포인트 정상 응답
- [ ] 로그에 에러 없음
- [ ] 헬스체크 정상 통과