phonebill/deployment/cicd/jenkins-pipeline-guide.md
ondal f12fed5de9 Jenkins 기반 CI/CD 파이프라인 구성
- 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>
2025-12-01 10:23:32 +09:00

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 파이프라인 실행

  1. Jenkins > phonebill > Build with Parameters
  2. ENVIRONMENT 선택 (dev/staging/prod)
  3. SKIP_SONARQUBE 입력 (true 또는 false)
  4. 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-dev
  • phonebill-user-service-staging
  • phonebill-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 접근 테스트
  • 로그 이상 여부 확인