feat(deploy): 增强 deploy.sh 日志和服务管理功能
新增选项: - --logs [N] 查看后端日志(默认50行) - --tail [N] 实时跟踪后端日志(Ctrl+C 退出) - --status 查看服务状态 - --post-logs 部署后自动显示日志 改进: - 修复 --help 选项无法正确处理的 bug - 优化参数解析逻辑(先选项后位置参数)
This commit is contained in:
140
deploy.sh
140
deploy.sh
@@ -18,7 +18,7 @@ set -euo pipefail
|
|||||||
PROJECT_NAME="rust-backend"
|
PROJECT_NAME="rust-backend"
|
||||||
REMOTE_USER="root"
|
REMOTE_USER="root"
|
||||||
REMOTE_HOST="1panel-server"
|
REMOTE_HOST="1panel-server"
|
||||||
APP_ENV="${1:-production}"
|
APP_ENV="production"
|
||||||
|
|
||||||
# 默认选项
|
# 默认选项
|
||||||
DRY_RUN=false
|
DRY_RUN=false
|
||||||
@@ -26,12 +26,16 @@ SKIP_CONFIRM=false
|
|||||||
SKIP_TESTS=false
|
SKIP_TESTS=false
|
||||||
ROLLBACK=false
|
ROLLBACK=false
|
||||||
LIST_BACKUPS=false
|
LIST_BACKUPS=false
|
||||||
|
VIEW_LOGS=false
|
||||||
|
TAIL_LOGS=false
|
||||||
|
LOG_LINES=50
|
||||||
|
VIEW_STATUS=false
|
||||||
|
POST_DEPLOY_LOGS=false
|
||||||
|
|
||||||
# 全局变量(部署流程中使用)
|
# 全局变量(部署流程中使用)
|
||||||
BACKUP_PATH=""
|
BACKUP_PATH=""
|
||||||
|
|
||||||
# 解析选项
|
# 解析选项(先处理选项,再处理位置参数)
|
||||||
shift 2>/dev/null || true
|
|
||||||
while [[ $# -gt 0 ]]; do
|
while [[ $# -gt 0 ]]; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
--dry-run)
|
--dry-run)
|
||||||
@@ -49,6 +53,26 @@ while [[ $# -gt 0 ]]; do
|
|||||||
--backup-list)
|
--backup-list)
|
||||||
LIST_BACKUPS=true
|
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)
|
--help|-h)
|
||||||
echo "用法: $0 [development|production] [options]"
|
echo "用法: $0 [development|production] [options]"
|
||||||
echo ""
|
echo ""
|
||||||
@@ -58,11 +82,21 @@ while [[ $# -gt 0 ]]; do
|
|||||||
echo " --skip-tests 跳过部署后测试"
|
echo " --skip-tests 跳过部署后测试"
|
||||||
echo " --rollback 回滚到上一个备份版本"
|
echo " --rollback 回滚到上一个备份版本"
|
||||||
echo " --backup-list 列出可用备份"
|
echo " --backup-list 列出可用备份"
|
||||||
|
echo " --logs [N] 查看后端日志(默认50行)"
|
||||||
|
echo " --tail [N] 实时跟踪后端日志(Ctrl+C 退出)"
|
||||||
|
echo " --status 查看服务状态"
|
||||||
|
echo " --post-logs 部署后自动显示日志"
|
||||||
exit 0
|
exit 0
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
|
# 位置参数:development 或 production
|
||||||
|
if [[ "$1" == "development" || "$1" == "production" ]]; then
|
||||||
|
APP_ENV="$1"
|
||||||
|
else
|
||||||
echo "未知选项: $1"
|
echo "未知选项: $1"
|
||||||
|
echo "用法: $0 [development|production] [options]"
|
||||||
exit 1
|
exit 1
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
shift
|
shift
|
||||||
@@ -185,6 +219,82 @@ list_backups() {
|
|||||||
echo ""
|
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() {
|
rollback() {
|
||||||
log_step "查找最新备份..."
|
log_step "查找最新备份..."
|
||||||
@@ -922,6 +1032,24 @@ main() {
|
|||||||
exit 0
|
exit 0
|
||||||
fi
|
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
|
if [ "$ROLLBACK" = true ]; then
|
||||||
ssh_connect
|
ssh_connect
|
||||||
rollback
|
rollback
|
||||||
@@ -953,6 +1081,12 @@ main() {
|
|||||||
echo -e " Git: ${GIT_VERSION}"
|
echo -e " Git: ${GIT_VERSION}"
|
||||||
echo -e " 环境: ${APP_ENV}"
|
echo -e " 环境: ${APP_ENV}"
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
|
if [ "$POST_DEPLOY_LOGS" = true ]; then
|
||||||
|
echo ""
|
||||||
|
log_step "显示最近日志..."
|
||||||
|
view_logs
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
log_error "========== 部署失败,已自动回滚 =========="
|
log_error "========== 部署失败,已自动回滚 =========="
|
||||||
echo -e " Git: ${GIT_VERSION}"
|
echo -e " Git: ${GIT_VERSION}"
|
||||||
|
|||||||
Reference in New Issue
Block a user