Files
java-template/client-deployment/prepare-client-deployment.sh
2025-08-14 08:11:03 +08:00

380 lines
10 KiB
Bash
Executable File

#!/bin/bash
# 客户部署包准备脚本 - 确保Linux兼容性
# 在每次提交客户部署包前运行此脚本
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# 日志函数
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"; }
log_step() { echo -e "${CYAN}[STEP]${NC} $1"; }
# 脚本开始
echo "🚀 客户部署包准备工具"
echo "=================================="
echo "正在准备Linux兼容的客户部署包..."
echo ""
# 检查必需文件
check_required_files() {
log_step "1. 检查必需文件..."
required_files=(
"docker-compose.yml"
"deploy-client.sh"
"wait-for-it.sh"
"custom-config.env"
"validate-config.sh"
"fix-volume-mounts.sh"
)
missing_files=0
for file in "${required_files[@]}"; do
if [ -f "$file" ]; then
log_success "✅ $file 存在"
else
log_error "❌ $file 缺失"
missing_files=$((missing_files + 1))
fi
done
if [ $missing_files -gt 0 ]; then
log_error "缺失 $missing_files 个必需文件,请补充后重试"
exit 1
fi
log_success "所有必需文件检查通过"
}
# 运行Linux兼容性修复
run_compatibility_fix() {
log_step "2. 运行Linux兼容性修复..."
if [ -f "fix-linux-compatibility.sh" ]; then
chmod +x fix-linux-compatibility.sh
./fix-linux-compatibility.sh
log_success "Linux兼容性修复完成"
else
log_warning "fix-linux-compatibility.sh 不存在,跳过兼容性修复"
fi
}
# 验证脚本语法
validate_syntax() {
log_step "3. 验证脚本语法..."
# 查找所有shell脚本
shell_scripts=$(find . -name "*.sh" -type f 2>/dev/null | grep -v ".bak" || true)
syntax_errors=0
for script in $shell_scripts; do
if [ -f "$script" ]; then
if bash -n "$script" 2>/dev/null; then
log_info "✅ $script 语法正确"
else
log_error "❌ $script 语法错误:"
bash -n "$script" 2>&1 | head -3
syntax_errors=$((syntax_errors + 1))
fi
fi
done
if [ $syntax_errors -gt 0 ]; then
log_error "发现 $syntax_errors 个脚本语法错误,请修复后重试"
exit 1
fi
log_success "所有脚本语法验证通过"
}
# 测试关键功能
test_key_functions() {
log_step "4. 测试关键功能..."
# 测试配置文件加载
if [ -f "custom-config.env" ]; then
if . ./custom-config.env 2>/dev/null; then
log_success "✅ 配置文件加载测试通过"
else
log_error "❌ 配置文件加载失败"
exit 1
fi
fi
# 测试wait-for-it.sh基本功能
if [ -f "wait-for-it.sh" ] && [ -x "wait-for-it.sh" ]; then
# 测试参数解析
if ./wait-for-it.sh --help >/dev/null 2>&1; then
log_success "✅ wait-for-it.sh 帮助功能正常"
else
log_warning "⚠️ wait-for-it.sh 帮助功能异常"
fi
# 测试快速连接测试(使用google DNS)
timeout 5 ./wait-for-it.sh 8.8.8.8:53 -t 2 >/dev/null 2>&1 && \
log_success "✅ wait-for-it.sh 网络连接测试通过" || \
log_warning "⚠️ wait-for-it.sh 网络连接测试超时(可能正常)"
else
log_error "❌ wait-for-it.sh 不存在或无执行权限"
exit 1
fi
log_success "关键功能测试完成"
}
# 检查Docker配置
validate_docker_config() {
log_step "5. 验证Docker配置..."
if [ -f "docker-compose.yml" ]; then
# 检查docker-compose.yml语法
if docker-compose -f docker-compose.yml config >/dev/null 2>&1; then
log_success "✅ docker-compose.yml 语法正确"
else
log_error "❌ docker-compose.yml 语法错误:"
docker-compose -f docker-compose.yml config 2>&1 | head -5
exit 1
fi
# 检查是否包含wait-for-it.sh挂载
if grep -q "wait-for-it.sh" docker-compose.yml; then
log_success "✅ docker-compose.yml 包含wait-for-it.sh挂载"
else
log_warning "⚠️ docker-compose.yml 未包含wait-for-it.sh挂载"
fi
# 检查镜像版本一致性
mysql_count=$(grep -c "ljwx-mysql:" docker-compose.yml || echo "0")
if [ "$mysql_count" -eq 1 ]; then
log_success "✅ MySQL镜像版本配置正确"
else
log_warning "⚠️ MySQL镜像版本配置可能有问题"
fi
else
log_error "❌ docker-compose.yml 不存在"
exit 1
fi
log_success "Docker配置验证完成"
}
# 生成部署包信息
generate_deployment_info() {
log_step "6. 生成部署包信息..."
cat > DEPLOYMENT_INFO.md << EOF
# 客户部署包信息
## 生成信息
- 生成时间: $(date)
- 生成系统: $(uname -s) $(uname -r)
- 脚本版本: 1.0.0
## 包含文件
$(find . -type f -name "*.sh" -o -name "*.yml" -o -name "*.env" -o -name "*.py" -o -name "*.js" -o -name "*.svg" -o -name "*.sql" | sort)
## Linux兼容性
- ✅ 文件格式: Unix (LF)
- ✅ 脚本权限: 已设置
- ✅ Shebang标准化: #!/bin/bash
- ✅ 语法兼容性: 已验证
- ✅ 命令兼容性: 已修复
## 支持的Linux发行版
- CentOS 7+
- Ubuntu 18.04+
- Debian 9+
- RHEL 7+
- Amazon Linux 2
## 部署步骤
1. 上传部署包到目标服务器
2. 解压部署包
3. 运行 \`./test-linux-compatibility.sh\` 进行兼容性测试
4. 修改 \`custom-config.env\` 配置文件
5. 运行 \`./deploy-client.sh\` 开始部署
## 故障排除
- 如遇权限问题,请检查SELinux设置
- 如遇网络问题,请检查防火墙配置
- 如遇Docker问题,请确保Docker和docker-compose已正确安装
## 技术支持
如有问题,请联系技术支持团队。
EOF
log_success "部署包信息已生成: DEPLOYMENT_INFO.md"
}
# 创建快速测试脚本
create_quick_test() {
log_step "7. 创建快速测试脚本..."
cat > quick-test.sh << 'EOF'
#!/bin/bash
# 快速测试脚本 - 验证部署包基本功能
echo "🧪 快速功能测试"
echo "================"
# 测试脚本权限
echo "1. 测试脚本权限..."
if [ -x "deploy-client.sh" ] && [ -x "wait-for-it.sh" ]; then
echo "✅ 关键脚本权限正确"
else
echo "❌ 脚本权限异常"
exit 1
fi
# 测试配置文件
echo "2. 测试配置文件..."
if [ -f "custom-config.env" ] && . ./custom-config.env 2>/dev/null; then
echo "✅ 配置文件可正常加载"
else
echo "❌ 配置文件加载失败"
exit 1
fi
# 测试Docker配置
echo "3. 测试Docker配置..."
if docker-compose -f docker-compose.yml config >/dev/null 2>&1; then
echo "✅ Docker Compose配置正确"
else
echo "❌ Docker Compose配置错误"
exit 1
fi
# 测试wait-for-it.sh
echo "4. 测试wait-for-it.sh..."
if timeout 3 ./wait-for-it.sh 127.0.0.1:22 -t 1 >/dev/null 2>&1; then
echo "✅ wait-for-it.sh 功能正常"
else
echo "⚠️ wait-for-it.sh 测试超时(可能正常)"
fi
echo ""
echo "✅ 快速测试完成,部署包可用!"
EOF
chmod +x quick-test.sh
log_success "快速测试脚本已创建: quick-test.sh"
}
# 清理临时文件
cleanup_temp_files() {
log_step "8. 清理临时文件..."
# 删除备份文件
find . -name "*.bak.*" -type f -delete 2>/dev/null || true
# 删除临时测试文件
rm -f test-temp-* 2>/dev/null || true
log_success "临时文件清理完成"
}
# 生成检查清单
generate_checklist() {
log_step "9. 生成部署前检查清单..."
cat > DEPLOYMENT_CHECKLIST.md << EOF
# 客户部署前检查清单
## 服务器环境检查
- [ ] 服务器系统版本: CentOS 7+/Ubuntu 18.04+
- [ ] Docker 已安装且版本 >= 19.03
- [ ] docker-compose 已安装且版本 >= 1.25
- [ ] 服务器可访问互联网(用于拉取镜像)
- [ ] 防火墙已开放必要端口: 8080, 8001, 9998
- [ ] 磁盘空间充足 (建议 >= 20GB)
## 部署包检查
- [ ] 所有脚本文件具有执行权限
- [ ] wait-for-it.sh 功能正常
- [ ] docker-compose.yml 语法正确
- [ ] 配置文件格式正确
## 配置文件检查
- [ ] custom-config.env 已根据客户需求修改
- [ ] 数据库密码已设置
- [ ] 服务器IP地址已配置
- [ ] 大屏标题已自定义
- [ ] Logo文件已准备(如需要)
## 部署步骤
1. [ ] 运行 ./quick-test.sh 验证部署包
2. [ ] 运行 ./test-linux-compatibility.sh 测试兼容性
3. [ ] 修改配置文件
4. [ ] 运行 ./deploy-client.sh 开始部署
5. [ ] 验证服务启动状态
6. [ ] 测试各功能模块
## 验收标准
- [ ] 管理端可正常访问 (http://服务器IP:8080)
- [ ] 大屏端可正常访问 (http://服务器IP:8001)
- [ ] API接口响应正常 (http://服务器IP:9998/actuator/health)
- [ ] 数据库连接正常
- [ ] Redis缓存正常
- [ ] 日志输出正常
## 故障排除
- 如遇到权限问题,检查SELinux设置
- 如遇到网络问题,检查防火墙配置
- 如遇到启动问题,查看容器日志
EOF
log_success "部署检查清单已生成: DEPLOYMENT_CHECKLIST.md"
}
# 主执行流程
main() {
check_required_files
run_compatibility_fix
validate_syntax
test_key_functions
validate_docker_config
generate_deployment_info
create_quick_test
cleanup_temp_files
generate_checklist
# 运行容器权限修复
echo ""
log_step "10. 运行容器权限修复..."
if [ -f "fix-container-permissions.sh" ]; then
./fix-container-permissions.sh
else
log_warning "fix-container-permissions.sh 不存在,跳过权限修复"
fi
echo ""
log_success "🎉 客户部署包准备完成!"
echo ""
echo "生成的文件:"
echo "- DEPLOYMENT_INFO.md (部署包信息)"
echo "- DEPLOYMENT_CHECKLIST.md (部署检查清单)"
echo "- quick-test.sh (快速测试脚本)"
echo "- test-linux-compatibility.sh (兼容性测试)"
echo "- linux-compatibility-report.txt (兼容性报告)"
echo ""
echo "下一步操作:"
echo "1. 运行 ./quick-test.sh 进行最终验证"
echo "2. 打包部署文件发送给客户"
echo "3. 指导客户按照 DEPLOYMENT_CHECKLIST.md 进行部署"
echo ""
}
# 执行主流程
main "$@"