name: Plugin Library CI on: push: branches: [master, main] workflow_dispatch: env: SERVER_HOST: ${{ vars.SERVER_HOST }} AuthToken: ${{ vars.AUTH_TOKEN }} # 定义本地缓存路径:按仓库+Commit ID 组织,避免冲突 CACHE_PATH: /srv/ci-cache/${{ github.repository }}/${{ github.sha }} jobs: # ========== 阶段1:一次性准备代码包 ========== prepare: runs-on: dev container: image: node:18-alpine steps: - name: Install Tools run: apk add --no-cache git tar gzip - name: Checkout Repository uses: http://106.52.62.106:3000/unity-registry/checkout@v4 with: fetch-depth: 1 single-branch: true - name: Pack Code to /srv run: | # 创建目录结构(按仓库和 Commit 分层,防止冲突) mkdir -p ${{ env.CACHE_PATH }} # 打包当前工作区到 /srv(排除 .git 节省空间) tar czf ${{ env.CACHE_PATH }}/source.tar.gz --exclude='.git' -C ${{ github.workspace }} . echo "✅ 代码已打包到: ${{ env.CACHE_PATH }}/source.tar.gz" ls -lh ${{ env.CACHE_PATH }}/source.tar.gz # ========== 阶段2:并行发布(直接从 /srv 加载) ========== publish: needs: prepare runs-on: dev container: image: node:18-alpine strategy: fail-fast: false max-parallel: 2 matrix: module: - 00.StaryEvo - 00.StaryEvoTools - 00.BuildOriginality - 00.ARMazTools - 01.HybridCLR - 02.InformationSave - 03.YooAsset - 04.AudioCore - 05.TableTextConversion - 06.UIFarme - 07.RKTools - 08.UniTask - 09.CodeChecker - 10.StoryEditor - 10.XNode - 11.PointCloudTools steps: # 关键优化:从本地 /srv 解压,无需任何网络操作 - name: Extract Source from /srv run: | echo "📦 从本地缓存解压: ${{ env.CACHE_PATH }}/source.tar.gz" # 直接解压到 Gitea 默认工作目录(通常是 /workspace) mkdir -p ${{ github.workspace }} tar xzf ${{ env.CACHE_PATH }}/source.tar.gz -C ${{ github.workspace }} # 验证文件存在(调试用,稳定后可删除) ls -la ${{ github.workspace }}/Assets/${{ matrix.module }}/package.json - name: Setup Node.js run: | ln -sf /srv/18-alpine/bin/node /usr/bin/node ln -sf /srv/18-alpine/bin/npm /usr/bin/npm node -v - name: Publish ${{ matrix.module }} working-directory: ${{ github.workspace }}/Assets/${{ matrix.module }} run: | echo "🚀 开始发布 ${{ matrix.module }}" CURRENT_VERSION=$(node -p "require('./package.json').version") echo "当前版本: $CURRENT_VERSION" # 配置 npm registry echo "registry=http://${SERVER_HOST}/npm" > .npmrc echo "//${SERVER_HOST}/:_authToken=${AuthToken}" >> .npmrc # 发布(失败不阻断其他任务) npm publish || echo "⚠️ 发布失败,继续执行" echo "✅ ${{ matrix.module }} 处理完成" - name: Job Complete if: always() run: echo "======== ${{ matrix.module }} 发布 Job 结束 ========" # ========== 阶段3:清理(可选但推荐) ========== cleanup: needs: publish runs-on: dev if: always() # 即使发布失败也清理,防止磁盘堆积 container: image: alpine:latest steps: - name: Remove Local Cache run: | echo "🧹 清理临时文件: ${{ env.CACHE_PATH }}" rm -rf ${{ env.CACHE_PATH }} # 如果上层目录为空,也一并删除 rmdir $(dirname ${{ env.CACHE_PATH }}) 2>/dev/null || true echo "✅ 清理完成"