编写前端发布脚本
前端发布脚本的功能
- 保留每一个发布版本,防止新版本异常,方便回撤
- 用户无感知,防止发布过程中的宕机
原理:
发布的网站目录只是一个软连接,发布新版本前端后,修改软连接的指向文件夹即可实现用户无感知发布
发布逻辑
- 上传dist文件到指定目录
- 将dist文件重命名为日期_时间
- 修改软连接指向最新的日期_时间文件目录
脚本执行代码:
注意:充分测试脚本后再上生产环境,禁止使用root账号执行脚本,强制要求切换到deploy用户,不熟悉脚本的请手动操作
deploy用户创建,可以查看文章 生成环境项目目录规划
#!/usr/bin/env bash
set -euo pipefail# ---- 仅允许 deploy 执行 ----
RUN_AS="$(id -un || true)"
if [[ "$RUN_AS" != "deploy" ]]; thenecho "❌ 本脚本仅允许 deploy 用户执行。当前用户:$RUN_AS"echo " 请使用:su - deploy 或 sudo -u deploy /bin/bash $0"exit 126
fiUI_BASE="/www/wwwroot/mes_saas/ui"
SRC="${UI_BASE}/upload/dist" # 上传的 dist 整个目录
REL_ROOT="${UI_BASE}/admin-releases" # 版本库
LINK="${UI_BASE}/admin" # 前端软链(必须是软链)
VER="$(date +%Y%m%d_%H%M%S)"
DEST="${REL_ROOT}/${VER}" # 版本目录# 路径白名单校验
check_in_ui_base () {local p="$(realpath -m "$1")"local base="$(realpath -m "$UI_BASE")"[[ "$p" == "$base"* ]]
}
for p in "$SRC" "$REL_ROOT" "$LINK"; docheck_in_ui_base "$p" || { echo "❌ 非法路径越界: $p"; exit 1; }
done# 存在性检查
[[ -d "$SRC" ]] || { echo "❌ 未找到上传目录:$SRC"; exit 1; }
[[ -f "$SRC/index.html" ]] || { echo "❌ dist 下缺少 index.html"; exit 1; }
[[ -d "$REL_ROOT" ]] || { echo "❌ 版本库不存在:$REL_ROOT"; exit 1; }
[[ -L "$LINK" ]] || { echo "❌ $LINK 必须是软链"; exit 1; }# 1) 将 dist 整体移动为版本目录
mv "$SRC" "$DEST"# 2) 更新 admin 软链指向新版本
ln -sfn "$DEST" "$LINK"echo "✅ 前端发布完成"
echo " 软链:$LINK -> $DEST"