mirror of
https://github.com/cna-bootcamp/phonebill.git
synced 2025-12-05 23:56: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>
7.1 KiB
7.1 KiB
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 파이프라인 실행
- Jenkins > phonebill > Build with Parameters
- ENVIRONMENT 선택 (dev/staging/prod)
- SKIP_SONARQUBE 입력 (true 또는 false)
- Build 클릭
5.2 수동 배포 (스크립트 사용)
# 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 배포 상태 확인
# 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 이전 버전으로 롤백
# 특정 리비전으로 롤백
kubectl rollout undo deployment/{서비스명} -n phonebill --to-revision=2
# 롤백 상태 확인
kubectl rollout status deployment/{서비스명} -n phonebill
# 롤백 히스토리 확인
kubectl rollout history deployment/{서비스명} -n phonebill
6.2 이미지 태그 기반 롤백
cd deployment/cicd/kustomize/overlays/{환경}
# 이전 안정 버전 이미지 태그로 업데이트
kustomize edit set image docker.io/hiondal/{서비스명}:{환경}-{이전태그}
# 배포
kubectl apply -k .
7. 리소스 검증
7.1 검증 스크립트 실행
./deployment/cicd/scripts/validate-resources.sh
7.2 Kustomize 빌드 테스트
# 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-devphonebill-user-service-stagingphonebill-user-service-prod
9. 트러블슈팅
9.1 이미지 푸시 실패
- Docker Hub 인증 정보 확인
- Rate Limit 확인 (무료 계정 제한)
9.2 배포 실패
# 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 접근 테스트
- 로그 이상 여부 확인