Jenkins CI/CD 파이프라인 구축 완료

- Kustomize 기반 환경별 매니페스트 구성 (dev/staging/prod)
- Base 및 Overlay 구조로 환경별 설정 분리
- 각 환경별 Deployment, Service, ConfigMap, Secret 패치 적용
- Jenkinsfile 작성 (Gradle JDK21, SonarQube, Quality Gate 포함)
- 환경별 설정 파일 및 수동 배포 스크립트 생성
- Jenkins CI/CD 가이드 문서 및 검증 스크립트 작성
- DEV 환경 Ingress Host를 base와 동일하게 수정 (체크리스트 준수)

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
hiondal
2025-09-12 19:09:05 +09:00
parent c9d99b34d6
commit 291306f5c7
67 changed files with 908 additions and 651 deletions
+22 -16
View File
@@ -4,34 +4,40 @@ set -e
ENVIRONMENT=${1:-dev}
IMAGE_TAG=${2:-latest}
echo "🚀 Starting deployment for environment: $ENVIRONMENT with image tag: $IMAGE_TAG"
# 서비스 목록
SERVICES=("api-gateway" "user-service" "bill-service" "product-service" "kos-mock")
echo "🚀 Starting deployment to ${ENVIRONMENT} environment..."
echo "📦 Image tag: ${ENVIRONMENT}-${IMAGE_TAG}"
# 환경별 이미지 태그 업데이트
cd deployment/cicd/kustomize/overlays/${ENVIRONMENT}
echo "📝 Updating image tags..."
# 각 서비스 이미지 태그 업데이트
kustomize edit set image acrdigitalgarage01.azurecr.io/phonebill/api-gateway:${ENVIRONMENT}-${IMAGE_TAG}
kustomize edit set image acrdigitalgarage01.azurecr.io/phonebill/user-service:${ENVIRONMENT}-${IMAGE_TAG}
kustomize edit set image acrdigitalgarage01.azurecr.io/phonebill/bill-service:${ENVIRONMENT}-${IMAGE_TAG}
kustomize edit set image acrdigitalgarage01.azurecr.io/phonebill/product-service:${ENVIRONMENT}-${IMAGE_TAG}
kustomize edit set image acrdigitalgarage01.azurecr.io/phonebill/kos-mock:${ENVIRONMENT}-${IMAGE_TAG}
echo "🔄 Updating image tags..."
for service in "${SERVICES[@]}"; do
echo " - Updating ${service} to acrdigitalgarage01.azurecr.io/phonebill/${service}:${ENVIRONMENT}-${IMAGE_TAG}"
kustomize edit set image acrdigitalgarage01.azurecr.io/phonebill/${service}:${ENVIRONMENT}-${IMAGE_TAG}
done
echo "📦 Applying manifests to Kubernetes..."
# 배포 실행
echo "🎯 Applying Kubernetes manifests..."
kubectl apply -k .
echo "⏳ Waiting for deployments to be ready..."
# 배포 상태 확인
kubectl rollout status deployment/${ENVIRONMENT}-api-gateway -n phonebill-${ENVIRONMENT}
kubectl rollout status deployment/${ENVIRONMENT}-user-service -n phonebill-${ENVIRONMENT}
kubectl rollout status deployment/${ENVIRONMENT}-bill-service -n phonebill-${ENVIRONMENT}
kubectl rollout status deployment/${ENVIRONMENT}-product-service -n phonebill-${ENVIRONMENT}
kubectl rollout status deployment/${ENVIRONMENT}-kos-mock -n phonebill-${ENVIRONMENT}
echo "⏳ Waiting for deployments to be ready..."
for service in "${SERVICES[@]}"; do
echo " - Checking ${service} deployment status..."
kubectl rollout status deployment/${service} -n phonebill-${ENVIRONMENT} --timeout=300s
done
echo "🔍 Checking deployment status..."
# 최종 상태 확인
echo "📋 Final deployment status:"
kubectl get pods -n phonebill-${ENVIRONMENT}
echo ""
kubectl get services -n phonebill-${ENVIRONMENT}
echo ""
kubectl get ingress -n phonebill-${ENVIRONMENT}
echo "✅ Deployment completed successfully!"
echo "✅ Deployment to ${ENVIRONMENT} environment completed successfully!"
echo "🌐 Access URL: https://$(kubectl get ingress -n phonebill-${ENVIRONMENT} -o jsonpath='{.items[0].spec.rules[0].host}')"
+86
View File
@@ -0,0 +1,86 @@
#!/bin/bash
echo "🔍 Jenkins CI/CD 구성 최종 검증 시작..."
# 1. 파일 개수 확인
echo "1. 파일 개수 검증..."
OVERLAY_FILES=$(find deployment/cicd/kustomize/overlays -name "*.yaml" | wc -l)
if [ $OVERLAY_FILES -eq 36 ]; then
echo "✅ Overlay 파일 개수 정상 (36개)"
else
echo "❌ Overlay 파일 개수 오류 ($OVERLAY_FILES개, 36개여야 함)"
fi
# 2. DEV ingress host 검증
echo "2. DEV Ingress Host 검증..."
BASE_HOST=$(grep "host:" deployment/cicd/kustomize/base/common/ingress.yaml | awk '{print $3}')
DEV_HOST=$(grep "host:" deployment/cicd/kustomize/overlays/dev/ingress-patch.yaml | awk '{print $3}')
if [ "$BASE_HOST" = "$DEV_HOST" ]; then
echo "✅ DEV Ingress Host 정상 ($DEV_HOST)"
else
echo "❌ DEV Ingress Host 오류 (base: $BASE_HOST, dev: $DEV_HOST)"
fi
# 3. Kustomize 빌드 테스트
echo "3. Kustomize 빌드 테스트..."
for env in dev staging prod; do
if kubectl kustomize deployment/cicd/kustomize/overlays/$env > /dev/null 2>&1; then
echo "$env 환경 빌드 성공"
else
echo "$env 환경 빌드 실패"
kubectl kustomize deployment/cicd/kustomize/overlays/$env 2>&1 | head -3
fi
done
# 4. Jenkinsfile JDK 버전 확인
echo "4. Jenkinsfile JDK 버전 검증..."
if grep -q "gradle:jdk21" deployment/cicd/Jenkinsfile; then
echo "✅ JDK 21 버전 정상"
else
echo "❌ JDK 버전 확인 필요"
fi
# 5. Secret stringData 사용 확인
echo "5. Secret stringData 사용 검증..."
if grep -r "stringData:" deployment/cicd/kustomize/overlays/*/secret-*-patch.yaml > /dev/null; then
echo "✅ stringData 사용 정상"
else
echo "❌ stringData 사용 확인 필요"
fi
# 6. patches 문법 확인 (patchesStrategicMerge 금지)
echo "6. Kustomization patches 문법 검증..."
if grep -r "patchesStrategicMerge:" deployment/cicd/kustomize/overlays/*/kustomization.yaml > /dev/null; then
echo "❌ 금지된 patchesStrategicMerge 사용 발견"
else
echo "✅ patches 문법 정상"
fi
# 7. 환경별 replicas 설정 확인
echo "7. 환경별 replicas 설정 검증..."
DEV_REPLICAS=$(grep "replicas:" deployment/cicd/kustomize/overlays/dev/deployment-user-service-patch.yaml | awk '{print $2}')
STAGING_REPLICAS=$(grep "replicas:" deployment/cicd/kustomize/overlays/staging/deployment-user-service-patch.yaml | awk '{print $2}')
PROD_REPLICAS=$(grep "replicas:" deployment/cicd/kustomize/overlays/prod/deployment-user-service-patch.yaml | awk '{print $2}')
if [ "$DEV_REPLICAS" = "1" ] && [ "$STAGING_REPLICAS" = "2" ] && [ "$PROD_REPLICAS" = "3" ]; then
echo "✅ 환경별 replicas 설정 정상 (dev:1, staging:2, prod:3)"
else
echo "❌ 환경별 replicas 설정 확인 필요 (dev:$DEV_REPLICAS, staging:$STAGING_REPLICAS, prod:$PROD_REPLICAS)"
fi
# 8. 서비스 배열 검증
echo "8. Jenkinsfile 서비스 배열 검증..."
SERVICES_COUNT=$(grep "def services = \[" deployment/cicd/Jenkinsfile | grep -o "'" | wc -l)
if [ $SERVICES_COUNT -eq 10 ]; then # 5개 서비스 * 2 (시작/끝 따옴표)
echo "✅ 서비스 배열 정상 (5개 서비스)"
else
echo "❌ 서비스 배열 확인 필요"
fi
echo ""
echo "🎯 검증 완료!"
echo ""
echo "📋 추가 수동 확인사항:"
echo " - Jenkins Credentials 설정 (azure-credentials, acr-credentials, sonarqube-token)"
echo " - SonarQube Quality Gate 설정"
echo " - 프로덕션 환경 패스워드 변경"
echo " - SSL 인증서 설정"