diff --git a/scripts/ci-build.sh b/scripts/ci-build.sh index 920d252..2b285ee 100644 --- a/scripts/ci-build.sh +++ b/scripts/ci-build.sh @@ -50,67 +50,41 @@ ensure_tools() { } # ---------------------------------------------------------------- -# 2. Node.js 独立环境安装 (Binary Mode) +# 2. 环境安装 (System Node.js - Most Reliable on Alpine) # ---------------------------------------------------------------- -install_node() { - echo ">>> [Node] Setting up Node.js v${NODE_VERSION}..." +install_env() { + echo ">>> [Env] Setting up System Node.js environment..." - # 如果已经有可用的 node 环境且版本匹配,则跳过(可选,为了稳健这里强制使用独立环境) - # export PATH="$PWD/node_env/bin:$PATH" - - # 检测架构 - local arch=$(uname -m) - local node_arch="" - case "$arch" in - x86_64) node_arch="x64" ;; - aarch64) node_arch="arm64" ;; - *) echo "!!! Error: Unsupported architecture: $arch"; exit 1 ;; - esac - - # 检测 Libc (glibc vs musl) - local libc_type="glibc" - if ldd --version 2>&1 | grep -q "musl"; then - libc_type="musl" - elif [ -f /etc/alpine-release ]; then - libc_type="musl" + # 尝试使用系统包管理器安装 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 - echo " Detected System: Linux ${node_arch} (${libc_type})" - # 构建下载 URL - # Official URL pattern: https://nodejs.org/dist/vX.Y.Z/node-vX.Y.Z-linux-ARCH[-musl].tar.xz - local url_suffix="" - if [ "$libc_type" == "musl" ]; then - url_suffix="-musl" - fi - - local tar_name="node-v${NODE_VERSION}-linux-${node_arch}${url_suffix}.tar.xz" - local download_url="https://nodejs.org/dist/v${NODE_VERSION}/${tar_name}" - - echo " Downloading: ${download_url}" - - mkdir -p node_env - - # 下载并解压 - if ! curl -fSL "$download_url" -o "$tar_name"; then - echo "!!! Error: Failed to download Node.js binary." - echo " Please check if version v${NODE_VERSION} supports ${node_arch}-${libc_type}." - exit 1 - fi - - echo " Extracting..." - tar -xJf "$tar_name" -C node_env --strip-components=1 - rm "$tar_name" - - # 设置环境变量 - export PATH="$PWD/node_env/bin:$PATH" - + # 验证安装 if ! command -v node &> /dev/null; then - echo "!!! Error: Node.js installation failed. 'node' command not found." + 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)" + echo " npm version: $(npm -v)" } # ---------------------------------------------------------------- @@ -119,25 +93,32 @@ install_node() { build_project() { echo ">>> [Build] Starting project build..." - # 注入环境变量 (从 CI 环境传递) + # 注入环境变量 if [ -n "$VITE_APP_BASE_URL" ]; then echo " Setting VITE_APP_BASE_URL=${VITE_APP_BASE_URL}" - echo "VITE_APP_BASE_URL=${VITE_APP_BASE_URL}" > .env.prod + # 兼容 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 ci --quiet + # 使用 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 目录下的内容,解压时直接释放文件 + # 直接打包 dist 目录下的内容 tar -C dist -czf "$DIST_FILE" . echo " Success! Artifact created: $DIST_FILE" @@ -148,5 +129,5 @@ build_project() { # Main Execution Flow # ========================================== ensure_tools -install_node +install_env build_project