Executable
+26
@@ -0,0 +1,26 @@
|
||||
#!/bin/bash
|
||||
# Shared by deploy_test.sh / deploy_prod.sh; compatible with macOS Bash 3.2.
|
||||
fail() { printf '错误:%s\n' "$*" >&2; exit 1; }
|
||||
step() { printf '\n▸ %s\n' "$*"; }
|
||||
need() { command -v "$1" >/dev/null || fail "缺少命令 $1"; }
|
||||
valid_host() { [[ "$1" =~ ^[a-zA-Z0-9_][a-zA-Z0-9_.@-]*$ ]] || fail "$2 格式无效或未配置"; }
|
||||
valid_path() { [[ "$1" =~ ^/[a-zA-Z0-9_-]+(/[a-zA-Z0-9_.-]+)*/?$ ]] && [[ "$1/" != *'/../'* ]] && [[ "$1/" != *'/./'* ]] || fail "$2 必须是普通绝对路径"; }
|
||||
valid_port() { [[ "$1" =~ ^[0-9]+$ ]] && [ "$1" -ge 1 ] && [ "$1" -le 65535 ] || fail "$2 必须在 1–65535 内"; }
|
||||
check_local() {
|
||||
need node; need pnpm
|
||||
node -e 'const [a,b]=process.versions.node.split(".").map(Number);if(a<20||a===20&&b<9)process.exit(1)' || fail '需要 Node.js >=20.9,推荐 22'
|
||||
[ -d node_modules/next ] && [ -d node_modules/dotenv ] || fail '请先执行 pnpm install'
|
||||
[ -s "config/$1.env" ] && [ -s pnpm-lock.yaml ] && [ -s package-lock.json ] || fail "缺少 config/$1.env、pnpm-lock.yaml 或 package-lock.json(测试服 npm ci 需要 package-lock.json)"
|
||||
}
|
||||
public_profile() {
|
||||
node --input-type=module -e 'import{readFileSync}from"node:fs";import{parse}from"dotenv";const c=parse(readFileSync(`config/${process.argv[1]}.env`));console.log(` API=${c.UPSTREAM_API_URL||c.API_BASE_URL||c.API_PROXY_TARGET||""} PORT=${c.PORT}`)' "$1"
|
||||
}
|
||||
lock_build() {
|
||||
[ ! -L dist ] || fail 'dist 不允许为符号链接'
|
||||
mkdir -p dist
|
||||
DEPLOY_LOCK="$SCRIPT_DIR/dist/.deploy.lock"
|
||||
mkdir "$DEPLOY_LOCK" 2>/dev/null || fail "已有构建/发布进程或残留锁:$DEPLOY_LOCK"
|
||||
trap 'rmdir "$DEPLOY_LOCK" 2>/dev/null || true' EXIT
|
||||
trap 'exit 130' INT
|
||||
trap 'exit 143' TERM
|
||||
}
|
||||
Reference in New Issue
Block a user