Files
hi-landing-hero/scripts/ci-build.sh
T
shanshanzhong147 8a0359fd7e
site-dist-deploy / build-and-deploy (push) Failing after 1m59s
fix(ci): use unified build script with bun
2026-01-04 03:18:13 -08:00

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