mirror of
https://github.com/cna-bootcamp/phonebill.git
synced 2025-12-07 00:26:23 +00:00
- Kustomize 기반 환경별 매니페스트 구조 생성 - Base: 공통 리소스 및 네임스페이스 설정 - Overlays: dev/staging/prod 환경별 설정 - Patch: 환경별 replicas, resources, 도메인 설정 - Jenkins 파이프라인 구축 - 완전한 Jenkinsfile 작성 (빌드, 테스트, 배포) - SonarQube 품질 분석 및 Quality Gate 적용 - ACR 이미지 빌드 및 푸시 자동화 - AKS 배포 자동화 - 환경별 설정 관리 - dev: 1 replica, 기본 리소스, HTTP - staging: 2 replicas, 중간 리소스, HTTPS - prod: 3 replicas, 고사양 리소스, HTTPS, 보안 강화 - 배포 자동화 도구 - 수동 배포 스크립트 작성 및 실행 권한 설정 - 롤백 방법 및 트러블슈팅 가이드 포함 - 완전한 구축 가이드 문서 작성 - Jenkins 환경 설정 방법 - Credentials 등록 방법 - Pipeline Job 생성 방법 - 배포 실행 및 모니터링 방법 - 체크리스트 및 트러블슈팅 가이드 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
344 lines
9.0 KiB
Markdown
344 lines
9.0 KiB
Markdown
# Jenkins CI/CD 파이프라인 구축 가이드
|
|
|
|
## 📋 개요
|
|
|
|
이 가이드는 통신요금 관리 서비스(phonebill)를 위한 Jenkins 기반 CI/CD 파이프라인 구축 방법을 안내합니다.
|
|
|
|
**주요 특징:**
|
|
- Jenkins + Kustomize 기반 CI/CD 파이프라인
|
|
- 환경별(dev/staging/prod) 매니페스트 관리
|
|
- SonarQube 코드 품질 분석과 Quality Gate
|
|
- Azure Container Registry(ACR) 연동
|
|
- AKS(Azure Kubernetes Service) 자동 배포
|
|
|
|
## 🏗 아키텍처 구성
|
|
|
|
```
|
|
Jenkins Pipeline
|
|
↓
|
|
┌─── Build & Test (Gradle) ─────┐
|
|
│ - 소스코드 빌드 │
|
|
│ - 단위 테스트 실행 │
|
|
│ - SonarQube 품질 분석 │
|
|
│ - Quality Gate 검증 │
|
|
└─────────────────────────────┘
|
|
↓
|
|
┌─── Container Build ───────────┐
|
|
│ - 서비스별 이미지 빌드 │
|
|
│ - ACR에 이미지 푸시 │
|
|
│ - 환경별 태그 관리 │
|
|
└─────────────────────────────┘
|
|
↓
|
|
┌─── Deploy to AKS ─────────────┐
|
|
│ - Kustomize 매니페스트 적용 │
|
|
│ - 환경별 설정 적용 │
|
|
│ - 배포 상태 확인 │
|
|
└─────────────────────────────┘
|
|
```
|
|
|
|
## 🛠 사전 준비사항
|
|
|
|
### 실행 환경 정보
|
|
- **ACR명**: acrdigitalgarage01
|
|
- **리소스 그룹**: rg-digitalgarage-01
|
|
- **AKS 클러스터**: aks-digitalgarage-01
|
|
|
|
### 서비스 구성
|
|
- **시스템명**: phonebill
|
|
- **서비스목록**:
|
|
- api-gateway
|
|
- user-service
|
|
- bill-service
|
|
- product-service
|
|
- kos-mock
|
|
|
|
## 🔧 Jenkins 환경 구성
|
|
|
|
### 1. Jenkins 필수 플러그인 설치
|
|
|
|
```bash
|
|
# Jenkins 관리 > 플러그인 관리에서 다음 플러그인 설치
|
|
- Kubernetes
|
|
- Pipeline Utility Steps
|
|
- Docker Pipeline
|
|
- GitHub
|
|
- SonarQube Scanner
|
|
- Azure Credentials
|
|
```
|
|
|
|
### 2. Jenkins Credentials 등록
|
|
|
|
**Azure Service Principal 등록:**
|
|
```
|
|
Manage Jenkins > Credentials > Add Credentials
|
|
- Kind: Microsoft Azure Service Principal
|
|
- ID: azure-credentials
|
|
- Subscription ID: {구독ID}
|
|
- Client ID: {클라이언트ID}
|
|
- Client Secret: {클라이언트시크릿}
|
|
- Tenant ID: {테넌트ID}
|
|
- Azure Environment: Azure
|
|
```
|
|
|
|
**ACR Credentials 등록:**
|
|
```
|
|
- Kind: Username with password
|
|
- ID: acr-credentials
|
|
- Username: acrdigitalgarage01
|
|
- Password: {ACR패스워드}
|
|
```
|
|
|
|
**SonarQube Token 등록:**
|
|
```
|
|
- Kind: Secret text
|
|
- ID: sonarqube-token
|
|
- Secret: {SonarQube토큰}
|
|
```
|
|
|
|
## 📂 Kustomize 구조
|
|
|
|
프로젝트에 다음과 같은 Kustomize 구조가 생성되었습니다:
|
|
|
|
```
|
|
deployment/cicd/
|
|
├── kustomize/
|
|
│ ├── base/
|
|
│ │ ├── kustomization.yaml
|
|
│ │ ├── namespace.yaml
|
|
│ │ ├── common/
|
|
│ │ │ ├── cm-common.yaml
|
|
│ │ │ ├── secret-common.yaml
|
|
│ │ │ ├── secret-imagepull.yaml
|
|
│ │ │ └── ingress.yaml
|
|
│ │ └── [각 서비스별 매니페스트]
|
|
│ └── overlays/
|
|
│ ├── dev/
|
|
│ ├── staging/
|
|
│ └── prod/
|
|
├── config/
|
|
│ ├── deploy_env_vars_dev
|
|
│ ├── deploy_env_vars_staging
|
|
│ └── deploy_env_vars_prod
|
|
├── scripts/
|
|
│ └── deploy.sh
|
|
└── Jenkinsfile
|
|
```
|
|
|
|
## 🚀 Jenkins Pipeline 설정
|
|
|
|
### 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
|
|
```
|
|
|
|
3. **Pipeline Parameters** 설정:
|
|
```
|
|
ENVIRONMENT: Choice Parameter (dev, staging, prod)
|
|
IMAGE_TAG: String Parameter (default: latest)
|
|
```
|
|
|
|
### 2. Pipeline 단계별 설명
|
|
|
|
**Stage 1: Get Source**
|
|
- Git 저장소에서 소스코드 체크아웃
|
|
- 환경별 설정 파일 로드
|
|
|
|
**Stage 2: Setup AKS**
|
|
- Azure 서비스 프린시팔로 로그인
|
|
- AKS 클러스터 연결 설정
|
|
- 네임스페이스 생성
|
|
|
|
**Stage 3: Build & SonarQube Analysis**
|
|
- Gradle 빌드 및 테스트 실행
|
|
- 각 서비스별 SonarQube 분석
|
|
- 코드 커버리지 리포트 생성
|
|
|
|
**Stage 4: Quality Gate**
|
|
- SonarQube Quality Gate 결과 대기
|
|
- 품질 기준 미달 시 파이프라인 중단
|
|
|
|
**Stage 5: Build & Push Images**
|
|
- 서비스별 컨테이너 이미지 빌드
|
|
- ACR에 이미지 푸시
|
|
- 환경별 태그 적용
|
|
|
|
**Stage 6: Update Kustomize & Deploy**
|
|
- 이미지 태그 업데이트
|
|
- Kustomize를 통한 매니페스트 적용
|
|
- 배포 완료 대기
|
|
|
|
## ⚙ SonarQube 설정
|
|
|
|
### Quality Gate 규칙
|
|
```yaml
|
|
Coverage: >= 80%
|
|
Duplicated Lines: <= 3%
|
|
Maintainability Rating: <= A
|
|
Reliability Rating: <= A
|
|
Security Rating: <= A
|
|
```
|
|
|
|
### 프로젝트별 분석 제외 항목
|
|
```
|
|
**/config/**
|
|
**/entity/**
|
|
**/dto/**
|
|
**/*Application.class
|
|
**/exception/**
|
|
```
|
|
|
|
## 🎯 배포 실행 방법
|
|
|
|
### 1. Jenkins 파이프라인 실행
|
|
|
|
1. Jenkins > {프로젝트명} > **Build with Parameters**
|
|
2. **ENVIRONMENT** 선택 (dev/staging/prod)
|
|
3. **IMAGE_TAG** 입력 (선택사항)
|
|
4. **Build** 클릭
|
|
|
|
### 2. 수동 배포 스크립트 실행
|
|
|
|
```bash
|
|
# 개발 환경 배포
|
|
./deployment/cicd/scripts/deploy.sh dev latest
|
|
|
|
# 스테이징 환경 배포
|
|
./deployment/cicd/scripts/deploy.sh staging v1.2.0
|
|
|
|
# 운영 환경 배포
|
|
./deployment/cicd/scripts/deploy.sh prod v1.2.0
|
|
```
|
|
|
|
### 3. 배포 상태 확인
|
|
|
|
```bash
|
|
# Pod 상태 확인
|
|
kubectl get pods -n phonebill-{환경}
|
|
|
|
# 서비스 상태 확인
|
|
kubectl get services -n phonebill-{환경}
|
|
|
|
# Ingress 상태 확인
|
|
kubectl get ingress -n phonebill-{환경}
|
|
```
|
|
|
|
## 🔄 롤백 방법
|
|
|
|
### 1. Kubernetes 롤백
|
|
|
|
```bash
|
|
# 특정 버전으로 롤백
|
|
kubectl rollout undo deployment/{환경}-{서비스명} -n phonebill-{환경} --to-revision=2
|
|
|
|
# 롤백 상태 확인
|
|
kubectl rollout status deployment/{환경}-{서비스명} -n phonebill-{환경}
|
|
```
|
|
|
|
### 2. 이미지 태그 기반 롤백
|
|
|
|
```bash
|
|
# 이전 안정 버전 이미지 태그로 업데이트
|
|
cd deployment/cicd/kustomize/overlays/{환경}
|
|
kustomize edit set image acrdigitalgarage01.azurecr.io/phonebill/{서비스명}:{환경}-{이전태그}
|
|
kubectl apply -k .
|
|
```
|
|
|
|
## 🏷 환경별 설정 차이점
|
|
|
|
### DEV 환경
|
|
- **Replicas**: 1개
|
|
- **Resources**: requests(256m/256Mi), limits(1024m/1024Mi)
|
|
- **Domain**: phonebill-api.20.214.196.128.nip.io
|
|
- **SSL**: 비활성화
|
|
- **DDL**: update
|
|
|
|
### STAGING 환경
|
|
- **Replicas**: 2개
|
|
- **Resources**: requests(512m/512Mi), limits(2048m/2048Mi)
|
|
- **Domain**: phonebill-staging.example.com
|
|
- **SSL**: 활성화 (Let's Encrypt)
|
|
- **DDL**: validate
|
|
|
|
### PROD 환경
|
|
- **Replicas**: 3개
|
|
- **Resources**: requests(1024m/1024Mi), limits(4096m/4096Mi)
|
|
- **Domain**: phonebill-prod.example.com
|
|
- **SSL**: 활성화 (Let's Encrypt)
|
|
- **DDL**: validate
|
|
- **JWT**: 보안 강화 (짧은 유효시간)
|
|
|
|
## 📋 체크리스트
|
|
|
|
### 사전 준비
|
|
- [ ] settings.gradle에서 시스템명과 서비스명 확인
|
|
- [ ] Azure 환경 정보 확인 (ACR, 리소스 그룹, AKS 클러스터)
|
|
- [ ] Jenkins 플러그인 설치 완료
|
|
- [ ] Jenkins Credentials 등록 완료
|
|
|
|
### Kustomize 구성
|
|
- [ ] Base 매니페스트 복사 및 설정 완료
|
|
- [ ] 환경별 Overlay 구성 완료
|
|
- [ ] Patch 파일 작성 완료 (replicas, resources 포함)
|
|
- [ ] 환경별 설정 파일 생성 완료
|
|
|
|
### Jenkins Pipeline
|
|
- [ ] Jenkinsfile 작성 완료
|
|
- [ ] Pipeline Job 생성 및 설정 완료
|
|
- [ ] SonarQube 연동 설정 완료
|
|
- [ ] 배포 스크립트 생성 및 권한 설정 완료
|
|
|
|
### 배포 테스트
|
|
- [ ] DEV 환경 배포 테스트 완료
|
|
- [ ] STAGING 환경 배포 테스트 완료
|
|
- [ ] PROD 환경 배포 테스트 완료
|
|
- [ ] 롤백 테스트 완료
|
|
|
|
## 🚨 트러블슈팅
|
|
|
|
### 일반적인 문제들
|
|
|
|
**1. Quality Gate 실패**
|
|
```bash
|
|
# 해결방법: SonarQube 분석 결과 확인 및 코드 개선
|
|
./gradlew sonar
|
|
```
|
|
|
|
**2. 이미지 빌드 실패**
|
|
```bash
|
|
# 해결방법: Dockerfile 및 빌드 컨텍스트 확인
|
|
podman build --no-cache -f deployment/container/Dockerfile-backend .
|
|
```
|
|
|
|
**3. 배포 타임아웃**
|
|
```bash
|
|
# 해결방법: 리소스 사용량 및 노드 상태 확인
|
|
kubectl describe pods -n phonebill-{환경}
|
|
kubectl top nodes
|
|
```
|
|
|
|
**4. 네임스페이스 관련 오류**
|
|
```bash
|
|
# 해결방법: 네임스페이스 수동 생성
|
|
kubectl create namespace phonebill-{환경}
|
|
```
|
|
|
|
## 📞 지원 및 문의
|
|
|
|
Jenkins CI/CD 파이프라인 운영 중 문제가 발생하면 다음을 확인해 주세요:
|
|
|
|
1. Jenkins 빌드 로그 확인
|
|
2. SonarQube Quality Gate 결과 확인
|
|
3. Kubernetes 클러스터 상태 확인
|
|
4. Azure Container Registry 연결 상태 확인
|
|
|
|
---
|
|
|
|
**데옵스**: Jenkins CI/CD 파이프라인이 성공적으로 구축되었습니다! 🎉
|
|
|
|
이제 각 환경별로 자동화된 빌드, 테스트, 배포가 가능합니다. SonarQube를 통한 코드 품질 관리와 Kustomize를 통한 환경별 설정 관리로 안정적인 DevOps 환경을 구축했습니다. |