feat(deploy): 增强 deploy.sh 日志和服务管理功能
新增选项: - --logs [N] 查看后端日志(默认50行) - --tail [N] 实时跟踪后端日志(Ctrl+C 退出) - --status 查看服务状态 - --post-logs 部署后自动显示日志 改进: - 修复 --help 选项无法正确处理的 bug - 优化参数解析逻辑(先选项后位置参数)
This commit is contained in:
144
deploy.sh
144
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}"
|
||||
|
||||
Reference in New Issue
Block a user