Some checks failed
site-dist-deploy / build-and-deploy (push) Failing after 1m2s
134 lines
4.4 KiB
Bash
134 lines
4.4 KiB
Bash
#!/bin/bash
|
||
set -e
|
||
|
||
# ==========================================
|
||
# 统一构建脚本 (CI Build Script)
|
||
# 功能:自动检测环境、安装 Node.js (不依赖系统预装)、构建项目、打包产物
|
||
# 解决:Runner 环境缺失 Node/Docker/Python 等工具导致的问题
|
||
# ==========================================
|
||
|
||
# 配置节点版本
|
||
NODE_VERSION="20.10.0"
|
||
DIST_FILE="site_dist.tgz"
|
||
|
||
echo ">>> [Init] Starting CI Build Script..."
|
||
|
||
# ----------------------------------------------------------------
|
||
# 1. 基础工具检测与安装 (curl, tar, xz)
|
||
# ----------------------------------------------------------------
|
||
ensure_tools() {
|
||
echo ">>> [Tools] Checking basic tools..."
|
||
local missing_tools=()
|
||
|
||
for tool in curl tar xz; do
|
||
if ! command -v "$tool" &> /dev/null; then
|
||
missing_tools+=("$tool")
|
||
fi
|
||
done
|
||
|
||
if [ ${#missing_tools[@]} -eq 0 ]; then
|
||
echo " All tools present."
|
||
return 0
|
||
fi
|
||
|
||
echo " Missing tools: ${missing_tools[*]}. Attempting installation..."
|
||
|
||
if command -v apk &> /dev/null; then
|
||
apk add --no-cache curl tar xz
|
||
elif command -v apt-get &> /dev/null; then
|
||
apt-get update && apt-get install -y curl tar xz-utils
|
||
elif command -v yum &> /dev/null; then
|
||
yum install -y curl tar xz
|
||
elif command -v dnf &> /dev/null; then
|
||
dnf install -y curl tar xz
|
||
elif command -v zypper &> /dev/null; then
|
||
zypper install -y curl tar xz
|
||
else
|
||
echo "!!! Error: Cannot install missing tools. No known package manager found."
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
# ----------------------------------------------------------------
|
||
# 2. 环境安装 (System Node.js - Most Reliable on Alpine)
|
||
# ----------------------------------------------------------------
|
||
install_env() {
|
||
echo ">>> [Env] Setting up System Node.js environment..."
|
||
|
||
# 尝试使用系统包管理器安装 Node.js 和 npm
|
||
if command -v apk &> /dev/null; then
|
||
echo " Detected Alpine Linux. Installing nodejs and npm via apk..."
|
||
apk add --no-cache nodejs npm
|
||
elif command -v apt-get &> /dev/null; then
|
||
echo " Detected Debian/Ubuntu. Installing nodejs and npm via apt..."
|
||
apt-get update && apt-get install -y nodejs npm
|
||
elif command -v yum &> /dev/null; then
|
||
yum install -y nodejs npm
|
||
elif command -v dnf &> /dev/null; then
|
||
dnf install -y nodejs npm
|
||
elif command -v zypper &> /dev/null; then
|
||
zypper install -y nodejs npm
|
||
else
|
||
echo "!!! Warning: No package manager found. Checking if Node is pre-installed..."
|
||
fi
|
||
|
||
# 验证安装
|
||
if ! command -v node &> /dev/null; then
|
||
echo "!!! Error: Node.js not found and could not be installed."
|
||
exit 1
|
||
fi
|
||
|
||
if ! command -v npm &> /dev/null; then
|
||
echo "!!! Error: npm not found and could not be installed."
|
||
exit 1
|
||
fi
|
||
|
||
echo " Node version: $(node -v)"
|
||
echo " npm version: $(npm -v)"
|
||
}
|
||
|
||
# ----------------------------------------------------------------
|
||
# 3. 项目构建与打包
|
||
# ----------------------------------------------------------------
|
||
build_project() {
|
||
echo ">>> [Build] Starting project build..."
|
||
|
||
# 注入环境变量
|
||
if [ -n "$VITE_APP_BASE_URL" ]; then
|
||
echo " Setting VITE_APP_BASE_URL=${VITE_APP_BASE_URL}"
|
||
# 兼容 package.json 中的 mode: pord (Typo in original project)
|
||
echo "VITE_APP_BASE_URL=${VITE_APP_BASE_URL}" > .env.pord
|
||
# 同时写入 .env 以防万一
|
||
echo "VITE_APP_BASE_URL=${VITE_APP_BASE_URL}" >> .env
|
||
fi
|
||
|
||
echo " Installing dependencies..."
|
||
# 使用 npm install 而不是 npm ci,以避免因 lockfile 版本不匹配或 engines 检查导致的失败
|
||
npm install --no-audit --progress=false
|
||
|
||
echo " Building..."
|
||
# 使用 package.json 中定义的 build:prod 命令
|
||
npm run build:prod
|
||
|
||
echo ">>> [Package] Compressing artifacts..."
|
||
if [ ! -d "dist" ]; then
|
||
echo "!!! Error: 'dist' directory not found after build."
|
||
# 列出当前目录以便调试
|
||
ls -la
|
||
exit 1
|
||
fi
|
||
|
||
# 直接打包 dist 目录下的内容
|
||
tar -C dist -czf "$DIST_FILE" .
|
||
|
||
echo " Success! Artifact created: $DIST_FILE"
|
||
ls -lh "$DIST_FILE"
|
||
}
|
||
|
||
# ==========================================
|
||
# Main Execution Flow
|
||
# ==========================================
|
||
ensure_tools
|
||
install_env
|
||
build_project
|