161 lines
6.5 KiB
Bash
161 lines
6.5 KiB
Bash
|
|
#!/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 "🔁 重新发布:直接重跑本脚本即可(脚本会自动覆盖)"
|