[看板] v1.9.4 同步 REQ-通用-006 完成状态 + 修复部署脚本 bug
- 项目状态看板.md:REQ-通用-006 预生产测试通道入「最近完成」区(已完成 99→100 / 总任务 111→112);dida 同步说明 12→13 项;头部变更来源与版本变更记录追加午后增补 - 项目状态看板.html:派生副本重新生成(build_kanban_html.py) - deploy_kanban_to_jumpserver.sh:修复 Step1 Git Bash 路径传给 Windows Python 的 bug(cygpath -w 转换)+ Step4 heredoc 内单引号阻止变量展开导致移动失败的 bug 已发布公网:https://itsupport.servyou.com.cn/docs/kanban/项目状态看板.html(200,含 REQ-006 内容)
This commit is contained in:
@@ -0,0 +1,161 @@
|
||||
#!/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 "🔁 重新发布:直接重跑本脚本即可(脚本会自动覆盖)"
|
||||
Reference in New Issue
Block a user