Some checks failed
CD Pipeline / deploy (push) Failing after 59s
- 建立 Gitea Actions CD pipeline (.gitea/workflows/cd.yaml) - 部署模式: rsync Python 檔案至 188 → docker restart (volume mount) - Dockerfile/requirements 變動時自動重建 Docker image - 部署通知: Telegram (開始/成功/失敗) - 健康檢查: https://mo.wooo.work/health (最多 5 次重試) - 同步最新 CLAUDE.md / ADR-008 / memory (2026-04-19) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
208 lines
5.8 KiB
Bash
Executable File
208 lines
5.8 KiB
Bash
Executable File
#!/bin/bash
|
|
# =============================================================================
|
|
# WOOO TECH - Momo Pro System
|
|
# GCP 一鍵部署腳本
|
|
# 用法: ./deploy.sh [選項]
|
|
# --full 完整部署(含資料庫初始化)
|
|
# --update 僅更新應用(保留資料庫)
|
|
# --restart 僅重啟服務
|
|
# =============================================================================
|
|
|
|
set -e
|
|
|
|
# 顏色
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m'
|
|
|
|
# 配置
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_DIR="$(dirname "$(dirname "$SCRIPT_DIR")")"
|
|
NAMESPACE="momo"
|
|
IMAGE_NAME="momo-pro-system"
|
|
IMAGE_TAG="latest"
|
|
|
|
# 函數
|
|
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
|
|
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
|
|
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
|
|
log_error() { echo -e "${RED}[ERROR]${NC} $1"; exit 1; }
|
|
|
|
# =============================================================================
|
|
# 檢查環境
|
|
# =============================================================================
|
|
check_environment() {
|
|
log_info "檢查環境..."
|
|
|
|
# K3s
|
|
if ! command -v kubectl &> /dev/null; then
|
|
log_error "kubectl 未安裝,請先安裝 K3s"
|
|
fi
|
|
|
|
# Docker
|
|
if ! command -v docker &> /dev/null; then
|
|
log_error "Docker 未安裝"
|
|
fi
|
|
|
|
log_success "環境檢查通過"
|
|
}
|
|
|
|
# =============================================================================
|
|
# 建構映像
|
|
# =============================================================================
|
|
build_image() {
|
|
log_info "建構 Docker 映像..."
|
|
|
|
cd "$PROJECT_DIR"
|
|
|
|
# 建構映像
|
|
docker build -t ${IMAGE_NAME}:${IMAGE_TAG} .
|
|
|
|
log_success "映像建構完成: ${IMAGE_NAME}:${IMAGE_TAG}"
|
|
}
|
|
|
|
# =============================================================================
|
|
# 匯入映像到 K3s
|
|
# =============================================================================
|
|
import_image() {
|
|
log_info "匯入映像到 K3s containerd..."
|
|
|
|
# 儲存映像
|
|
docker save ${IMAGE_NAME}:${IMAGE_TAG} -o /tmp/${IMAGE_NAME}.tar
|
|
|
|
# 匯入到 K3s
|
|
sudo k3s ctr images import /tmp/${IMAGE_NAME}.tar
|
|
|
|
# 清理
|
|
rm -f /tmp/${IMAGE_NAME}.tar
|
|
|
|
log_success "映像匯入完成"
|
|
}
|
|
|
|
# =============================================================================
|
|
# 部署 K8s 資源
|
|
# =============================================================================
|
|
deploy_k8s() {
|
|
log_info "部署 K8s 資源..."
|
|
|
|
cd "$SCRIPT_DIR"
|
|
|
|
# 建立 namespace
|
|
kubectl apply -f 00-namespace.yaml
|
|
|
|
# 部署 secrets 和 configmap
|
|
kubectl apply -f 01-secrets.yaml
|
|
kubectl apply -f 02-configmap.yaml
|
|
|
|
# 部署 PostgreSQL
|
|
kubectl apply -f 03-postgres.yaml
|
|
|
|
# 等待 PostgreSQL 就緒
|
|
log_info "等待 PostgreSQL 就緒..."
|
|
kubectl wait --for=condition=ready pod -l app=momo-postgres -n $NAMESPACE --timeout=120s || true
|
|
|
|
# 部署應用
|
|
kubectl apply -f 04-momo-app.yaml
|
|
kubectl apply -f 05-scheduler.yaml
|
|
|
|
log_success "K8s 資源部署完成"
|
|
}
|
|
|
|
# =============================================================================
|
|
# 重啟服務
|
|
# =============================================================================
|
|
restart_services() {
|
|
log_info "重啟服務..."
|
|
|
|
kubectl rollout restart deployment/momo-app -n $NAMESPACE
|
|
kubectl rollout restart deployment/momo-scheduler -n $NAMESPACE
|
|
|
|
# 等待就緒
|
|
log_info "等待服務就緒..."
|
|
kubectl rollout status deployment/momo-app -n $NAMESPACE --timeout=180s
|
|
|
|
log_success "服務重啟完成"
|
|
}
|
|
|
|
# =============================================================================
|
|
# 健康檢查
|
|
# =============================================================================
|
|
health_check() {
|
|
log_info "執行健康檢查..."
|
|
|
|
# 查看 Pod 狀態
|
|
echo ""
|
|
kubectl get pods -n $NAMESPACE -o wide
|
|
echo ""
|
|
|
|
# 檢查服務
|
|
local app_pod=$(kubectl get pod -n $NAMESPACE -l app=momo-app -o jsonpath='{.items[0].metadata.name}' 2>/dev/null)
|
|
|
|
if [[ -n "$app_pod" ]]; then
|
|
local health=$(kubectl exec -n $NAMESPACE $app_pod -- curl -s http://localhost:80/health 2>/dev/null || echo "error")
|
|
if echo "$health" | grep -q "healthy"; then
|
|
log_success "應用健康檢查通過"
|
|
else
|
|
log_warn "應用健康檢查未通過"
|
|
fi
|
|
fi
|
|
|
|
log_success "健康檢查完成"
|
|
}
|
|
|
|
# =============================================================================
|
|
# 主程式
|
|
# =============================================================================
|
|
main() {
|
|
echo ""
|
|
echo "=============================================="
|
|
echo " MOMO Pro System - GCP 部署"
|
|
echo " $(date '+%Y-%m-%d %H:%M:%S')"
|
|
echo "=============================================="
|
|
echo ""
|
|
|
|
local mode="${1:-full}"
|
|
|
|
case "$mode" in
|
|
--full|full)
|
|
check_environment
|
|
build_image
|
|
import_image
|
|
deploy_k8s
|
|
restart_services
|
|
health_check
|
|
;;
|
|
--update|update)
|
|
check_environment
|
|
build_image
|
|
import_image
|
|
restart_services
|
|
health_check
|
|
;;
|
|
--restart|restart)
|
|
restart_services
|
|
health_check
|
|
;;
|
|
*)
|
|
echo "用法: $0 [選項]"
|
|
echo " --full 完整部署(預設)"
|
|
echo " --update 更新應用"
|
|
echo " --restart 重啟服務"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
echo ""
|
|
echo "=============================================="
|
|
echo -e " ${GREEN}部署完成!${NC}"
|
|
echo "=============================================="
|
|
echo ""
|
|
echo "查看 Pod: kubectl get pods -n momo"
|
|
echo "查看日誌: kubectl logs -f deployment/momo-app -n momo"
|
|
echo ""
|
|
}
|
|
|
|
main "$@"
|