mirror of
https://github.com/cna-bootcamp/phonebill.git
synced 2025-12-06 08:06:24 +00:00
- 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>
290 lines
7.3 KiB
Markdown
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 상태 확인
|
|
- [ ] 서비스 엔드포인트 정상 응답
|
|
- [ ] 로그에 에러 없음
|
|
- [ ] 헬스체크 정상 통과
|