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>
This commit is contained in:
ondal
2025-12-01 10:23:32 +09:00
parent 21b9c77109
commit f12fed5de9
113 changed files with 2955 additions and 3567 deletions
+14 -19
View File
@@ -4,40 +4,35 @@ set -e
ENVIRONMENT=${1:-dev}
IMAGE_TAG=${2:-latest}
echo "🚀 Starting deployment for environment: $ENVIRONMENT with image tag: $IMAGE_TAG"
echo "🚀 Deploying to ${ENVIRONMENT} environment with tag ${IMAGE_TAG}..."
# 환경별 설정 파일 로드
source "$(dirname "$0")/../config/deploy_env_vars_${ENVIRONMENT}"
# 환경별 이미지 태그 업데이트
cd deployment/cicd/kustomize/overlays/${ENVIRONMENT}
cd "$(dirname "$0")/../kustomize/overlays/${ENVIRONMENT}"
# 서비스 목록 (공백으로 구분)
# 서비스 목록
services="api-gateway user-service bill-service product-service kos-mock"
echo "📦 Updating image tags for services: $services"
# 각 서비스 이미지 태그 업데이트
for service in $services; do
echo " - Updating $service to ${ENVIRONMENT}-${IMAGE_TAG}"
kustomize edit set image acrdigitalgarage01.azurecr.io/phonebill/$service:${ENVIRONMENT}-${IMAGE_TAG}
echo "📦 Updating image tag for ${service}..."
kustomize edit set image docker.io/hiondal/$service:${ENVIRONMENT}-${IMAGE_TAG}
done
echo "🔧 Applying Kubernetes manifests..."
# 배포 실행
echo "📋 Applying Kustomize 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 rollout status for $service"
kubectl rollout status deployment/$service -n phonebill-dg0500 --timeout=300s
echo " Checking ${service}..."
kubectl rollout status deployment/$service -n ${namespace} --timeout=300s || echo " ⚠️ Timeout waiting for ${service}"
done
echo "✅ Deployment completed successfully!"
echo ""
echo "📊 Current deployment status:"
kubectl get pods -n phonebill-dg0500 -o wide
echo ""
echo "🌐 Service endpoints:"
kubectl get services -n phonebill-dg0500
echo ""
echo "🔗 Ingress information:"
kubectl get ingress -n phonebill-dg0500
echo "📊 Current status:"
kubectl get pods -n ${namespace}
+35 -32
View File
@@ -1,14 +1,13 @@
#!/bin/bash
# Base 리소스 누락 검증 스크립트 (phonebill 전용)
# Base 리소스 누락 검증 스크립트
echo "🔍 phonebill Base 리소스 누락 검증 시작..."
echo "🔍 Phonebill Base 리소스 누락 검증 시작..."
BASE_DIR="deployment/cicd/kustomize/base"
MISSING_RESOURCES=0
REQUIRED_FILES=("deployment.yaml" "service.yaml")
OPTIONAL_FILES=("cm-" "secret-")
# 1. 각 서비스 디렉토리의 파일 확인
echo ""
echo "1. 서비스 디렉토리별 파일 목록:"
for dir in $BASE_DIR/*/; do
if [ -d "$dir" ] && [[ $(basename "$dir") != "common" ]]; then
@@ -16,24 +15,33 @@ for dir in $BASE_DIR/*/; do
echo "=== $service ==="
# 필수 파일 확인
for required in "${REQUIRED_FILES[@]}"; do
if [ -f "$dir$required" ]; then
echo "$required"
else
echo "MISSING REQUIRED: $required"
((MISSING_RESOURCES++))
fi
done
if [ -f "$dir/deployment.yaml" ]; then
echo " ✅ deployment.yaml"
else
echo " ❌ MISSING REQUIRED: deployment.yaml"
((MISSING_RESOURCES++))
fi
# 선택적 파일 확인
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
if [ -f "$dir/service.yaml" ]; then
echo " ✅ service.yaml"
else
echo " ❌ MISSING REQUIRED: service.yaml"
((MISSING_RESOURCES++))
fi
# ConfigMap 확인
if ls "$dir"cm-*.yaml 1> /dev/null 2>&1; then
for file in "$dir"cm-*.yaml; do
echo "$(basename "$file")"
done
fi
# Secret 확인
if ls "$dir"secret-*.yaml 1> /dev/null 2>&1; then
for file in "$dir"secret-*.yaml; do
echo "$(basename "$file")"
done
fi
echo ""
fi
done
@@ -42,15 +50,11 @@ done
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
for file in "$COMMON_DIR"/*.yaml; do
if [ -f "$file" ]; then
echo " ✅ common/$(basename "$file")"
done
else
echo " ❌ Common 디렉토리에 YAML 파일이 없습니다"
((MISSING_RESOURCES++))
fi
fi
done
else
echo " ❌ Common 디렉토리가 없습니다"
((MISSING_RESOURCES++))
@@ -61,9 +65,8 @@ 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) # 공백 제거
resource_path=$(echo "${BASH_REMATCH[1]}" | xargs)
full_path="$BASE_DIR/$resource_path"
if [ -f "$full_path" ]; then
echo "$resource_path"
@@ -125,4 +128,4 @@ else
echo " - Secret: secret-{서비스명}.yaml"
echo "4. 다시 검증: ./scripts/validate-resources.sh"
exit 1
fi
fi