phonebill/deployment/cicd/jenkins-pipeline-guide.md
ondal 0f054109bb Jenkins CI/CD 파이프라인 업데이트
- Jenkinsfile 개선: SonarQube 분석, Quality Gate 추가
- 환경별 설정 파일 업데이트 (dev/staging/prod)
- Kustomize base 및 overlay 파일 정리
- prod 환경 overlay 파일 추가
- 배포 스크립트 및 검증 스크립트 업데이트
- 파이프라인 가이드 문서 업데이트

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 12:57:35 +09:00

7.3 KiB

백엔드 Jenkins CI/CD 파이프라인 가이드

📋 개요

이 가이드는 phonebill 프로젝트의 Jenkins + Kustomize 기반 CI/CD 파이프라인 구축 및 운영 방법을 설명합니다.

🔧 사전 준비사항

프로젝트 정보

항목
시스템명 phonebill
서비스 목록 api-gateway, user-service, bill-service, product-service, kos-mock
JDK 버전 21
Image Registry docker.io
Image Organization hiondal
Jenkins K8s Cloud Name k8s
K8s Context Prefix minikube
Namespace phonebill

Jenkins 서버 환경 구성

1. 필수 플러그인 설치

- Kubernetes
- Pipeline Utility Steps
- Docker Pipeline
- GitHub
- SonarQube Scanner
- Azure Credentials

2. Jenkins Credentials 등록

Docker Hub Credentials (Rate Limit 해결용)

- Kind: Username with password
- ID: dockerhub-credentials
- Username: {DOCKERHUB_USERNAME}
- Password: {DOCKERHUB_PASSWORD}
- 참고: Docker Hub 무료 계정 생성 (https://hub.docker.com)

Image Registry Credentials

- Kind: Username with password
- ID: imagereg-credentials
- Username: {REGISTRY_USERNAME}
- Password: {REGISTRY_PASSWORD}

SonarQube Token (선택사항)

- Kind: Secret text
- ID: sonarqube-token
- Secret: {SonarQube토큰}

📁 디렉토리 구조

deployment/cicd/
├── Jenkinsfile                    # Jenkins 파이프라인 정의
├── jenkins-pipeline-guide.md      # 이 가이드 문서
├── config/
│   ├── deploy_env_vars_dev        # dev 환경 설정
│   ├── deploy_env_vars_staging    # staging 환경 설정
│   └── deploy_env_vars_prod       # prod 환경 설정
├── scripts/
│   ├── deploy.sh                  # 수동 배포 스크립트
│   └── validate-resources.sh      # 리소스 검증 스크립트
└── kustomize/
    ├── base/                      # 기본 Kubernetes 매니페스트
    │   ├── kustomization.yaml
    │   ├── common/
    │   │   ├── cm-common.yaml
    │   │   ├── secret-common.yaml
    │   │   └── ingress.yaml
    │   ├── api-gateway/
    │   │   ├── deployment.yaml
    │   │   ├── service.yaml
    │   │   └── cm-api-gateway.yaml
    │   ├── user-service/
    │   │   ├── deployment.yaml
    │   │   ├── service.yaml
    │   │   ├── cm-user-service.yaml
    │   │   └── secret-user-service.yaml
    │   ├── bill-service/
    │   │   ├── deployment.yaml
    │   │   ├── service.yaml
    │   │   ├── cm-bill-service.yaml
    │   │   └── secret-bill-service.yaml
    │   ├── product-service/
    │   │   ├── deployment.yaml
    │   │   ├── service.yaml
    │   │   ├── cm-product-service.yaml
    │   │   └── secret-product-service.yaml
    │   └── kos-mock/
    │       ├── deployment.yaml
    │       ├── service.yaml
    │       └── cm-kos-mock.yaml
    └── overlays/
        ├── dev/                   # 개발 환경 오버레이
        ├── staging/               # 스테이징 환경 오버레이
        └── prod/                  # 운영 환경 오버레이

🚀 Jenkins Pipeline Job 생성

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
    

2. Pipeline Parameters 설정

파라미터 타입 설명
ENVIRONMENT Choice dev, staging, prod 배포 대상 환경
IMAGE_TAG String latest 이미지 태그 (선택)
SKIP_SONARQUBE String true SonarQube 분석 건너뛰기

⚙️ 환경별 설정

DEV 환경

# Replicas: 1
# Resources:
#   requests: 256m CPU, 256Mi Memory
#   limits: 1024m CPU, 1024Mi Memory
# DDL_AUTO: update
# HTTPS: 비활성화

STAGING 환경

# Replicas: 2
# Resources:
#   requests: 512m CPU, 512Mi Memory
#   limits: 2048m CPU, 2048Mi Memory
# DDL_AUTO: validate
# HTTPS: 활성화 (SSL 인증서 필요)

PROD 환경

# Replicas: 3
# Resources:
#   requests: 1024m CPU, 1024Mi Memory
#   limits: 4096m CPU, 4096Mi Memory
# DDL_AUTO: validate
# HTTPS: 활성화 (SSL 인증서 필요)

📊 SonarQube 설정

Quality Gate 설정

Coverage: >= 80%
Duplicated Lines: <= 3%
Maintainability Rating: <= A
Reliability Rating: <= A
Security Rating: <= A

분석 제외 대상

**/config/**
**/entity/**
**/dto/**
**/*Application.class
**/exception/**

🔨 수동 배포

배포 스크립트 사용

# 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

리소스 검증

# Kustomize 리소스 검증
./deployment/cicd/scripts/validate-resources.sh

🔄 배포 상태 확인

# 파드 상태 확인
kubectl get pods -n phonebill

# 서비스 상태 확인
kubectl get services -n phonebill

# 인그레스 확인
kubectl get ingress -n phonebill

# 배포 상태 상세 확인
kubectl describe deployment api-gateway -n phonebill

롤백 방법

이전 버전으로 롤백

# 특정 리비전으로 롤백
kubectl rollout undo deployment/{서비스명} -n phonebill --to-revision=2

# 롤백 상태 확인
kubectl rollout status deployment/{서비스명} -n phonebill

이미지 태그 기반 롤백

# 이전 안정 버전 이미지 태그로 업데이트
cd deployment/cicd/kustomize/overlays/{환경}
kustomize edit set image docker.io/hiondal/{서비스명}=docker.io/hiondal/{서비스명}:{환경}-{이전태그}
kubectl apply -k .

🔍 문제 해결

일반적인 문제

1. 이미지 풀 실패

# ImagePullBackOff 상태 확인
kubectl describe pod {pod-name} -n phonebill

# Docker Hub 인증 확인
kubectl get secret -n phonebill

2. 파드 시작 실패

# 로그 확인
kubectl logs {pod-name} -n phonebill

# 이벤트 확인
kubectl get events -n phonebill --sort-by='.lastTimestamp'

3. Kustomize 빌드 실패

# 검증 스크립트 실행
./deployment/cicd/scripts/validate-resources.sh

# 직접 빌드 테스트
kubectl kustomize deployment/cicd/kustomize/overlays/dev

Jenkins 파이프라인 문제

1. Pod 정리가 안 되는 경우

  • podRetention: never() 설정 확인
  • terminationGracePeriodSeconds: 3 설정 확인
  • Jenkins Kubernetes Plugin 버전 확인

2. 변수 치환 오류

  • ${variable} 사용 (Groovy 문자열 보간)
  • \${variable} 사용 금지 (bash 이스케이프)

📝 체크리스트

배포 전 확인

  • 환경 변수 파일 설정 완료
  • Kubernetes 컨텍스트 설정 완료
  • 이미지 레지스트리 인증 설정
  • 네임스페이스 생성 완료
  • 백킹 서비스(DB, Redis) 준비 완료

배포 후 확인

  • 모든 파드 Running 상태 확인
  • 서비스 엔드포인트 정상 응답
  • 로그에 에러 없음
  • 헬스체크 정상 통과