From 7d7c0b251feeb5193a278c3e8925f57a3abcb05e Mon Sep 17 00:00:00 2001 From: Milky0217 Date: Tue, 21 Oct 2025 10:07:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86deploy=E7=9A=84?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy.sh | 136 +++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 119 insertions(+), 17 deletions(-) diff --git a/deploy.sh b/deploy.sh index 91be69c..34e0a2d 100755 --- a/deploy.sh +++ b/deploy.sh @@ -1,27 +1,129 @@ #!/bin/bash -set -e # 遇到错误立即退出 -# 配置 -LOCAL_DIR="/home/milky/Documents/ASD-backend/rust-backend/target/debug/" +# ============================================================================== +# 部署脚本 - Rust Backend (支持编译模式选择) +# ============================================================================== + +# --- 1. 配置 --- +# 项目名称 +PROJECT_NAME="rust-backend" +# 远程服务器信息 REMOTE_USER="root" -REMOTE_HOST="1panel-server" # 或直接使用IP +REMOTE_HOST="1panel-server" REMOTE_DIR="/root/rust/rust_backend" +# 远程服务名称 (用于 systemctl restart) +SERVICE_NAME="rust-backend.service" -# 检查本地目录是否存在 -if [ ! -d "$LOCAL_DIR" ]; then - echo "错误:本地目录 $LOCAL_DIR 不存在" +# --- 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 -# 编译项目(如果需要) -echo "正在编译项目..." -cargo build --release --target x86_64-unknown-linux-gnu -#cargo build +# 根据模式动态设置目标目录 +TARGET_DIR="${TARGET_BASE_DIR}${BUILD_MODE}/" -# 上传文件 -echo "正在上传文件..." -rsync -avz --progress \ - $LOCAL_DIR/rust-backend \ - $REMOTE_HOST:$REMOTE_DIR/ +log_info "部署模式: ${BUILD_MODE}" +log_info "本地目标目录: ${TARGET_DIR}" -echo "部署完成!" \ No newline at end of file +# --- 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 \ No newline at end of file