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

- Kustomize 기반 환경별 배포 구성 (dev/staging/prod)
- Jenkins 파이프라인 with SonarQube 품질 게이트
- 파드 자동 정리 및 보안 강화 설정
- 환경별 차등 리소스 할당 및 도메인 설정
- 수동 배포 및 검증 스크립트 제공
- 5개 마이크로서비스 병렬 빌드/배포 지원

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
hiondal
2025-09-12 22:29:40 +09:00
parent d12d8c0838
commit 725635fadd
46 changed files with 969 additions and 921 deletions
+26 -22
View File
@@ -4,40 +4,44 @@ set -e
ENVIRONMENT=${1:-dev}
IMAGE_TAG=${2:-latest}
# 서비스 목록
SERVICES=("api-gateway" "user-service" "bill-service" "product-service" "kos-mock")
echo "🚀 Starting deployment to ${ENVIRONMENT} environment..."
echo "📦 Image tag: ${ENVIRONMENT}-${IMAGE_TAG}"
echo "🚀 Starting manual deployment for environment: $ENVIRONMENT with tag: $IMAGE_TAG"
# 환경별 이미지 태그 업데이트
cd deployment/cicd/kustomize/overlays/${ENVIRONMENT}
# 서비스 목록 (공백으로 구분)
services="api-gateway user-service bill-service product-service kos-mock"
echo "📦 Updating image tags for services: $services"
# 각 서비스 이미지 태그 업데이트
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}
for service in $services; do
echo " ⏳ Updating $service to ${ENVIRONMENT}-${IMAGE_TAG}"
kustomize edit set image acrdigitalgarage01.azurecr.io/phonebill/$service:${ENVIRONMENT}-${IMAGE_TAG}
done
echo "🚢 Deploying to Kubernetes cluster..."
# 배포 실행
echo "🎯 Applying Kubernetes manifests..."
kubectl apply -k .
echo "⏰ Waiting for deployments to be ready..."
# 배포 상태 확인
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
for service in $services; do
echo " 🔄 Waiting for $service deployment..."
kubectl rollout status deployment/$service -n phonebill-${ENVIRONMENT}
done
# 최종 상태 확인
echo "📋 Final deployment status:"
kubectl get pods -n phonebill-${ENVIRONMENT}
echo "✅ Deployment completed successfully!"
echo ""
kubectl get services -n phonebill-${ENVIRONMENT}
echo "📋 Deployment Summary:"
echo " Environment: $ENVIRONMENT"
echo " Image Tag: ${ENVIRONMENT}-${IMAGE_TAG}"
echo " Services: $services"
echo " Namespace: phonebill-${ENVIRONMENT}"
echo ""
kubectl get ingress -n phonebill-${ENVIRONMENT}
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}')"
echo "🔍 Check deployment status:"
echo " kubectl get pods -n phonebill-${ENVIRONMENT}"
echo " kubectl get services -n phonebill-${ENVIRONMENT}"
echo " kubectl get ingress -n phonebill-${ENVIRONMENT}"
+190 -74
View File
@@ -1,86 +1,202 @@
#!/bin/bash
echo "🔍 Jenkins CI/CD 구성 최종 검증 시작..."
# phonebill 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
echo "🔍 phonebill CI/CD 설정 검증 시작..."
# 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
BASE_DIR="deployment/cicd/kustomize/base"
MISSING_RESOURCES=0
REQUIRED_FILES=("deployment.yaml" "service.yaml")
OPTIONAL_FILES=("cm-" "secret-")
# 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
# 1. 각 서비스 디렉토리의 파일 확인
echo "1. 서비스 디렉토리별 파일 목록:"
for dir in $BASE_DIR/*/; do
if [ -d "$dir" ] && [[ $(basename "$dir") != "common" ]]; then
service=$(basename "$dir")
echo "=== $service ==="
# 필수 파일 확인
for required in "${REQUIRED_FILES[@]}"; do
if [ -f "$dir$required" ]; then
echo "$required"
else
echo " ❌ MISSING REQUIRED: $required"
((MISSING_RESOURCES++))
fi
done
# 선택적 파일 확인
for optional in "${OPTIONAL_FILES[@]}"; do
files=($(ls "$dir"$optional*".yaml" 2>/dev/null))
if [ ${#files[@]} -gt 0 ]; then
for file in "${files[@]}"; do
echo "$(basename "$file")"
done
fi
done
echo ""
fi
done
# 4. Jenkinsfile JDK 버전 확인
echo "4. Jenkinsfile JDK 버전 검증..."
if grep -q "gradle:jdk21" deployment/cicd/Jenkinsfile; then
echo "✅ JDK 21 버전 정상"
# 2. Common 리소스 확인
echo "2. Common 리소스 확인:"
COMMON_DIR="$BASE_DIR/common"
if [ -d "$COMMON_DIR" ]; then
common_files=($(ls "$COMMON_DIR"/*.yaml 2>/dev/null))
if [ ${#common_files[@]} -gt 0 ]; then
for file in "${common_files[@]}"; do
echo " ✅ common/$(basename "$file")"
done
else
echo " ❌ Common 디렉토리에 YAML 파일이 없습니다"
((MISSING_RESOURCES++))
fi
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 "❌ 서비스 배열 확인 필요"
echo " ❌ Common 디렉토리가 없습니다"
((MISSING_RESOURCES++))
fi
# 3. kustomization.yaml과 실제 파일 비교
echo ""
echo "🎯 검증 완료!"
echo "3. kustomization.yaml 리소스 검증:"
if [ -f "$BASE_DIR/kustomization.yaml" ]; then
while IFS= read -r line; do
# resources 섹션의 YAML 파일 경로 추출
if [[ $line =~ ^[[:space:]]*-[[:space:]]*([^#]+\.yaml)[[:space:]]*$ ]]; then
resource_path=$(echo "${BASH_REMATCH[1]}" | xargs) # 공백 제거
full_path="$BASE_DIR/$resource_path"
if [ -f "$full_path" ]; then
echo "$resource_path"
else
echo " ❌ MISSING: $resource_path"
((MISSING_RESOURCES++))
fi
fi
done < "$BASE_DIR/kustomization.yaml"
else
echo " ❌ kustomization.yaml 파일이 없습니다"
((MISSING_RESOURCES++))
fi
# 4. kubectl kustomize 검증
echo ""
echo "📋 추가 수동 확인사항:"
echo " - Jenkins Credentials 설정 (azure-credentials, acr-credentials, sonarqube-token)"
echo " - SonarQube Quality Gate 설정"
echo " - 프로덕션 환경 패스워드 변경"
echo " - SSL 인증서 설정"
echo "4. Kustomize 빌드 테스트:"
if kubectl kustomize "$BASE_DIR" > /dev/null 2>&1; then
echo " ✅ Base kustomization 빌드 성공"
else
echo " ❌ Base kustomization 빌드 실패:"
kubectl kustomize "$BASE_DIR" 2>&1 | head -5 | sed 's/^/ /'
((MISSING_RESOURCES++))
fi
# 5. 환경별 overlay 검증
echo ""
echo "5. 환경별 Overlay 검증:"
for env in dev staging prod; do
overlay_dir="deployment/cicd/kustomize/overlays/$env"
if [ -d "$overlay_dir" ] && [ -f "$overlay_dir/kustomization.yaml" ]; then
if kubectl kustomize "$overlay_dir" > /dev/null 2>&1; then
echo "$env 환경 빌드 성공"
else
echo "$env 환경 빌드 실패"
((MISSING_RESOURCES++))
fi
else
echo " ⚠️ $env 환경 설정 없음 (선택사항)"
fi
done
# 6. Jenkins 파이프라인 검증
echo ""
echo "6. Jenkins 파이프라인 검증:"
if [ -f "deployment/cicd/Jenkinsfile" ]; then
echo " ✅ Jenkinsfile 존재"
# 주요 서비스명 확인
services_in_jenkinsfile=$(grep -o "api-gateway\|user-service\|bill-service\|product-service\|kos-mock" deployment/cicd/Jenkinsfile | sort -u | tr '\n' ' ')
echo " 📋 Jenkinsfile의 서비스: $services_in_jenkinsfile"
# ACR 이름 확인
acr_name=$(grep -o "acrdigitalgarage01" deployment/cicd/Jenkinsfile | head -1)
if [ -n "$acr_name" ]; then
echo " ✅ ACR 이름: $acr_name"
else
echo " ⚠️ ACR 이름을 찾을 수 없습니다"
fi
else
echo " ❌ Jenkinsfile이 없습니다"
((MISSING_RESOURCES++))
fi
# 7. 스크립트 파일 검증
echo ""
echo "7. 배포 스크립트 검증:"
scripts_dir="deployment/cicd/scripts"
if [ -f "$scripts_dir/deploy.sh" ]; then
echo " ✅ deploy.sh 존재"
if [ -x "$scripts_dir/deploy.sh" ]; then
echo " ✅ deploy.sh 실행 권한 있음"
else
echo " ⚠️ deploy.sh 실행 권한 없음 (chmod +x 필요)"
fi
else
echo " ❌ deploy.sh가 없습니다"
((MISSING_RESOURCES++))
fi
# 8. 환경별 설정 파일 검증
echo ""
echo "8. 환경별 설정 파일 검증:"
config_dir="deployment/cicd/config"
for env in dev staging prod; do
config_file="$config_dir/deploy_env_vars_$env"
if [ -f "$config_file" ]; then
echo "$env 환경 설정 파일 존재"
# 필수 설정 확인
if grep -q "resource_group\|cluster_name" "$config_file"; then
echo " ✅ 필수 설정 (resource_group, cluster_name) 확인됨"
else
echo " ❌ 필수 설정이 누락됨"
((MISSING_RESOURCES++))
fi
else
echo "$env 환경 설정 파일이 없습니다"
((MISSING_RESOURCES++))
fi
done
# 결과 출력
echo ""
echo "======================================"
if [ $MISSING_RESOURCES -eq 0 ]; then
echo "🎯 검증 완료! phonebill CI/CD 설정이 정상입니다."
echo "======================================"
echo ""
echo "📋 Jenkins CI/CD 파이프라인 구성 요약:"
echo " • 시스템명: phonebill"
echo " • 서비스: api-gateway, user-service, bill-service, product-service, kos-mock"
echo " • 환경: dev, staging, prod"
echo " • 컨테이너 레지스트리: acrdigitalgarage01.azurecr.io"
echo " • JDK 버전: 21"
echo ""
echo "🚀 다음 단계:"
echo " 1. Jenkins에서 Pipeline Job 생성"
echo " 2. Jenkins Credentials 설정 (azure-credentials, acr-credentials, dockerhub-credentials)"
echo " 3. SonarQube 서버 연동 설정"
echo " 4. 파이프라인 실행 테스트"
echo ""
exit 0
else
echo "$MISSING_RESOURCES개의 문제가 발견되었습니다."
echo "======================================"
echo ""
echo "💡 문제 해결 가이드:"
echo "1. 누락된 파일들을 base 디렉토리에 추가하세요"
echo "2. kustomization.yaml에서 존재하지 않는 파일 참조를 제거하세요"
echo "3. 파일명이 명명 규칙을 따르는지 확인하세요:"
echo " - ConfigMap: cm-{서비스명}.yaml"
echo " - Secret: secret-{서비스명}.yaml"
echo "4. 스크립트 실행 권한 설정: chmod +x scripts/*.sh"
echo "5. 다시 검증: ./scripts/validate-cicd-setup.sh"
exit 1
fi