mirror of
https://github.com/cna-bootcamp/phonebill.git
synced 2025-12-06 16:16:23 +00:00
- 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>
312 lines
7.1 KiB
Markdown
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 접근 테스트
|
|
- [ ] 로그 이상 여부 확인
|