mirror of
https://github.com/cna-bootcamp/phonebill.git
synced 2025-12-06 08:06:24 +00:00
- Kustomize 기반 환경별 배포 구성 (dev/staging/prod) - Jenkins 파이프라인 with SonarQube 품질 게이트 - 파드 자동 정리 및 보안 강화 설정 - 환경별 차등 리소스 할당 및 도메인 설정 - 수동 배포 및 검증 스크립트 제공 - 5개 마이크로서비스 병렬 빌드/배포 지원 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
9.5 KiB
9.5 KiB
phonebill Jenkins CI/CD 파이프라인 구축 가이드
📋 개요
이개발/백엔더: phonebill 프로젝트의 Jenkins 기반 CI/CD 파이프라인 구축이 완료되었습니다.
프로젝트 정보
- 시스템명: phonebill
- 서비스: api-gateway, user-service, bill-service, product-service, kos-mock
- JDK 버전: 21
- 환경: dev, staging, prod
- 컨테이너 레지스트리: acrdigitalgarage01.azurecr.io
- Kubernetes 클러스터: aks-digitalgarage-01 (rg-digitalgarage-01)
🏗️ 구축된 CI/CD 아키텍처
파이프라인 구성
- 소스 체크아웃 → Git 소스 코드 가져오기
- AKS 설정 → Azure 인증 및 Kubernetes 클러스터 연결
- 빌드 & SonarQube 분석 → Gradle 빌드, 테스트, 코드 품질 분석
- Quality Gate → SonarQube 품질 게이트 검증
- 컨테이너 빌드 & 푸시 → Docker 이미지 빌드 및 ACR 푸시
- Kustomize 배포 → 환경별 Kubernetes 매니페스트 적용
Kustomize 구조
deployment/cicd/kustomize/
├── base/ # 기본 매니페스트
│ ├── kustomization.yaml # Base 리소스 정의
│ ├── namespace.yaml # Namespace 정의
│ ├── common/ # 공통 리소스
│ │ ├── cm-common.yaml
│ │ ├── secret-common.yaml
│ │ ├── secret-imagepull.yaml
│ │ └── ingress.yaml
│ └── [서비스별 디렉토리]/ # 각 서비스 매니페스트
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── cm-{서비스명}.yaml # ConfigMap (있는 경우)
│ └── secret-{서비스명}.yaml # Secret (있는 경우)
└── overlays/ # 환경별 오버레이
├── dev/ # 개발 환경
├── staging/ # 스테이징 환경
└── prod/ # 운영 환경
⚙️ 구성 요소
1. Jenkins 파이프라인 (Jenkinsfile)
- Pod Template: Gradle, Podman, Azure-CLI 컨테이너 사용
- 자동 정리: podRetention: never(), 파드 자동 정리 구성
- 병렬 처리: 각 서비스별 SonarQube 분석 병렬 실행
- 타임아웃: 빌드&푸시 30분, Quality Gate 10분 제한
2. 환경별 Configuration
DEV 환경
- 네임스페이스: phonebill-dev
- 레플리카: 1개
- 리소스: requests(256m CPU, 256Mi Memory), limits(1024m CPU, 1024Mi Memory)
- 프로파일: dev, DDL_AUTO: update
- 도메인: phonebill-api.20.214.196.128.nip.io (HTTP)
STAGING 환경
- 네임스페이스: phonebill-staging
- 레플리카: 2개
- 리소스: requests(512m CPU, 512Mi Memory), limits(2048m CPU, 2048Mi Memory)
- 프로파일: staging, DDL_AUTO: validate
- 도메인: phonebill-staging.yourdomain.com (HTTPS)
PROD 환경
- 네임스페이스: phonebill-prod
- 레플리카: 3개
- 리소스: requests(1024m CPU, 1024Mi Memory), limits(4096m CPU, 4096Mi Memory)
- 프로파일: prod, DDL_AUTO: validate
- 도메인: phonebill.yourdomain.com (HTTPS)
- 보안: 짧은 JWT 토큰 유효시간
3. 스크립트
- deploy.sh: 수동 배포 스크립트
- validate-cicd-setup.sh: CI/CD 설정 검증 스크립트
📦 구축된 파일 목록
Kustomize 구성 파일
deployment/cicd/
├── kustomize/
│ ├── base/
│ │ ├── kustomization.yaml
│ │ ├── namespace.yaml
│ │ ├── common/ (4개 파일)
│ │ ├── api-gateway/ (3개 파일)
│ │ ├── user-service/ (4개 파일)
│ │ ├── bill-service/ (4개 파일)
│ │ ├── product-service/ (4개 파일)
│ │ └── kos-mock/ (3개 파일)
│ └── overlays/
│ ├── dev/ (12개 파일)
│ ├── staging/ (13개 파일)
│ └── prod/ (14개 파일)
├── config/
│ ├── deploy_env_vars_dev
│ ├── deploy_env_vars_staging
│ └── deploy_env_vars_prod
├── scripts/
│ ├── deploy.sh (실행 가능)
│ └── validate-cicd-setup.sh (실행 가능)
├── Jenkinsfile
└── jenkins-pipeline-guide.md
🚀 Jenkins 설정 방법
1. Jenkins 서버 환경 구성
필수 플러그인 설치
- Kubernetes
- Pipeline Utility Steps
- Docker Pipeline
- GitHub
- SonarQube Scanner
- Azure Credentials
Jenkins Credentials 등록
Manage Jenkins > Credentials > Add Credentials
-
Azure Service Principal
- Kind: Microsoft Azure Service Principal
- ID:
azure-credentials - Subscription ID, Client ID, Client Secret, Tenant ID 입력
- Azure Environment: Azure
-
ACR Credentials
- Kind: Username with password
- ID:
acr-credentials - Username:
acrdigitalgarage01 - Password: {ACR_PASSWORD}
-
Docker Hub Credentials (Rate Limit 해결용)
- Kind: Username with password
- ID:
dockerhub-credentials - Username: {DOCKERHUB_USERNAME}
- Password: {DOCKERHUB_PASSWORD}
-
SonarQube Token
- Kind: Secret text
- ID:
sonarqube-token - Secret: {SonarQube토큰}
2. Jenkins Pipeline Job 생성
-
New Item > Pipeline 선택
-
Pipeline script from SCM 설정:
- SCM: Git
- Repository URL: {Git저장소URL}
- Branch: main
- Script Path:
deployment/cicd/Jenkinsfile
-
Pipeline Parameters 설정:
- ENVIRONMENT: Choice Parameter (dev, staging, prod)
- IMAGE_TAG: String Parameter (default: latest)
📊 SonarQube 설정
각 서비스별 프로젝트 생성
- 프로젝트 키:
phonebill-{서비스명}-{환경} - Quality Gate 설정:
- Coverage: ≥ 80%
- Duplicated Lines: ≤ 3%
- Maintainability Rating: ≤ A
- Reliability Rating: ≤ A
- Security Rating: ≤ A
🔄 배포 실행 방법
1. Jenkins 파이프라인 실행
- Jenkins > phonebill 프로젝트 > Build with Parameters
- ENVIRONMENT 선택 (dev/staging/prod)
- IMAGE_TAG 입력 (선택사항)
- Build 클릭
2. 수동 배포 (선택사항)
# 개발 환경 배포
./deployment/cicd/scripts/deploy.sh dev 20240912101530
# 스테이징 환경 배포
./deployment/cicd/scripts/deploy.sh staging 20240912101530
# 운영 환경 배포
./deployment/cicd/scripts/deploy.sh prod 20240912101530
3. 배포 상태 확인
# Pod 상태 확인
kubectl get pods -n phonebill-{환경}
# 서비스 상태 확인
kubectl get services -n phonebill-{환경}
# Ingress 상태 확인
kubectl get ingress -n phonebill-{환경}
# 배포 이력 확인
kubectl rollout history deployment/{서비스명} -n phonebill-{환경}
🔍 설정 검증
CI/CD 설정 검증 실행
./deployment/cicd/scripts/validate-cicd-setup.sh
검증 항목:
- ✅ 서비스별 매니페스트 파일 존재 확인
- ✅ Base kustomization.yaml 유효성 검사
- ✅ 환경별 Overlay 빌드 테스트
- ✅ Jenkinsfile 구성 확인
- ✅ 환경별 설정 파일 검증
- ✅ 스크립트 실행 권한 확인
🔧 롤백 방법
1. kubectl을 이용한 롤백
# 이전 버전으로 롤백
kubectl rollout undo deployment/{서비스명} -n phonebill-{환경} --to-revision=2
# 롤백 상태 확인
kubectl rollout status deployment/{서비스명} -n phonebill-{환경}
2. 이미지 태그 기반 롤백
# 이전 안정 버전으로 수동 배포
cd deployment/cicd/kustomize/overlays/{환경}
kustomize edit set image acrdigitalgarage01.azurecr.io/phonebill/{서비스명}:{환경}-{이전태그}
kubectl apply -k .
🛡️ 보안 및 모니터링
파드 자동 정리
- podRetention: never(): 파이프라인 완료 시 파드 즉시 삭제
- terminationGracePeriodSeconds: 3: 3초 내 강제 종료
- idleMinutes: 1: 유휴 시간 1분 설정
리소스 제한
- Timeout 설정: Build&Push 30분, Quality Gate 10분
- 컨테이너 리소스: 환경별 차등 할당
- 네트워크 격리: 네임스페이스별 분리
✅ 구축 완료 체크리스트
📋 사전 준비
- settings.gradle에서 시스템명과 서비스명 확인
- 루트 build.gradle에서 JDK버전 확인 (21)
- 실행정보에서 ACR명, 리소스 그룹, AKS 클러스터명 확인
📂 Kustomize 구성
- 디렉토리 구조 생성
- 기존 k8s 매니페스트를 base로 복사
- Base kustomization.yaml 작성 (모든 리소스 포함)
- kubectl kustomize 검증 완료
🔧 환경별 Overlay
- DEV 환경: 12개 파일 생성 (1 replica, HTTP)
- STAGING 환경: 13개 파일 생성 (2 replicas, HTTPS)
- PROD 환경: 14개 파일 생성 (3 replicas, HTTPS, 보안 강화)
⚙️ 스크립트 및 설정
- 환경별 설정 파일 작성 (dev/staging/prod)
- Jenkinsfile 작성 (JDK21, 파드 자동 정리 포함)
- 수동 배포 스크립트 작성 및 실행 권한 설정
- 검증 스크립트 작성 및 실행 권한 설정
🎯 다음 단계
-
Jenkins 서버 설정
- 필수 플러그인 설치
- Credentials 등록 (azure, acr, dockerhub, sonarqube)
-
SonarQube 연동
- 서비스별 프로젝트 생성
- Quality Gate 규칙 설정
-
파이프라인 테스트
- 개발 환경 배포 테스트
- 스테이징/운영 환경 배포 준비
-
모니터링 설정
- 배포 상태 모니터링
- 알림 시스템 구성
구축자: 이개발/백엔더
구축일: 2024년 12월 12일
버전: v1.0.0