name: Epic UI Build & Deploy run-name: ${{ gitea.actor }} 正在构建 Epic UI 前端项目 🚀 on: push: branches: [ main, master, develop ] pull_request: branches: [ main, master ] jobs: build: runs-on: gitea_labels container: image: gitea-ci-bash:latest env: # 指定容器将工具缓存路径存放到 /opt/hostedtoolcache,该目录是Gitea Runner的标准工具缓存目录 RUNNER_TOOL_CACHE: /opt/hostedtoolcache steps: - name: 检出代码 shell: bash run: | echo "📥 检出代码到工作目录..." # 解析分支名 BRANCH_NAME=$(echo "${{ gitea.ref }}" | sed 's#refs/heads/##') # 拉取代码(使用token鉴权) git clone --depth=1 -b "$BRANCH_NAME" "http://1c18ee1ab9a9cb291506d0c5c016a33be7d59e8c:x-oauth-basic@gitea.htoop.cn/${{ gitea.repository }}.git" . echo "✅ 代码检出成功" - name: 安装Node.js环境 shell: bash run: | echo "🔧 安装Node.js环境..." if command -v node &> /dev/null; then echo "✅ Node.js已安装: $(node --version)" else echo "📥 下载并安装Node.js..." NODE_VERSION="18.19.0" NODE_ARCH="linux-x64" MIRRORS=( "https://mirrors.aliyun.com/nodejs-release/v${NODE_VERSION}/node-v${NODE_VERSION}-${NODE_ARCH}.tar.xz" "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-${NODE_ARCH}.tar.xz" ) DOWNLOAD_SUCCESS=false for mirror in "${MIRRORS[@]}"; do echo "尝试从镜像下载: $mirror" if wget -q --timeout=30 --tries=3 "$mirror" -O node.tar.xz; then echo "✅ 下载成功: $mirror" DOWNLOAD_SUCCESS=true break else echo "❌ 下载失败: $mirror" continue fi done if [ "$DOWNLOAD_SUCCESS" = false ]; then echo "❌ 所有镜像源下载失败" exit 1 fi echo "解压Node.js到/usr/local..." tar -C /usr/local -xJf node.tar.xz --strip-components=1 export PATH=$PATH:/usr/local/bin rm node.tar.xz echo "✅ Node.js安装完成" fi - name: 恢复pnpm缓存 shell: bash run: | echo "📦 恢复pnpm缓存..." export PATH=$PATH:/usr/local/bin # 检查缓存的pnpm PNPM_CACHE_DIR="/opt/hostedtoolcache/pnpm-bin" if [ -f "$PNPM_CACHE_DIR/pnpm" ]; then echo "✅ 找到缓存的pnpm: $PNPM_CACHE_DIR/pnpm" # 将缓存的pnpm添加到PATH export PATH="$PNPM_CACHE_DIR:$PATH" echo "✅ pnpm已恢复: $(pnpm --version)" else echo "📥 未找到缓存的pnpm,将重新安装..." # 安装pnpm到缓存目录 mkdir -p "$PNPM_CACHE_DIR" npm install -g pnpm --prefix "$PNPM_CACHE_DIR" # 找到安装的pnpm并添加到PATH PNPM_PATH="$PNPM_CACHE_DIR/node_modules/.bin/pnpm" if [ -f "$PNPM_PATH" ]; then export PATH="$PNPM_CACHE_DIR/node_modules/.bin:$PATH" echo "✅ pnpm安装完成: $(pnpm --version)" else echo "❌ pnpm安装失败" exit 1 fi fi - name: 配置pnpm缓存 shell: bash run: | echo "📦 配置pnpm缓存..." export PATH=$PATH:/usr/local/bin # 配置pnpm缓存目录 PNPM_CACHE_DIR="/opt/hostedtoolcache/pnpm-store" mkdir -p "$PNPM_CACHE_DIR" # 设置pnpm使用缓存目录 pnpm config set store-dir "$PNPM_CACHE_DIR" pnpm config set cache-dir "/opt/hostedtoolcache/pnpm-cache" echo "✅ pnpm缓存配置完成" - name: 恢复依赖缓存 shell: bash run: | echo "📦 检查并恢复依赖缓存..." export PATH=$PATH:/usr/local/bin # 生成缓存键 CACHE_KEY=$(md5sum pnpm-lock.yaml | cut -d' ' -f1) echo "缓存键: $CACHE_KEY" # 使用 /opt/hostedtoolcache 目录 CACHE_FILE="/opt/hostedtoolcache/node_modules_${CACHE_KEY}.tar.gz" echo "📁 检查缓存文件: $CACHE_FILE" if [ -f "$CACHE_FILE" ]; then echo "✅ 找到缓存文件: $CACHE_FILE" echo "📦 缓存文件大小: $(du -sh "$CACHE_FILE" | cut -f1)" echo "正在恢复缓存..." if tar -xzf "$CACHE_FILE"; then echo "✅ 缓存恢复成功" echo "📦 恢复的 node_modules 大小:" du -sh node_modules 2>/dev/null || echo "node_modules 目录不存在" else echo "❌ 缓存恢复失败" echo "📥 将重新安装依赖" fi else echo "📥 未找到缓存文件,将重新安装依赖" fi - name: 安装项目依赖 shell: bash run: | echo "📦 安装项目依赖..." export PATH=$PATH:/usr/local/bin # 检查是否已有node_modules if [ -d "node_modules" ] && [ -f "node_modules/.pnpm-debug.log" ]; then echo "✅ 检测到已存在的依赖,跳过安装" else echo "📥 安装项目依赖..." pnpm install --frozen-lockfile --prefer-offline echo "✅ 依赖安装完成" fi - name: 保存依赖缓存 shell: bash run: | echo "💾 保存依赖缓存..." export PATH=$PATH:/usr/local/bin # 生成缓存键 CACHE_KEY=$(md5sum pnpm-lock.yaml | cut -d' ' -f1) echo "缓存键: $CACHE_KEY" # 检查node_modules是否存在 if [ ! -d "node_modules" ]; then echo "❌ node_modules 目录不存在,跳过缓存保存" exit 0 fi # 保存到 /opt/hostedtoolcache 目录 CACHE_FILE="/opt/hostedtoolcache/node_modules_${CACHE_KEY}.tar.gz" echo "📦 正在创建缓存文件: $CACHE_FILE" if tar -czf "$CACHE_FILE" node_modules; then echo "✅ 缓存已保存到: $CACHE_FILE" echo "📦 缓存文件大小: $(du -sh "$CACHE_FILE" | cut -f1)" else echo "❌ 缓存保存失败" exit 1 fi - name: 保存pnpm缓存 shell: bash run: | echo "💾 保存pnpm缓存..." export PATH=$PATH:/usr/local/bin # 保存pnpm二进制文件 PNPM_BIN_DIR="/opt/hostedtoolcache/pnpm-bin" if [ -f "$PNPM_BIN_DIR/pnpm" ]; then echo "✅ pnpm二进制文件已缓存" else echo "📥 复制pnpm到缓存目录..." mkdir -p "$PNPM_BIN_DIR" # 找到pnpm的位置并复制 PNPM_PATH=$(which pnpm 2>/dev/null || echo "") if [ -n "$PNPM_PATH" ] && [ -f "$PNPM_PATH" ]; then cp "$PNPM_PATH" "$PNPM_BIN_DIR/" echo "✅ pnpm已保存到缓存: $PNPM_BIN_DIR/pnpm" else # 尝试从node_modules复制 NODE_MODULES_PNPM="/opt/hostedtoolcache/pnpm-bin/node_modules/.bin/pnpm" if [ -f "$NODE_MODULES_PNPM" ]; then cp "$NODE_MODULES_PNPM" "$PNPM_BIN_DIR/" echo "✅ pnpm已保存到缓存: $PNPM_BIN_DIR/pnpm" else echo "⚠️ 无法找到pnpm,跳过保存" fi fi fi - name: 构建项目 shell: bash run: | echo "🔨 构建 Epic UI 前端项目..." export PATH=$PATH:/usr/local/bin # 执行构建 pnpm build echo "✅ 构建完成" - name: 检查构建产物 shell: bash run: | echo "📦 构建产物信息:" if [ -d "dist" ]; then echo "✅ 找到dist目录" ls -la dist/ echo "dist目录大小: $(du -sh dist | cut -f1)" else echo "❌ 未找到dist目录" exit 1 fi - name: 显示项目信息 shell: bash run: | echo "📋 项目信息:" export PATH=$PATH:/usr/local/bin echo "Node.js 版本: $(node --version)" echo "npm 版本: $(npm --version)" echo "pnpm 版本: $(pnpm --version)" echo "构建时间: $(date)" echo "分支: ${{ gitea.ref }}" echo "提交: ${{ gitea.sha }}"