hi-download/scripts/ci-build.sh
shanshanzhong 447387c0a5
Some checks failed
site-dist-deploy / build-and-deploy (push) Failing after 1m2s
add: 增加CI
2026-01-22 00:55:41 -08:00

134 lines
4.4 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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