#!/bin/bash # ============================================================================== # 部署脚本 - Rust Backend (支持编译模式选择) # ============================================================================== # --- 1. 配置 --- # 项目名称 PROJECT_NAME="rust-backend" # 远程服务器信息 REMOTE_USER="root" REMOTE_HOST="1panel-server" REMOTE_DIR="/root/rust/rust_backend" # 远程服务名称 (用于 systemctl restart) SERVICE_NAME="rust-backend.service" # --- 2. 脚本初始化 --- set -euo pipefail # 定义日志函数 log_info() { echo -e "\033[32m[INFO]\033[0m $1" } log_error() { echo -e "\033[31m[ERROR]\033[0m $1" >&2 exit 1 } # 打印帮助信息 usage() { echo "用法: $0 [--release]" echo "" echo "选项:" echo " --release 以 Release 模式编译并部署 (默认为 Debug 模式)" echo " -h, --help 显示此帮助信息" exit 0 } # --- 3. 参数解析与动态配置 --- # 默认为 Debug 模式 IS_RELEASE=false BUILD_MODE="debug" CARGO_ARGS="" TARGET_BASE_DIR="/home/milky/Documents/ASD-backend/rust-backend/target/x86_64-unknown-linux-gnu/" # 解析命令行参数 if [[ "$#" -gt 0 ]]; then case "$1" in --release) IS_RELEASE=true BUILD_MODE="release" CARGO_ARGS="--release" ;; -h|--help) usage ;; *) log_error "未知参数: '$1'。使用 '$0 --help' 查看用法。" ;; esac fi # 根据模式动态设置目标目录 TARGET_DIR="${TARGET_BASE_DIR}${BUILD_MODE}/" log_info "部署模式: ${BUILD_MODE}" log_info "本地目标目录: ${TARGET_DIR}" # --- 4. 核心功能函数 --- # 检查必要的命令是否存在 check_dependencies() { local deps=("cargo" "rsync" "ssh") for cmd in "${deps[@]}"; do if ! command -v "$cmd" &> /dev/null; then log_error "依赖命令 '$cmd' 未找到,请先安装。" fi done log_info "所有依赖项检查通过。" } # 编译项目 build_project() { log_info "开始编译项目 (${BUILD_MODE}模式)..." # 使用动态的 CARGO_ARGS if cargo build ${CARGO_ARGS} --target x86_64-unknown-linux-gnu --quiet; then log_info "项目编译成功。" else log_error "项目编译失败!" fi } # 上传二进制文件 upload_binary() { local binary_path="${TARGET_DIR}${PROJECT_NAME}" if [ ! -f "$binary_path" ]; then log_error "编译产物未找到: $binary_path" fi log_info "正在上传二进制文件到 ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}..." rsync -avzP --progress "$binary_path" "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/" log_info "文件上传成功。" } # 重启远程服务 restart_remote_service() { log_info "正在重启远程服务 '${SERVICE_NAME}'..." if ssh "${REMOTE_USER}@${REMOTE_HOST}" "systemctl restart ${SERVICE_NAME}"; then log_info "远程服务重启成功。" else log_error "远程服务重启失败!请检查服务状态和日志。" fi } # --- 5. 主执行流程 --- main() { log_info "========== 开始部署 (${BUILD_MODE}模式) ==========" check_dependencies build_project upload_binary restart_remote_service log_info "========== 部署完成! ==========" } # 执行主函数 main