Files
wecom_it_smart_desk/scripts/deploy_kanban_to_jumpserver.sh
T

161 lines
6.5 KiB
Bash
Raw Normal View History

#!/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 <local> [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 <<EOF
mkdir -p $REMOTE_FINAL_DIR && \
cp "$REMOTE_TMP" "$REMOTE_FINAL_FILE" && \
chmod 644 "$REMOTE_FINAL_FILE" && \
rm -f $REMOTE_TMP && \
echo "[OK] $REMOTE_FINAL_FILE" && \
ls -la $REMOTE_FINAL_DIR/
EOF
)
"$PYTHON_BIN" "$V2_OPS" exec "$CMD" || error "移动失败"
ok "已部署到:$REMOTE_FINAL_FILE"
fi
echo ""
ok "========== 发布完成 =========="
echo ""
info "📍 访问 URL(前提:nginx 已加 /docs/kanban/ 路由)"
info " https://itsupport.servyou.com.cn/docs/kanban/项目状态看板.html"
echo ""
warn "⚠️ nginx 路由配置(需手动添加)"
cat <<'NGINX_HINT'
# 在 /etc/nginx/nginx.conf 的 server { } 块内添加:
location /docs/kanban/ {
alias /opt/wecom-it-desk/docs-public/kanban/;
charset utf-8;
add_header Cache-Control "no-cache, must-revalidate";
try_files $uri $uri/ $uri.html =404;
}
# 同时添加巡检报告路由(如选 C 全部发布):
location /docs/inspection/ {
alias /opt/wecom-it-desk/docs-public/inspection/;
charset utf-8;
add_header Cache-Control "no-cache, must-revalidate";
try_files $uri $uri/ $uri.html =404;
}
# 然后执行:
docker exec wecom_it_nginx nginx -t
docker compose -f /opt/wecom-it-desk/docker-compose.yml restart nginx
# 或 reload(配置挂载到容器内时):
docker exec wecom_it_nginx nginx -s reload
NGINX_HINT
echo ""
info "🔁 重新发布:直接重跑本脚本即可(脚本会自动覆盖)"