136 lines
5.4 KiB
Bash
136 lines
5.4 KiB
Bash
#!/bin/bash
|
||
# =============================================================================
|
||
# deploy_inspection_to_jumpserver.sh — 巡检报告 HTML 发布到 jumpserver
|
||
# =============================================================================
|
||
# 流程:
|
||
# 1. 扫描 docs/07-项目管理/巡检报告/ 下所有 HTML 报告
|
||
# 2. 调用 jumpserver-V2 skill 的 v2_ops.py upload 上传到 /tmp/
|
||
# 3. 用 v2_ops.py exec 按月份目录归档到 /opt/wecom-it-desk/docs-public/inspection/
|
||
# 4. (可选)触发 nginx reload(仅当挂载点在容器外时)
|
||
#
|
||
# 用法:
|
||
# bash scripts/deploy_inspection_to_jumpserver.sh # 默认发布全部
|
||
# bash scripts/deploy_inspection_to_jumpserver.sh --dry-run # 仅 dry-run
|
||
# bash scripts/deploy_inspection_to_jumpserver.sh --month 2026-08 # 仅发布指定月份
|
||
#
|
||
# 前置:
|
||
# - jumpserver-V2 skill 已登录(v2_ops.py status 返回有效)
|
||
# - jumpserver 上有静态目录 /opt/wecom-it-desk/docs-public/inspection/
|
||
# - jumpserver 上有 nginx 路由 /docs/inspection/ → 该目录
|
||
#
|
||
# ⚠️ 本脚本默认不修改 nginx 配置(避免误改生产)。
|
||
# =============================================================================
|
||
set -e
|
||
|
||
# 颜色
|
||
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; BLUE='\033[0;34m'; NC='\033[0m'
|
||
info() { echo -e "${BLUE}[INFO]${NC} $1"; }
|
||
ok() { echo -e "${GREEN}[OK]${NC} $1"; }
|
||
warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
|
||
error() { echo -e "${RED}[ERROR]${NC} $1"; exit 1; }
|
||
|
||
# 路径常量
|
||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||
SRC_DIR="$PROJECT_ROOT/docs/07-项目管理/巡检报告"
|
||
|
||
# jumpserver-V2 skill
|
||
V2_OPS="C:\Users\simon\.workbuddy\skills\jumpserver-V2\scripts\v2_ops.py"
|
||
PYTHON_BIN="C:\Users\simon\.workbuddy\binaries\python\versions\3.13.12\python.exe"
|
||
|
||
# 服务器路径
|
||
REMOTE_BASE="/opt/wecom-it-desk/docs-public/inspection"
|
||
|
||
# 参数
|
||
DRY_RUN=false
|
||
ONLY_MONTH=""
|
||
for arg in "$@"; do
|
||
case "$arg" in
|
||
--dry-run) DRY_RUN=true ;;
|
||
--month) ONLY_MONTH="$2"; shift 2 ;;
|
||
*) error "未知参数:$arg" ;;
|
||
esac
|
||
done
|
||
|
||
# ============================================================
|
||
# Step 1: 扫描 HTML 文件
|
||
# ============================================================
|
||
info "[1/4] 扫描 $SRC_DIR ..."
|
||
[ -d "$SRC_DIR" ] || error "源目录不存在:$SRC_DIR"
|
||
|
||
# 收集所有 .html 文件(按月份分组)
|
||
mapfile -t ALL_FILES < <(find "$SRC_DIR" -name "*.html" -type f 2>/dev/null | sort)
|
||
[ ${#ALL_FILES[@]} -gt 0 ] || error "未找到任何 HTML 文件"
|
||
|
||
# 按月份过滤
|
||
declare -A MONTH_FILES
|
||
for f in "${ALL_FILES[@]}"; do
|
||
# 提取 YYYY-MM(相对路径第一段)
|
||
rel="${f#$SRC_DIR/}"
|
||
month="$(echo "$rel" | cut -d'/' -f1)"
|
||
if [ -n "$ONLY_MONTH" ] && [ "$month" != "$ONLY_MONTH" ]; then
|
||
continue
|
||
fi
|
||
MONTH_FILES["$month"]+="$f"$'\n'
|
||
done
|
||
|
||
[ ${#MONTH_FILES[@]} -gt 0 ] || error "指定月份 $ONLY_MONTH 下无 HTML 文件"
|
||
|
||
info "发现 ${#MONTH_FILES[@]} 个月份,共 $(printf '%s\n' "${ALL_FILES[@]}" | grep -c "\.html") 个文件"
|
||
for month in "${!MONTH_FILES[@]}"; do
|
||
count=$(echo "${MONTH_FILES[$month]}" | grep -c "\.html" || echo 0)
|
||
info " 📅 $month: $count 个报告"
|
||
done
|
||
|
||
# ============================================================
|
||
# Step 2: jumpserver 会话状态
|
||
# ============================================================
|
||
info "[2/4] 检查 jumpserver 会话..."
|
||
"$PYTHON_BIN" "$V2_OPS" status 2>&1 | grep -E "✅|❌" || error "jumpserver 会话无效,请先 login"
|
||
|
||
# ============================================================
|
||
# Step 3: 上传 + 归档(按月份)
|
||
# ============================================================
|
||
info "[3/4] 上传文件到 jumpserver..."
|
||
UPLOADED=0
|
||
for month in "${!MONTH_FILES[@]}"; do
|
||
while IFS= read -r local_file; do
|
||
[ -z "$local_file" ] && continue
|
||
basename="$(basename "$local_file")"
|
||
ts="$(date +%Y%m%d%H%M%S)"
|
||
|
||
# 中文路径 → jumpserver 必须走 ASCII 临时文件名
|
||
# 但 v2_ops.py upload 已自动处理(内部 ASCII staging)
|
||
info " 📤 $month/$basename"
|
||
if [ "$DRY_RUN" = true ]; then
|
||
info " (dry-run 跳过)"
|
||
else
|
||
"$PYTHON_BIN" "$V2_OPS" upload "$local_file" "inspection_${month}_${ts}_${basename}" \
|
||
|| error "上传失败:$basename"
|
||
|
||
# 远端 mkdir + mv 到正确月份目录
|
||
remote_cmd="mkdir -p ${REMOTE_BASE}/${month} && mv /tmp/inspection_${month}_${ts}_${basename} ${REMOTE_BASE}/${month}/${basename} && chmod 644 ${REMOTE_BASE}/${month}/${basename}"
|
||
"$PYTHON_BIN" "$V2_OPS" exec "$remote_cmd" \
|
||
|| error "归档失败:$basename"
|
||
|
||
UPLOADED=$((UPLOADED + 1))
|
||
fi
|
||
done <<< "${MONTH_FILES[$month]}"
|
||
done
|
||
|
||
# ============================================================
|
||
# Step 4: 完成
|
||
# ============================================================
|
||
info "[4/4] 部署完成"
|
||
echo ""
|
||
ok "========== 发布总结 =========="
|
||
info "月份数: ${#MONTH_FILES[@]}"
|
||
info "上传文件: $UPLOADED"
|
||
echo ""
|
||
info "📍 访问 URL(前提:nginx 已加 /docs/inspection/ 路由)"
|
||
info " https://itsupport.servyou.com.cn/docs/inspection/2026-08/2026-08-05-早班.html"
|
||
echo ""
|
||
info "🔁 重新发布:直接重跑本脚本即可(脚本会自动覆盖)"
|
||
echo ""
|
||
info "💡 巡检报告 HTML 由早班巡检自动化任务生成 + 自动调用本脚本发布"
|
||
info " (详见 .workbuddy/automations/automation-1782986180887/memory.md 标准步骤清单)" |