Add cuisine subcategory filter, fix remap logic, and add OKE deployment manifests

- Add 파인다이닝/코스 cuisine type to 한식/일식/중식/양식 categories
- Change cuisine filter from flat list to grouped optgroup with subcategories
- Fix remap-foods/remap-cuisine: add jdbcType=CLOB, fix CLOB LISTAGG,
  improve retry logic (3 attempts, batch size 5), add error logging
- Add OKE deployment: Dockerfiles, K8s manifests, deploy.sh, deployment guide
- Add Next.js standalone output for Docker builds

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
joungmin
2026-03-09 22:58:09 +09:00
parent 69e1882c2b
commit ff4e8d742d
18 changed files with 853 additions and 41 deletions

129
deploy.sh Executable file
View File

@@ -0,0 +1,129 @@
#!/bin/bash
set -euo pipefail
# ── Configuration ──
REGISTRY="icn.ocir.io/idyhsdamac8c/tasteby"
NAMESPACE="tasteby"
PLATFORM="linux/arm64"
# ── Parse arguments ──
TARGET="all" # all | backend | frontend
MESSAGE=""
DRY_RUN=false
while [[ $# -gt 0 ]]; do
case $1 in
--backend-only) TARGET="backend"; shift ;;
--frontend-only) TARGET="frontend"; shift ;;
--dry-run) DRY_RUN=true; shift ;;
-m) MESSAGE="$2"; shift 2 ;;
*) MESSAGE="$1"; shift ;;
esac
done
# ── Determine next version ──
LATEST_TAG=$(git tag --sort=-v:refname | grep '^v' | head -1 2>/dev/null || echo "v0.1.0")
MAJOR=$(echo "$LATEST_TAG" | cut -d. -f1)
MINOR=$(echo "$LATEST_TAG" | cut -d. -f2)
PATCH=$(echo "$LATEST_TAG" | cut -d. -f3)
NEXT_PATCH=$((PATCH + 1))
TAG="${MAJOR}.${MINOR}.${NEXT_PATCH}"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo " Deploying Tasteby ${TAG}"
echo " Target: ${TARGET}"
echo " Message: ${MESSAGE:-<none>}"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
if $DRY_RUN; then
echo "[DRY RUN] Would build & push images, apply K8s manifests, create git tag."
exit 0
fi
cd "$(git rev-parse --show-toplevel)"
# ── Build & Push ──
if [[ "$TARGET" == "all" || "$TARGET" == "backend" ]]; then
echo ""
echo "▶ Building backend image..."
docker build --platform "$PLATFORM" \
-t "$REGISTRY/backend:$TAG" \
-t "$REGISTRY/backend:latest" \
backend-java/
echo "▶ Pushing backend image..."
docker push "$REGISTRY/backend:$TAG"
docker push "$REGISTRY/backend:latest"
fi
if [[ "$TARGET" == "all" || "$TARGET" == "frontend" ]]; then
echo ""
echo "▶ Building frontend image..."
# Read build args from env or .env file
MAPS_KEY="${NEXT_PUBLIC_GOOGLE_MAPS_API_KEY:-}"
CLIENT_ID="${NEXT_PUBLIC_GOOGLE_CLIENT_ID:-}"
if [[ -f frontend/.env.local ]]; then
MAPS_KEY="${MAPS_KEY:-$(grep NEXT_PUBLIC_GOOGLE_MAPS_API_KEY frontend/.env.local 2>/dev/null | cut -d= -f2)}"
CLIENT_ID="${CLIENT_ID:-$(grep NEXT_PUBLIC_GOOGLE_CLIENT_ID frontend/.env.local 2>/dev/null | cut -d= -f2)}"
fi
docker build --platform "$PLATFORM" \
--build-arg NEXT_PUBLIC_GOOGLE_MAPS_API_KEY="$MAPS_KEY" \
--build-arg NEXT_PUBLIC_GOOGLE_CLIENT_ID="$CLIENT_ID" \
-t "$REGISTRY/frontend:$TAG" \
-t "$REGISTRY/frontend:latest" \
frontend/
echo "▶ Pushing frontend image..."
docker push "$REGISTRY/frontend:$TAG"
docker push "$REGISTRY/frontend:latest"
fi
# ── Deploy to K8s ──
echo ""
echo "▶ Updating K8s deployments..."
if [[ "$TARGET" == "all" || "$TARGET" == "backend" ]]; then
kubectl set image deployment/backend \
backend="$REGISTRY/backend:$TAG" \
-n "$NAMESPACE"
echo " Waiting for backend rollout..."
kubectl rollout status deployment/backend -n "$NAMESPACE" --timeout=180s
fi
if [[ "$TARGET" == "all" || "$TARGET" == "frontend" ]]; then
kubectl set image deployment/frontend \
frontend="$REGISTRY/frontend:$TAG" \
-n "$NAMESPACE"
echo " Waiting for frontend rollout..."
kubectl rollout status deployment/frontend -n "$NAMESPACE" --timeout=120s
fi
# ── Git tag ──
echo ""
echo "▶ Creating git tag ${TAG}..."
TAG_MESSAGE="Deploy ${TAG}"
if [[ -n "$MESSAGE" ]]; then
TAG_MESSAGE="${TAG_MESSAGE}: ${MESSAGE}"
fi
# Include changed components
COMPONENTS=""
[[ "$TARGET" == "all" || "$TARGET" == "backend" ]] && COMPONENTS="backend"
[[ "$TARGET" == "all" || "$TARGET" == "frontend" ]] && COMPONENTS="${COMPONENTS:+$COMPONENTS, }frontend"
TAG_MESSAGE="${TAG_MESSAGE}
Components: ${COMPONENTS}
Images:
$([ "$TARGET" == "all" ] || [ "$TARGET" == "backend" ] && echo " - ${REGISTRY}/backend:${TAG}")
$([ "$TARGET" == "all" ] || [ "$TARGET" == "frontend" ] && echo " - ${REGISTRY}/frontend:${TAG}")"
git tag -a "$TAG" -m "$TAG_MESSAGE"
git push origin "$TAG"
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo " ✅ Deploy complete: ${TAG}"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
kubectl get pods -n "$NAMESPACE"