#!/bin/bash # ============================================================================= # deploy_kanban_to_jumpserver.sh — 项目状态看板 HTML 发布到 jumpserver # ============================================================================= # 流程: # 1. 跑 build_kanban_html.py 生成 docs/07-项目管理/项目状态看板.html # 2. 调用 jumpserver-V2 skill 的 v2_ops.py upload 上传到 /tmp/ # 3. 用 v2_ops.py exec 移动到 nginx 静态目录(容器外 or 容器内) # 4. (可选)触发 nginx reload(仅当挂载点在容器外时) # # 用法: # bash scripts/deploy_kanban_to_jumpserver.sh # 默认发布 # bash scripts/deploy_kanban_to_jumpserver.sh --dry-run # 仅生成不上传 # bash scripts/deploy_kanban_to_jumpserver.sh --no-build # 跳过生成(用现有 HTML) # # 前置: # - jumpserver-V2 skill 已登录(v2_ops.py status 返回有效) # - jumpserver 上有 nginx 静态目录 /opt/wecom-it-desk/docs-public/kanban/ # - jumpserver 上有 nginx 路由 /kanban/ → 该目录(见 nginx 配置建议) # # ⚠️ 本脚本默认不修改 nginx 配置(避免误改生产)。如需启用 /kanban/ 路由, # 请手动编辑 nginx 配置文件(见末尾附录)后 reload。 # ============================================================================= 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)" MD_FILE="$PROJECT_ROOT/docs/07-项目管理/项目状态看板.md" HTML_FILE="$PROJECT_ROOT/docs/07-项目管理/项目状态看板.html" HTML_NAME="项目状态看板.html" # 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_TMP="/tmp/kanban_$(date +%Y%m%d%H%M%S).html" REMOTE_FINAL_DIR="/opt/wecom-it-desk/docs-public/kanban" REMOTE_FINAL_FILE="$REMOTE_FINAL_DIR/项目状态看板.html" # 参数 DRY_RUN=false SKIP_BUILD=false for arg in "$@"; do case "$arg" in --dry-run) DRY_RUN=true ;; --no-build) SKIP_BUILD=true ;; *) error "未知参数:$arg" ;; esac done # ============================================================ # Step 1: 生成 HTML # ============================================================ if [ "$SKIP_BUILD" = false ]; then info "[1/4] 生成 HTML..." # ⚠️ Windows Python 不认 Git Bash 的 /d/... 路径(会解析成 D:\d\...),须 cygpath -w 转换 BUILD_PY="$(cygpath -w "$SCRIPT_DIR/build_kanban_html.py" 2>/dev/null || echo "$SCRIPT_DIR/build_kanban_html.py")" "$PYTHON_BIN" "$BUILD_PY" || error "生成失败" ok "HTML 已生成" else info "[1/4] 跳过生成(使用现有 $HTML_FILE)" fi [ -f "$HTML_FILE" ] || error "HTML 文件不存在:$HTML_FILE" # ============================================================ # Step 2: jumpserver 会话状态 # ============================================================ info "[2/4] 检查 jumpserver 会话..." "$PYTHON_BIN" "$V2_OPS" status 2>&1 | grep -E "✅|❌" || error "jumpserver 会话无效,请先 login" # ============================================================ # Step 3: 上传到 jumpserver /tmp/ # ============================================================ # ⚠️ 路径铁律(2026-08-07 修复): # ① v2_ops.py 是 Windows Python,收不到 Git Bash 的 /d/... 形式路径 # (会被误解析成 \d\... 而报「本地文件不存在」) # ② psftp 通道要求本地源路径 **纯 ASCII**,而本仓库路径含中文 # → 故先把 HTML 复制到 ASCII 临时目录,再用 Windows 形式路径调用 upload STAMP="$(date +%Y%m%d%H%M%S)" ASCII_TMP_DIR="$(cygpath -u "${LOCALAPPDATA:-C:/Users/$USER/AppData/Local}" 2>/dev/null || echo "/c/Users/$USER/AppData/Local")/Temp" ASCII_TMP_FILE="$ASCII_TMP_DIR/kanban_$STAMP.html" REMOTE_TMP="/tmp/kanban_$STAMP.html" info "[3/4] 上传 $HTML_NAME → $REMOTE_TMP..." if [ "$DRY_RUN" = true ]; then info "(dry-run 跳过)" else mkdir -p "$ASCII_TMP_DIR" cp "$HTML_FILE" "$ASCII_TMP_FILE" || error "复制到 ASCII 临时路径失败" ASCII_TMP_WIN="$(cygpath -w "$ASCII_TMP_FILE" 2>/dev/null || echo "$ASCII_TMP_FILE")" # v2_ops.py upload [remote],remote 是远端 basename "$PYTHON_BIN" "$V2_OPS" upload "$ASCII_TMP_WIN" "kanban_$STAMP.html" \ || error "上传失败" rm -f "$ASCII_TMP_FILE" ok "上传完成" fi # ============================================================ # Step 4: 移动到最终目录 + 设置权限 # ============================================================ info "[4/4] 移动到 $REMOTE_FINAL_DIR/ 并设置权限..." if [ "$DRY_RUN" = true ]; then info "(dry-run 跳过)" else CMD=$(cat <