#!/usr/bin/env bash # Gitea push 후 chatbot.exdev.co.kr 배포 완료 대기 # - UI 응답 또는 배포 로그의 "배포 완료" 확인 # - "배포 실패"/컴파일 오류는 즉시 종료 (900s 무의미 대기 방지) set -euo pipefail EXDEV_SSH="${EXDEV_SSH:-aidev@chatbot.exdev.co.kr}" DEPLOY_LOG="${DEPLOY_LOG:-/Volumes/ADATA/logs/deploy/exAichatbot_agent.log}" PUBLIC_URL="${PUBLIC_BASE_URL:-https://chatbot.exdev.co.kr}/chatbot/ai/" MAX_WAIT="${DEPLOY_WAIT_SEC:-900}" log() { echo "[wait-deploy] $*"; } ssh_cmd() { ssh -o BatchMode=yes -o ConnectTimeout=15 "${EXDEV_SSH}" "$@" } if ! ssh_cmd "test -f '${DEPLOY_LOG}'" 2>/dev/null; then log "배포 로그 없음 — SSH로 deploy 스크립트 직접 실행" ssh_cmd "bash /Volumes/ADATA/git/deploy-exAichatbot_agent.sh" || true fi # 대기 시작 시점의 로그 길이 — 이후 새로 찍힌 줄만 성공/실패 판정에 사용 LOG_BASE_BYTES="$(ssh_cmd "wc -c < '${DEPLOY_LOG}' 2>/dev/null || echo 0" | tr -d '[:space:]')" LOG_BASE_BYTES="${LOG_BASE_BYTES:-0}" log "배포 완료 대기 (최대 ${MAX_WAIT}s) — ${EXDEV_SSH}" start_ts="$(date +%s)" deadline=$((start_ts + MAX_WAIT)) new_log_tail() { ssh_cmd "tail -c +$((LOG_BASE_BYTES + 1)) '${DEPLOY_LOG}' 2>/dev/null | tail -80" || true } while (( $(date +%s) < deadline )); do recent="$(new_log_tail)" # 신규 로그에 실패 마커가 있으면 즉시 종료 if echo "${recent}" | grep -qE '\[ERROR\] 배포 실패|ERROR: chatbotApi 컴파일 실패|BUILD FAILED|\[ERROR\] 다른 배포 진행 중'; then log "⚠️ 원격 배포 실패 감지 — 최근 로그:" echo "${recent}" | tail -40 exit 1 fi if curl -sf --max-time 5 "${PUBLIC_URL}" 2>/dev/null | grep -q 'data-chatbot-app'; then # UI 살아있어도, 이번 배포가 아직 실패로 끝났으면 성공으로 치지 않음 if echo "${recent}" | grep -qE '\[ERROR\] 배포 실패|ERROR: chatbotApi 컴파일 실패|BUILD FAILED'; then log "⚠️ UI는 응답하나 이번 배포 로그에 실패가 있습니다" echo "${recent}" | tail -40 exit 1 fi if echo "${recent}" | grep -q '배포 완료'; then log "✅ UI 응답 + 배포 완료 로그: ${PUBLIC_URL}" ssh_cmd "tail -8 '${DEPLOY_LOG}'" 2>/dev/null || true exit 0 fi # start-only 직후 UI 가 이전 빌드로 살아 있을 수 있음 — 신규 성공 로그를 우선 if echo "${recent}" | grep -q '배포 시작'; then : else log "✅ UI 응답: ${PUBLIC_URL}" ssh_cmd "tail -8 '${DEPLOY_LOG}'" 2>/dev/null || true exit 0 fi fi if echo "${recent}" | grep -q '배포 완료'; then last_line="$(ssh_cmd "tail -1 '${DEPLOY_LOG}'" 2>/dev/null || true)" if [[ "${last_line}" == *"배포 완료"* ]] || [[ "${last_line}" == *"락 해제"* ]]; then # 성공 후 trap 이 락 해제를 찍을 수 있음 if echo "${recent}" | grep -qE '\[ERROR\] 배포 실패|BUILD FAILED'; then log "⚠️ 배포 실패 로그 감지" echo "${recent}" | tail -40 exit 1 fi log "✅ 배포 로그 확인" ssh_cmd "tail -8 '${DEPLOY_LOG}'" 2>/dev/null || true exit 0 fi fi sleep 5 done log "⚠️ 배포 대기 타임아웃 — 로그 확인: ssh ${EXDEV_SSH} tail -50 ${DEPLOY_LOG}" new_log_tail | tail -40 exit 1