mirror of
https://github.com/cna-bootcamp/phonebill.git
synced 2025-12-06 08:06:24 +00:00
- Kustomize 기반 환경별 배포 자동화 구현
- dev/staging/prod 환경별 리소스 및 설정 차별화
- SonarQube 품질 분석 통합 (선택적 실행)
- 자동/수동 트리거 지원
- 수동 배포 스크립트 및 가이드 문서 제공
주요 구성 요소:
- GitHub Actions 워크플로우: .github/workflows/backend-cicd.yaml
- Kustomize 매니페스트: .github/kustomize/{base,overlays}
- 환경별 설정: .github/config/deploy_env_vars_*
- 배포 스크립트: .github/scripts/deploy-actions.sh
- 상세 가이드: .github/actions-pipeline-guide.md
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
8.0 KiB
8.0 KiB
백엔드 GitHub Actions CI/CD 파이프라인 가이드
📋 개요
GitHub Actions를 이용한 백엔드 서비스 CI/CD 파이프라인 구축 가이드입니다. Kustomize를 활용한 환경별 배포 자동화와 SonarQube 품질 분석을 포함합니다.
시스템 정보
- 시스템명: phonebill
- 서비스 목록: api-gateway, user-service, bill-service, product-service, kos-mock
- JDK 버전: 21
- ACR 이름: acrdigitalgarage01
- 리소스 그룹: rg-digitalgarage-01
- AKS 클러스터: aks-digitalgarage-01
🏗️ 구축된 파일 구조
.github/
├── kustomize/
│ ├── base/
│ │ ├── kustomization.yaml
│ │ ├── namespace.yaml
│ │ ├── common/
│ │ │ ├── cm-common.yaml
│ │ │ ├── secret-common.yaml
│ │ │ ├── secret-imagepull.yaml
│ │ │ └── ingress.yaml
│ │ └── {service-name}/
│ │ ├── deployment.yaml
│ │ ├── service.yaml
│ │ ├── cm-{service-name}.yaml (존재 시)
│ │ └── secret-{service-name}.yaml (존재 시)
│ └── overlays/
│ ├── dev/
│ │ ├── kustomization.yaml
│ │ ├── cm-common-patch.yaml
│ │ ├── secret-common-patch.yaml
│ │ ├── ingress-patch.yaml
│ │ ├── deployment-{service-name}-patch.yaml
│ │ └── secret-{service-name}-patch.yaml
│ ├── staging/
│ └── prod/
├── config/
│ ├── deploy_env_vars_dev
│ ├── deploy_env_vars_staging
│ └── deploy_env_vars_prod
├── scripts/
│ └── deploy-actions.sh
└── workflows/
└── backend-cicd.yaml
⚙️ GitHub Repository 설정
1. Repository Secrets 설정
Repository Settings > Secrets and variables > Actions > Repository secrets에 다음을 등록:
# Azure Service Principal
AZURE_CREDENTIALS:
{
"clientId": "{클라이언트ID}",
"clientSecret": "{클라이언트시크릿}",
"subscriptionId": "{구독ID}",
"tenantId": "{테넌트ID}"
}
# ACR Credentials
ACR_USERNAME: acrdigitalgarage01
ACR_PASSWORD: {ACR패스워드}
# Docker Hub (Rate Limit 해결용)
DOCKERHUB_USERNAME: {Docker Hub 사용자명}
DOCKERHUB_PASSWORD: {Docker Hub 패스워드}
# SonarQube (선택사항)
SONAR_TOKEN: {SonarQube토큰}
SONAR_HOST_URL: {SonarQube서버URL}
2. Repository Variables 설정
Repository Settings > Secrets and variables > Actions > Variables > Repository variables에 등록:
ENVIRONMENT: dev # 기본값
SKIP_SONARQUBE: true # 기본값
3. ACR 패스워드 확인 방법
az acr credential show --name acrdigitalgarage01
🚀 CI/CD 파이프라인 구성
워크플로우 트리거
-
자동 실행:
main,develop브랜치에 Pushmain브랜치로 Pull Request
-
수동 실행:
- Actions 탭 > "Backend Services CI/CD" > "Run workflow"
- 환경 선택: dev/staging/prod
- SonarQube 분석 여부 선택
파이프라인 단계
1. Build and Test
- Gradle 빌드 (테스트 제외)
- SonarQube 분석 (선택적)
- 빌드 아티팩트 업로드
2. Build and Push Docker Images
- Docker 이미지 빌드
- ACR에 푸시 (태그: {environment}-{timestamp})
3. Deploy to Kubernetes
- Kustomize를 이용한 환경별 배포
- 배포 상태 확인
- Health Check
🔧 환경별 설정
개발 환경 (dev)
- 네임스페이스: phonebill-dev
- Replicas: 1
- Resources: 256Mi/256m → 1024Mi/1024m
- DDL: update
- Host: phonebill-api.20.214.196.128.nip.io
- SSL: false
스테이징 환경 (staging)
- 네임스페이스: phonebill-staging
- Replicas: 2
- Resources: 512Mi/512m → 2048Mi/2048m
- DDL: validate
- Host: staging.phonebill.com
- SSL: true (Let's Encrypt)
운영 환경 (prod)
- 네임스페이스: phonebill-prod
- Replicas: 3
- Resources: 1024Mi/1024m → 4096Mi/4096m
- DDL: validate
- JWT Token: 1시간 (보안 강화)
- Host: phonebill.com
- SSL: true (Let's Encrypt)
📝 수동 배포 방법
스크립트 사용
# 개발 환경 배포
./.github/scripts/deploy-actions.sh dev latest
# 스테이징 환경 배포
./.github/scripts/deploy-actions.sh staging 20241215123456
# 운영 환경 배포
./.github/scripts/deploy-actions.sh prod 20241215123456
kubectl 직접 사용
# 환경별 디렉토리로 이동
cd .github/kustomize/overlays/dev
# 이미지 태그 업데이트
kustomize edit set image acrdigitalgarage01.azurecr.io/phonebill/api-gateway:dev-20241215123456
# 배포 실행
kubectl apply -k .
🔄 롤백 방법
1. GitHub Actions를 통한 롤백
- GitHub > Actions > 성공한 이전 워크플로우 선택
- "Re-run all jobs" 클릭
2. kubectl을 이용한 롤백
# 특정 버전으로 롤백
kubectl rollout undo deployment/api-gateway -n phonebill-dev --to-revision=2
# 롤백 상태 확인
kubectl rollout status deployment/api-gateway -n phonebill-dev
3. 수동 스크립트를 이용한 롤백
# 이전 안정 버전 이미지 태그로 배포
./.github/scripts/deploy-actions.sh dev 20241214123456
🔍 SonarQube 설정
Quality Gate 기준
- Coverage: >= 80%
- Duplicated Lines: <= 3%
- Maintainability Rating: <= A
- Reliability Rating: <= A
- Security Rating: <= A
프로젝트 생성
각 서비스별로 phonebill-{service}-{environment} 형식으로 프로젝트 생성
📊 모니터링 및 확인
배포 상태 확인
# Pod 상태 확인
kubectl get pods -n phonebill-dev
# 서비스 상태 확인
kubectl get services -n phonebill-dev
# Ingress 확인
kubectl get ingress -n phonebill-dev
# 로그 확인
kubectl logs -f deployment/api-gateway -n phonebill-dev
Health Check
# API Gateway Health Check
kubectl -n phonebill-dev exec deployment/api-gateway -- curl -f http://localhost:8080/actuator/health
⚠️ 주의사항
-
환경별 Secret 관리:
- 현재는 동일한 값으로 설정되어 있음
- 실제 운영 시 환경별로 다른 값 설정 필요
-
도메인 설정:
- staging/prod 환경의 도메인은 실제 구매한 도메인으로 변경 필요
- SSL 인증서는 cert-manager 설정 필요
-
리소스 한계:
- 환경별 리소스 설정은 실제 부하에 맞게 조정 필요
-
데이터베이스 연결:
- 환경별로 다른 데이터베이스 인스턴스 사용 권장
🔧 문제 해결
일반적인 문제들
-
이미지 Pull 실패:
# Secret 확인 kubectl get secret secret-imagepull -n phonebill-dev -o yaml -
ConfigMap/Secret 업데이트 반영 안됨:
# Pod 재시작 kubectl rollout restart deployment/api-gateway -n phonebill-dev -
Ingress IP 할당 안됨:
# Ingress Controller 상태 확인 kubectl get pods -n ingress-nginx
📚 참고 자료
체크리스트
초기 설정
- GitHub Repository Secrets 설정 완료
- GitHub Repository Variables 설정 완료
- Azure Service Principal 생성 및 권한 설정
- ACR 접근 권한 확인
배포 테스트
- 개발 환경 배포 성공
- 스테이징 환경 배포 성공
- 운영 환경 배포 성공
- Health Check 통과
- 롤백 테스트 성공
모니터링 설정
- SonarQube 프로젝트 생성
- Quality Gate 설정
- 알림 설정 (선택사항)
이 가이드를 통해 GitHub Actions 기반의 완전 자동화된 CI/CD 파이프라인을 구축할 수 있습니다.