refactor: simplify docker-compose deploy script for direct Spug execution
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# Spug Docker Compose 自动部署脚本
|
# Spug Docker Compose 自动部署脚本 - 直接粘贴到 Spug 执行
|
||||||
# 用途:使用 docker-compose 快速部署医院绩效考核系统
|
# 用途:使用 docker-compose 快速部署医院绩效考核系统
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
@@ -26,104 +26,88 @@ export FRONTEND_PORT="${FRONTEND_PORT:-80}"
|
|||||||
export DOCKER_TAG="${DOCKER_TAG}"
|
export DOCKER_TAG="${DOCKER_TAG}"
|
||||||
|
|
||||||
# 日志配置
|
# 日志配置
|
||||||
LOG_FILE="${LOG_FILE:-/var/log/spug/deploy-docker-compose.log}"
|
LOG_FILE="/tmp/spug-deploy-$(date +%Y%m%d_%H%M%S).log"
|
||||||
mkdir -p /var/log/spug 2>/dev/null || true
|
|
||||||
|
|
||||||
# ==================== 工具函数 ====================
|
echo "========================================"
|
||||||
log() {
|
echo "Spug Docker Compose 自动部署开始"
|
||||||
local level=$1
|
echo "项目目录:${PROJECT_DIR}"
|
||||||
shift
|
echo "Git 分支:${GIT_BRANCH}"
|
||||||
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
|
echo "========================================"
|
||||||
echo "[${timestamp}] [${level}] $*" | tee -a "${LOG_FILE}"
|
|
||||||
}
|
|
||||||
|
|
||||||
info() { log "INFO" "$@"; }
|
# ================= Step 1: 更新代码 =================
|
||||||
error() { log "ERROR" "$@"; }
|
echo "========== 更新代码 =========="
|
||||||
success() { log "SUCCESS" "$@"; }
|
cd "${PROJECT_DIR}"
|
||||||
|
|
||||||
# ==================== 主流程 ====================
|
if [ ! -d ".git" ]; then
|
||||||
main() {
|
echo "首次部署,克隆仓库..."
|
||||||
info "========================================"
|
git clone "${GIT_REPO}" .
|
||||||
info "Spug Docker Compose 自动部署开始"
|
git checkout "${GIT_BRANCH}"
|
||||||
info "项目目录:${PROJECT_DIR}"
|
else
|
||||||
info "Git 分支:${GIT_BRANCH}"
|
echo "更新现有代码..."
|
||||||
info "========================================"
|
git fetch origin "${GIT_BRANCH}"
|
||||||
|
git reset --hard "origin/${GIT_BRANCH}"
|
||||||
|
git clean -fd
|
||||||
|
fi
|
||||||
|
|
||||||
# 进入项目目录
|
commit_hash=$(git rev-parse --short HEAD)
|
||||||
cd "${PROJECT_DIR}"
|
commit_msg=$(git log -1 --pretty=format:"%s")
|
||||||
|
echo "✅ 代码更新完成,当前版本:${commit_hash} - ${commit_msg}"
|
||||||
|
|
||||||
# 更新代码
|
# ================= Step 2: 停止旧容器 =================
|
||||||
info "========== 更新代码 =========="
|
echo "========== 停止旧服务 =========="
|
||||||
if [ ! -d ".git" ]; then
|
if docker-compose ps &>/dev/null; then
|
||||||
info "首次部署,克隆仓库..."
|
docker-compose down || true
|
||||||
git clone "${GIT_REPO}" .
|
echo "✅ 旧服务已停止"
|
||||||
git checkout "${GIT_BRANCH}"
|
else
|
||||||
|
echo "未发现运行中的服务"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ================= Step 3: 构建 Docker 镜像 =================
|
||||||
|
echo "========== 构建 Docker 镜像 =========="
|
||||||
|
docker-compose build --no-cache
|
||||||
|
echo "✅ Docker 镜像构建完成"
|
||||||
|
|
||||||
|
# ================= Step 4: 启动新容器 =================
|
||||||
|
echo "========== 启动新容器 =========="
|
||||||
|
docker-compose up -d
|
||||||
|
echo "✅ 容器启动成功"
|
||||||
|
|
||||||
|
# ================= Step 5: 等待并健康检查 =================
|
||||||
|
echo "========== 执行健康检查 =========="
|
||||||
|
echo "等待服务启动..."
|
||||||
|
sleep 15
|
||||||
|
|
||||||
|
max_attempts=10
|
||||||
|
attempt=1
|
||||||
|
|
||||||
|
while [ $attempt -le $max_attempts ]; do
|
||||||
|
if curl -f -s "http://localhost:${BACKEND_PORT}/api/v1/health" > /dev/null 2>&1; then
|
||||||
|
echo "✅ 后端 API 健康检查通过"
|
||||||
|
break
|
||||||
else
|
else
|
||||||
info "更新现有代码..."
|
if [ $attempt -eq $max_attempts ]; then
|
||||||
git fetch origin "${GIT_BRANCH}"
|
echo "❌ 后端 API 健康检查失败"
|
||||||
git reset --hard "origin/${GIT_BRANCH}"
|
echo "最近日志如下:"
|
||||||
git clean -fd
|
docker-compose logs backend | tail -n 50
|
||||||
fi
|
exit 1
|
||||||
|
|
||||||
commit_hash=$(git rev-parse --short HEAD)
|
|
||||||
commit_msg=$(git log -1 --pretty=format:"%s")
|
|
||||||
success "✓ 代码更新完成,当前版本:${commit_hash} - ${commit_msg}"
|
|
||||||
|
|
||||||
# 停止旧容器
|
|
||||||
info "========== 停止旧服务 =========="
|
|
||||||
if docker-compose ps &>/dev/null; then
|
|
||||||
docker-compose down || true
|
|
||||||
success "✓ 旧服务已停止"
|
|
||||||
else
|
|
||||||
info "未发现运行中的服务"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 构建镜像
|
|
||||||
info "========== 构建 Docker 镜像 =========="
|
|
||||||
docker-compose build --no-cache
|
|
||||||
|
|
||||||
# 启动服务
|
|
||||||
info "========== 启动服务 =========="
|
|
||||||
docker-compose up -d
|
|
||||||
|
|
||||||
# 等待服务启动
|
|
||||||
info "等待服务启动..."
|
|
||||||
sleep 15
|
|
||||||
|
|
||||||
# 健康检查
|
|
||||||
info "========== 执行健康检查 =========="
|
|
||||||
max_attempts=10
|
|
||||||
attempt=1
|
|
||||||
|
|
||||||
while [ $attempt -le $max_attempts ]; do
|
|
||||||
if curl -f -s "http://localhost:${BACKEND_PORT}/api/v1/health" > /dev/null 2>&1; then
|
|
||||||
success "✓ 后端 API 健康检查通过"
|
|
||||||
break
|
|
||||||
else
|
|
||||||
if [ $attempt -eq $max_attempts ]; then
|
|
||||||
error "✗ 后端 API 健康检查失败"
|
|
||||||
docker-compose logs backend
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
info "后端服务未就绪,等待... (${attempt}/${max_attempts})"
|
|
||||||
sleep 5
|
|
||||||
attempt=$((attempt + 1))
|
|
||||||
fi
|
fi
|
||||||
done
|
echo "后端服务未就绪,等待... (${attempt}/${max_attempts})"
|
||||||
|
sleep 5
|
||||||
|
attempt=$((attempt + 1))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
# 查看状态
|
# ================= Step 6: 查看状态 =================
|
||||||
info "========== 服务状态 =========="
|
echo "========== 服务状态 =========="
|
||||||
docker-compose ps
|
docker-compose ps
|
||||||
|
|
||||||
# 清理旧镜像
|
# ================= Step 7: 清理 =================
|
||||||
info "========== 清理旧镜像 =========="
|
echo "========== 清理旧镜像 =========="
|
||||||
docker image prune -f
|
docker image prune -f
|
||||||
|
echo "✅ 清理完成"
|
||||||
|
|
||||||
info "========================================"
|
echo "========================================"
|
||||||
success "🎉 Docker Compose 部署成功完成!"
|
echo "🎉 Docker Compose 部署成功完成!"
|
||||||
info "后端地址:http://localhost:${BACKEND_PORT}"
|
echo "后端地址:http://localhost:${BACKEND_PORT}"
|
||||||
info "前端地址:http://localhost:${FRONTEND_PORT}"
|
echo "前端地址:http://localhost:${FRONTEND_PORT}"
|
||||||
info "========================================"
|
echo "========================================"
|
||||||
}
|
|
||||||
|
|
||||||
main "$@"
|
|
||||||
|
|||||||
Reference in New Issue
Block a user