From 45ed78a883d9349c6be3fc6c44742fdba724cb21 Mon Sep 17 00:00:00 2001 From: Milky0217 Date: Sun, 19 Apr 2026 17:40:23 +0800 Subject: [PATCH] =?UTF-8?q?feat(deploy):=20=E5=A2=9E=E5=BC=BA=20deploy.sh?= =?UTF-8?q?=20=E6=97=A5=E5=BF=97=E5=92=8C=E6=9C=8D=E5=8A=A1=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增选项: - --logs [N] 查看后端日志(默认50行) - --tail [N] 实时跟踪后端日志(Ctrl+C 退出) - --status 查看服务状态 - --post-logs 部署后自动显示日志 改进: - 修复 --help 选项无法正确处理的 bug - 优化参数解析逻辑(先选项后位置参数) --- deploy.sh | 144 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 139 insertions(+), 5 deletions(-) diff --git a/deploy.sh b/deploy.sh index 6d37d97..37b75f3 100755 --- a/deploy.sh +++ b/deploy.sh @@ -18,7 +18,7 @@ set -euo pipefail PROJECT_NAME="rust-backend" REMOTE_USER="root" REMOTE_HOST="1panel-server" -APP_ENV="${1:-production}" +APP_ENV="production" # 默认选项 DRY_RUN=false @@ -26,12 +26,16 @@ SKIP_CONFIRM=false SKIP_TESTS=false ROLLBACK=false LIST_BACKUPS=false +VIEW_LOGS=false +TAIL_LOGS=false +LOG_LINES=50 +VIEW_STATUS=false +POST_DEPLOY_LOGS=false # 全局变量(部署流程中使用) BACKUP_PATH="" -# 解析选项 -shift 2>/dev/null || true +# 解析选项(先处理选项,再处理位置参数) while [[ $# -gt 0 ]]; do case "$1" in --dry-run) @@ -49,6 +53,26 @@ while [[ $# -gt 0 ]]; do --backup-list) LIST_BACKUPS=true ;; + --logs) + VIEW_LOGS=true + ;; + --tail) + TAIL_LOGS=true + ;; + --logs=*) + VIEW_LOGS=true + LOG_LINES="${1#*=}" + ;; + --tail=*) + TAIL_LOGS=true + LOG_LINES="${1#*=}" + ;; + --status) + VIEW_STATUS=true + ;; + --post-logs) + POST_DEPLOY_LOGS=true + ;; --help|-h) echo "用法: $0 [development|production] [options]" echo "" @@ -58,11 +82,21 @@ while [[ $# -gt 0 ]]; do echo " --skip-tests 跳过部署后测试" echo " --rollback 回滚到上一个备份版本" echo " --backup-list 列出可用备份" + echo " --logs [N] 查看后端日志(默认50行)" + echo " --tail [N] 实时跟踪后端日志(Ctrl+C 退出)" + echo " --status 查看服务状态" + echo " --post-logs 部署后自动显示日志" exit 0 ;; *) - echo "未知选项: $1" - exit 1 + # 位置参数:development 或 production + if [[ "$1" == "development" || "$1" == "production" ]]; then + APP_ENV="$1" + else + echo "未知选项: $1" + echo "用法: $0 [development|production] [options]" + exit 1 + fi ;; esac shift @@ -185,6 +219,82 @@ list_backups() { echo "" } +# 查看后端日志 +view_logs() { + local lines="${LOG_LINES:-50}" + log_step "查看后端日志(最后 ${lines} 行)..." + echo "" + + if [ "$DRY_RUN" = true ]; then + log_dry "ssh ${REMOTE_USER}@${REMOTE_HOST} 'tail -${lines} ${REMOTE_DIR}/logs/rust-backend.*.log'" + return 0 + fi + + # 获取最新的日志文件 + local log_file + log_file=$(ssh "${REMOTE_USER}@${REMOTE_HOST}" "ls -t ${REMOTE_DIR}/logs/rust-backend.*.log 2>/dev/null | head -1" || echo "") + + if [ -z "$log_file" ]; then + log_warn "未找到日志文件: ${REMOTE_DIR}/logs/" + return 1 + fi + + echo -e "${BLUE}=== ${log_file} ===${NC}" + echo "" + ssh "${REMOTE_USER}@${REMOTE_HOST}" "tail -${lines} \"${log_file}\"" + echo "" +} + +# 实时跟踪后端日志 +tail_logs() { + local lines="${LOG_LINES:-100}" + log_step "实时跟踪后端日志(最后 ${lines} 行,按 Ctrl+C 退出)..." + echo "" + + if [ "$DRY_RUN" = true ]; then + log_dry "ssh ${REMOTE_USER}@${REMOTE_HOST} 'tail -f -n ${lines} ${REMOTE_DIR}/logs/rust-backend.*.log'" + return 0 + fi + + # 获取最新的日志文件 + local log_file + log_file=$(ssh "${REMOTE_USER}@${REMOTE_HOST}" "ls -t ${REMOTE_DIR}/logs/rust-backend.*.log 2>/dev/null | head -1" || echo "") + + if [ -z "$log_file" ]; then + log_warn "未找到日志文件: ${REMOTE_DIR}/logs/" + return 1 + fi + + echo -e "${BLUE}=== 实时日志: ${log_file} ===${NC}" + echo -e "${YELLOW}按 Ctrl+C 退出${NC}" + echo "" + ssh -t "${REMOTE_USER}@${REMOTE_HOST}" "tail -f -n ${lines} \"${log_file}\"" +} + +# 查看服务状态 +status() { + log_step "服务状态..." + echo "" + + if [ "$DRY_RUN" = true ]; then + log_dry "ssh ${REMOTE_USER}@${REMOTE_HOST} 'systemctl status ${SERVICE_NAME}'" + return 0 + fi + + echo -e "${BLUE}=== ${SERVICE_NAME} ===${NC}" + ssh "${REMOTE_USER}@${REMOTE_HOST}" "systemctl status ${SERVICE_NAME} --no-pager" + echo "" + + echo -e "${BLUE}=== 最近日志 ===${NC}" + local log_file + log_file=$(ssh "${REMOTE_USER}@${REMOTE_HOST}" "ls -t ${REMOTE_DIR}/logs/rust-backend.*.log 2>/dev/null | head -1" || echo "") + if [ -n "$log_file" ]; then + echo -e "${BLUE}=== ${log_file} ===${NC}" + ssh "${REMOTE_USER}@${REMOTE_HOST}" "tail -20 \"${log_file}\"" + fi + echo "" +} + # 回滚(手动触发) rollback() { log_step "查找最新备份..." @@ -922,6 +1032,24 @@ main() { exit 0 fi + if [ "$VIEW_LOGS" = true ]; then + ssh_connect + view_logs + exit 0 + fi + + if [ "$TAIL_LOGS" = true ]; then + ssh_connect + tail_logs + exit 0 + fi + + if [ "$VIEW_STATUS" = true ]; then + ssh_connect + status + exit 0 + fi + if [ "$ROLLBACK" = true ]; then ssh_connect rollback @@ -953,6 +1081,12 @@ main() { echo -e " Git: ${GIT_VERSION}" echo -e " 环境: ${APP_ENV}" echo "" + + if [ "$POST_DEPLOY_LOGS" = true ]; then + echo "" + log_step "显示最近日志..." + view_logs + fi else log_error "========== 部署失败,已自动回滚 ==========" echo -e " Git: ${GIT_VERSION}"