feat: 添加 Gitea webhook 自动部署功能
- 新增独立的 webhook 服务 (Go, 端口 9000) - HMAC-SHA256 签名验证 - 零停机热更新部署 - 自动清理旧镜像 - 完整配置文档 WEBHOOK_SETUP.md - 精简 README 版本历史为表格形式
This commit is contained in:
116
deploy.sh
Normal file
116
deploy.sh
Normal file
@@ -0,0 +1,116 @@
|
||||
#!/bin/bash
|
||||
|
||||
# BillAI 自动部署脚本
|
||||
# 此脚本由 Gitea webhook 触发,自动执行 git pull 并重新构建部署
|
||||
|
||||
set -e
|
||||
|
||||
REPO_ROOT="/app"
|
||||
LOG_FILE="/tmp/billai_deploy.log"
|
||||
|
||||
# 颜色输出
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
log() {
|
||||
echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1" | tee -a "$LOG_FILE"
|
||||
}
|
||||
|
||||
error() {
|
||||
echo -e "${RED}[错误]${NC} $1" | tee -a "$LOG_FILE"
|
||||
exit 1
|
||||
}
|
||||
|
||||
success() {
|
||||
echo -e "${GREEN}[成功]${NC} $1" | tee -a "$LOG_FILE"
|
||||
}
|
||||
|
||||
log "=========================================="
|
||||
log "🚀 BillAI 自动部署开始"
|
||||
log "=========================================="
|
||||
|
||||
# 进入仓库目录
|
||||
cd "$REPO_ROOT" || error "无法进入仓库目录: $REPO_ROOT"
|
||||
log "📁 工作目录: $(pwd)"
|
||||
|
||||
# 拉取最新代码
|
||||
log "📥 正在拉取最新代码..."
|
||||
if ! git fetch origin; then
|
||||
error "git fetch 失败"
|
||||
fi
|
||||
|
||||
if ! git reset --hard origin/master; then
|
||||
error "git reset 失败"
|
||||
fi
|
||||
|
||||
success "代码已更新"
|
||||
|
||||
# 显示当前提交信息
|
||||
log "📝 当前提交:"
|
||||
git log --oneline -1
|
||||
|
||||
# 检查 docker-compose 是否存在
|
||||
if [ ! -f "docker-compose.yaml" ]; then
|
||||
error "docker-compose.yaml 不存在"
|
||||
fi
|
||||
|
||||
log "🐳 开始热更新部署(不停机)..."
|
||||
|
||||
# 定义需要重新部署的服务(排除 webhook 自身,否则会自杀)
|
||||
SERVICES="web server analyzer"
|
||||
|
||||
# 拉取基础镜像更新
|
||||
log "📦 检查基础镜像更新..."
|
||||
docker-compose pull mongodb mongo-express || true
|
||||
|
||||
# 热更新:重新构建并替换容器(不停止旧服务,直接替换)
|
||||
log "🔨 热更新服务(构建 + 替换)..."
|
||||
if ! docker-compose up -d --build --force-recreate --no-deps $SERVICES; then
|
||||
error "Docker 热更新失败"
|
||||
fi
|
||||
|
||||
# 清理旧的未使用镜像
|
||||
log "🧹 清理旧镜像..."
|
||||
docker image prune -f || true
|
||||
|
||||
# 等待服务启动
|
||||
log "⏳ 等待服务启动..."
|
||||
sleep 5
|
||||
|
||||
# 检查服务健康状态
|
||||
log "🏥 检查服务健康状态..."
|
||||
for i in {1..30}; do
|
||||
if curl -f http://localhost:8080/health > /dev/null 2>&1; then
|
||||
success "后端服务已启动"
|
||||
break
|
||||
fi
|
||||
if [ $i -eq 30 ]; then
|
||||
error "后端服务启动超时"
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
|
||||
for i in {1..30}; do
|
||||
if curl -f http://localhost:3000 > /dev/null 2>&1; then
|
||||
success "前端服务已启动"
|
||||
break
|
||||
fi
|
||||
if [ $i -eq 30 ]; then
|
||||
error "前端服务启动超时"
|
||||
fi
|
||||
sleep 1
|
||||
done
|
||||
|
||||
log "=========================================="
|
||||
success "🎉 部署完成"
|
||||
log "=========================================="
|
||||
log "⏰ 完成时间: $(date +'%Y-%m-%d %H:%M:%S')"
|
||||
log "✅ 所有服务已启动并正常运行"
|
||||
log ""
|
||||
log "📍 访问地址:"
|
||||
log " 前端: http://localhost:3000"
|
||||
log " 后端: http://localhost:8080"
|
||||
log ""
|
||||
Reference in New Issue
Block a user