phonebill/deployment/cicd/jenkins-pipeline-guide.md
ondal f12fed5de9 Jenkins 기반 CI/CD 파이프라인 구성
- Kustomize 기반 환경별(dev/staging/prod) 매니페스트 관리
- Jenkins 파이프라인 스크립트 작성 (Podman, Gradle, kubectl 컨테이너)
- SonarQube 코드 품질 분석 및 Quality Gate 연동
- 수동 배포 및 리소스 검증 스크립트 추가
- k8s 매니페스트 구조 재정리 (configmaps, secrets, deployments, services 분리)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 10:23:32 +09:00

312 lines
7.1 KiB
Markdown

# Jenkins CI/CD 파이프라인 가이드
## 개요
이 문서는 Phonebill 프로젝트의 Jenkins 기반 CI/CD 파이프라인 구축 및 운영 가이드입니다.
## 프로젝트 정보
| 항목 | 값 |
|------|-----|
| 시스템명 | phonebill |
| JDK 버전 | 21 |
| Image Registry | docker.io |
| Image Organization | hiondal |
| K8s Context | minikube-remote |
| Namespace | phonebill |
### 서비스 목록
- api-gateway (포트: 8080)
- user-service (포트: 8081)
- bill-service (포트: 8082)
- product-service (포트: 8083)
- kos-mock (포트: 8084)
---
## 1. 사전 준비사항
### 1.1 Jenkins 필수 플러그인
```
- Kubernetes
- Pipeline Utility Steps
- Docker Pipeline
- GitHub
- SonarQube Scanner
```
### 1.2 Jenkins Credentials 등록
Jenkins 관리 > Credentials > Add Credentials에서 등록:
#### Docker Hub Credentials
```
- Kind: Username with password
- ID: dockerhub-credentials
- Username: {DOCKERHUB_USERNAME}
- Password: {DOCKERHUB_PASSWORD}
```
#### SonarQube Token (선택사항)
```
- Kind: Secret text
- ID: sonarqube-token
- Secret: {SonarQube 토큰}
```
### 1.3 SonarQube 설정 (선택사항)
Jenkins 관리 > Configure System > SonarQube servers:
```
- Name: SonarQube
- Server URL: http://{SONARQUBE_URL}
- Server authentication token: sonarqube-token (위에서 등록한 credential)
```
---
## 2. Kustomize 구조
### 2.1 디렉토리 구조
```
deployment/cicd/
├── Jenkinsfile
├── config/
│ ├── deploy_env_vars_dev
│ ├── deploy_env_vars_staging
│ └── deploy_env_vars_prod
├── scripts/
│ ├── deploy.sh
│ └── validate-resources.sh
└── kustomize/
├── base/
│ ├── kustomization.yaml
│ ├── common/
│ │ ├── cm-common.yaml
│ │ ├── secret-common.yaml
│ │ └── ingress.yaml
│ ├── api-gateway/
│ ├── user-service/
│ ├── bill-service/
│ ├── product-service/
│ └── kos-mock/
└── overlays/
├── dev/
├── staging/
└── prod/
```
### 2.2 환경별 설정 차이
| 항목 | dev | staging | prod |
|------|-----|---------|------|
| Namespace | phonebill | phonebill-staging | phonebill-prod |
| Replicas | 1 | 2 | 3 |
| CPU Requests | 256m | 512m | 1024m |
| Memory Requests | 256Mi | 512Mi | 1024Mi |
| CPU Limits | 1024m | 2048m | 4096m |
| Memory Limits | 1024Mi | 2048Mi | 4096Mi |
| DDL_AUTO | update | validate | validate |
| SHOW_SQL | true | false | false |
| SSL Redirect | false | true | true |
---
## 3. Jenkins Pipeline Job 생성
### 3.1 New Item > Pipeline 선택
### 3.2 Pipeline 설정
```
SCM: Git
Repository URL: {Git 저장소 URL}
Branch: main (또는 develop)
Script Path: deployment/cicd/Jenkinsfile
```
### 3.3 Pipeline Parameters 설정
| 파라미터 | 타입 | 기본값 | 설명 |
|----------|------|--------|------|
| ENVIRONMENT | Choice | dev | 배포 환경 (dev/staging/prod) |
| SKIP_SONARQUBE | String | true | SonarQube 분석 건너뛰기 (true/false) |
---
## 4. 파이프라인 스테이지
### 4.1 Get Source
- Git 저장소에서 소스 코드 체크아웃
- 환경별 설정 파일 로드
### 4.2 Setup Kubernetes
- Kubernetes 컨텍스트 설정
- 네임스페이스 생성
### 4.3 Build
- Gradle을 사용한 빌드 (테스트 제외)
- `./gradlew build -x test`
### 4.4 SonarQube Analysis & Quality Gate (선택사항)
- SKIP_SONARQUBE=false일 때만 실행
- 각 서비스별 테스트 및 코드 품질 분석
- Quality Gate 통과 확인
### 4.5 Build & Push Images
- Podman을 사용한 컨테이너 이미지 빌드
- Docker Hub로 이미지 푸시
- 이미지 태그: `{환경}-{타임스탬프}`
### 4.6 Update Kustomize & Deploy
- Kustomize를 사용한 이미지 태그 업데이트
- Kubernetes 매니페스트 적용
- 배포 상태 확인
---
## 5. 배포 실행
### 5.1 Jenkins 파이프라인 실행
1. Jenkins > phonebill > Build with Parameters
2. ENVIRONMENT 선택 (dev/staging/prod)
3. SKIP_SONARQUBE 입력 (true 또는 false)
4. Build 클릭
### 5.2 수동 배포 (스크립트 사용)
```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
```
### 5.3 배포 상태 확인
```bash
# Pod 상태 확인
kubectl get pods -n phonebill
# 서비스 상태 확인
kubectl get services -n phonebill
# Ingress 상태 확인
kubectl get ingress -n phonebill
# 특정 Pod 로그 확인
kubectl logs -f deployment/api-gateway -n phonebill
```
---
## 6. 롤백
### 6.1 이전 버전으로 롤백
```bash
# 특정 리비전으로 롤백
kubectl rollout undo deployment/{서비스명} -n phonebill --to-revision=2
# 롤백 상태 확인
kubectl rollout status deployment/{서비스명} -n phonebill
# 롤백 히스토리 확인
kubectl rollout history deployment/{서비스명} -n phonebill
```
### 6.2 이미지 태그 기반 롤백
```bash
cd deployment/cicd/kustomize/overlays/{환경}
# 이전 안정 버전 이미지 태그로 업데이트
kustomize edit set image docker.io/hiondal/{서비스명}:{환경}-{이전태그}
# 배포
kubectl apply -k .
```
---
## 7. 리소스 검증
### 7.1 검증 스크립트 실행
```bash
./deployment/cicd/scripts/validate-resources.sh
```
### 7.2 Kustomize 빌드 테스트
```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/
```
---
## 8. SonarQube 설정 (선택사항)
### 8.1 Quality Gate 권장 설정
```
Coverage: >= 80%
Duplicated Lines: <= 3%
Maintainability Rating: <= A
Reliability Rating: <= A
Security Rating: <= A
```
### 8.2 SonarQube 프로젝트 생성
각 서비스별로 다음 형식의 프로젝트 키로 생성:
- `phonebill-user-service-dev`
- `phonebill-user-service-staging`
- `phonebill-user-service-prod`
---
## 9. 트러블슈팅
### 9.1 이미지 푸시 실패
- Docker Hub 인증 정보 확인
- Rate Limit 확인 (무료 계정 제한)
### 9.2 배포 실패
```bash
# Pod 이벤트 확인
kubectl describe pod {POD_NAME} -n phonebill
# Pod 로그 확인
kubectl logs {POD_NAME} -n phonebill
```
### 9.3 Kustomize 빌드 실패
- 리소스 파일 존재 여부 확인
- YAML 문법 검증
- `kubectl kustomize` 명령으로 디버깅
### 9.4 SonarQube 연결 실패
- SonarQube 서버 URL 확인
- 인증 토큰 유효성 확인
- 네트워크 연결 확인
---
## 10. 체크리스트
### 사전 준비
- [ ] Jenkins 필수 플러그인 설치 완료
- [ ] Docker Hub Credentials 등록 완료
- [ ] SonarQube Token 등록 완료 (선택)
- [ ] Kubernetes 컨텍스트 설정 완료
### 배포 전
- [ ] 리소스 검증 스크립트 실행 완료
- [ ] 환경별 설정 파일 확인 완료
- [ ] Kustomize 빌드 테스트 완료
### 배포 후
- [ ] Pod 상태 확인 (Running)
- [ ] 서비스 엔드포인트 확인
- [ ] Ingress 접근 테스트
- [ ] 로그 이상 여부 확인