Files
wecom_it_smart_desk/scripts/deploy_kanban_to_jumpserver.sh
T
2026-08-11 14:16:24 +08:00

159 lines
6.3 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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..."
"$PYTHON_BIN" "$SCRIPT_DIR/build_kanban_html.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 "🔁 重新发布:直接重跑本脚本即可(脚本会自动覆盖)"