7cbb7a9ac8
ci/woodpecker/push/woodpecker Pipeline failed
1. jest.setup.js: - 添加 Request/Response/Headers 全局对象 mock - 解决 'Request is not defined' 错误 2. .eslintrc.json: - 将 jest.setup.js 添加到忽略列表 3. shared-mocks.tsx: - 添加 ArrowUp 图标 mock 4. back-to-top.test.tsx: - 重写测试使用 import 语法 - 使用 fireEvent.scroll 触发滚动事件 - 修复组件渲染测试
238 lines
5.6 KiB
Bash
Executable File
238 lines
5.6 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# 方案A: 服务重启脚本
|
|
# 用途:快速重启Docker容器和Nginx服务
|
|
|
|
set -e
|
|
|
|
# 颜色定义
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m'
|
|
|
|
# 日志函数
|
|
log_info() {
|
|
echo -e "${BLUE}[INFO]${NC} $1"
|
|
}
|
|
|
|
log_success() {
|
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
|
}
|
|
|
|
log_warning() {
|
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
|
}
|
|
|
|
log_error() {
|
|
echo -e "${RED}[ERROR]${NC} $1"
|
|
}
|
|
|
|
separator() {
|
|
echo "======================================================================"
|
|
}
|
|
|
|
# 记录日志
|
|
LOG_FILE="/tmp/service-restart-$(date +%Y%m%d_%H%M%S).log"
|
|
exec > >(tee -a "$LOG_FILE") 2>&1
|
|
|
|
separator
|
|
echo "方案A: 服务重启脚本"
|
|
echo "执行时间: $(date)"
|
|
separator
|
|
|
|
# 1. 检查当前状态
|
|
log_info "步骤1: 检查当前服务状态"
|
|
separator
|
|
|
|
echo ""
|
|
log_info "当前Docker容器状态:"
|
|
docker ps -a --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
|
|
|
|
echo ""
|
|
log_info "当前Nginx状态:"
|
|
systemctl status nginx --no-pager | head -10
|
|
|
|
echo ""
|
|
log_info "当前系统资源:"
|
|
echo "CPU和内存:"
|
|
top -bn1 | head -5
|
|
echo ""
|
|
echo "磁盘使用:"
|
|
df -h | grep -E "Filesystem|/$"
|
|
|
|
# 2. 查找docker-compose文件
|
|
log_info "步骤2: 查找docker-compose配置文件"
|
|
separator
|
|
|
|
POSSIBLE_PATHS=(
|
|
"/opt/novalon-website"
|
|
"/var/www/novalon-website"
|
|
"/home/novalon-website"
|
|
"/root/novalon-website"
|
|
"/srv/novalon-website"
|
|
"."
|
|
)
|
|
|
|
COMPOSE_FILE=""
|
|
PROJECT_DIR=""
|
|
|
|
for path in "${POSSIBLE_PATHS[@]}"; do
|
|
if [ -f "$path/docker-compose.prod.yml" ]; then
|
|
PROJECT_DIR="$path"
|
|
COMPOSE_FILE="$path/docker-compose.prod.yml"
|
|
log_success "找到docker-compose.prod.yml: $COMPOSE_FILE"
|
|
break
|
|
elif [ -f "$path/docker-compose.yml" ]; then
|
|
PROJECT_DIR="$path"
|
|
COMPOSE_FILE="$path/docker-compose.yml"
|
|
log_success "找到docker-compose.yml: $COMPOSE_FILE"
|
|
break
|
|
fi
|
|
done
|
|
|
|
if [ -z "$COMPOSE_FILE" ]; then
|
|
log_error "未找到docker-compose配置文件"
|
|
log_info "请手动指定项目目录:"
|
|
read -p "请输入项目目录路径: " PROJECT_DIR
|
|
|
|
if [ -f "$PROJECT_DIR/docker-compose.prod.yml" ]; then
|
|
COMPOSE_FILE="$PROJECT_DIR/docker-compose.prod.yml"
|
|
elif [ -f "$PROJECT_DIR/docker-compose.yml" ]; then
|
|
COMPOSE_FILE="$PROJECT_DIR/docker-compose.yml"
|
|
else
|
|
log_error "指定目录中未找到docker-compose文件"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
log_info "项目目录: $PROJECT_DIR"
|
|
log_info "配置文件: $COMPOSE_FILE"
|
|
|
|
# 3. 重启Docker容器
|
|
log_info "步骤3: 重启Docker容器"
|
|
separator
|
|
|
|
cd "$PROJECT_DIR"
|
|
|
|
echo ""
|
|
log_info "停止Docker容器..."
|
|
docker-compose -f "$COMPOSE_FILE" stop
|
|
|
|
echo ""
|
|
log_info "启动Docker容器..."
|
|
docker-compose -f "$COMPOSE_FILE" up -d
|
|
|
|
echo ""
|
|
log_info "等待服务启动(10秒)..."
|
|
sleep 10
|
|
|
|
echo ""
|
|
log_info "检查容器状态:"
|
|
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
|
|
|
|
# 检查容器是否正常运行
|
|
RUNNING_CONTAINERS=$(docker ps -q | wc -l)
|
|
STOPPED_CONTAINERS=$(docker ps -f "status=exited" -q | wc -l)
|
|
|
|
if [ "$STOPPED_CONTAINERS" -gt 0 ]; then
|
|
log_warning "发现已停止的容器:"
|
|
docker ps -f "status=exited" --format "table {{.Names}}\t{{.Status}}"
|
|
|
|
echo ""
|
|
log_info "查看容器日志:"
|
|
for container in $(docker ps -f "status=exited" -q); do
|
|
CONTAINER_NAME=$(docker inspect --format='{{.Name}}' $container | sed 's/\///')
|
|
echo ""
|
|
log_info "容器: $CONTAINER_NAME"
|
|
docker logs --tail 30 $container
|
|
done
|
|
else
|
|
log_success "所有容器运行正常"
|
|
fi
|
|
|
|
# 4. 重启Nginx
|
|
log_info "步骤4: 重启Nginx服务"
|
|
separator
|
|
|
|
echo ""
|
|
log_info "测试Nginx配置..."
|
|
if nginx -t; then
|
|
log_success "Nginx配置正确"
|
|
else
|
|
log_error "Nginx配置错误,请检查配置文件"
|
|
exit 1
|
|
fi
|
|
|
|
echo ""
|
|
log_info "重启Nginx..."
|
|
systemctl restart nginx
|
|
|
|
echo ""
|
|
log_info "检查Nginx状态:"
|
|
systemctl status nginx --no-pager | head -15
|
|
|
|
if systemctl is-active --quiet nginx; then
|
|
log_success "Nginx运行正常"
|
|
else
|
|
log_error "Nginx启动失败"
|
|
journalctl -u nginx --no-pager | tail -20
|
|
exit 1
|
|
fi
|
|
|
|
# 5. 验证服务
|
|
log_info "步骤5: 验证服务状态"
|
|
separator
|
|
|
|
echo ""
|
|
log_info "测试本地应用连接..."
|
|
if curl -I --connect-timeout 5 http://localhost:3000 2>&1 | grep -q "HTTP"; then
|
|
log_success "应用服务响应正常"
|
|
curl -I http://localhost:3000 2>&1 | head -10
|
|
else
|
|
log_error "应用服务无响应"
|
|
log_info "查看应用日志:"
|
|
docker logs --tail 50 $(docker ps -q | head -1)
|
|
fi
|
|
|
|
echo ""
|
|
log_info "检查端口监听:"
|
|
netstat -tlnp | grep -E ":(3000|80|443)" || ss -tlnp | grep -E ":(3000|80|443)"
|
|
|
|
echo ""
|
|
log_info "测试外部访问..."
|
|
if curl -I --connect-timeout 10 https://novalon.cn 2>&1 | grep -q "HTTP"; then
|
|
log_success "外部访问正常"
|
|
curl -I https://novalon.cn 2>&1 | head -10
|
|
else
|
|
log_warning "外部访问仍可能需要等待DNS传播或CDN刷新"
|
|
fi
|
|
|
|
# 6. 显示最终状态
|
|
separator
|
|
log_info "服务重启完成"
|
|
separator
|
|
|
|
echo ""
|
|
log_success "执行摘要:"
|
|
echo " ✅ Docker容器已重启"
|
|
echo " ✅ Nginx服务已重启"
|
|
echo " ✅ 服务状态已验证"
|
|
|
|
echo ""
|
|
log_info "详细日志已保存到: $LOG_FILE"
|
|
|
|
echo ""
|
|
log_warning "后续建议:"
|
|
echo " 1. 监控服务状态: watch -n 5 'docker ps && systemctl status nginx'"
|
|
echo " 2. 查看实时日志: docker logs -f \$(docker ps -q | head -1)"
|
|
echo " 3. 检查应用日志: tail -f /var/log/nginx/error.log"
|
|
echo " 4. 验证外部访问: curl -I https://novalon.cn"
|
|
|
|
echo ""
|
|
log_info "如果问题仍然存在,请运行完整诊断:"
|
|
echo " /tmp/remote-server-diagnosis.sh --full"
|
|
|
|
separator
|