diff --git a/.gitea/workflows/.gitlab-ci.yml b/.gitea/workflows/.gitlab-ci.yml index c6933a4..f5c4e9f 100644 --- a/.gitea/workflows/.gitlab-ci.yml +++ b/.gitea/workflows/.gitlab-ci.yml @@ -1,123 +1,137 @@ -name: Plugin Library CI +name: Plugin Library CI (Optimized) on: push: branches: [master, main] + paths: + - 'Assets/**/package.json' # 只在版本文件变更时触发 + - '.gitea/workflows/**' 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:一次性准备代码包 ========== + # ========== 阶段1:检测变更模块 ========== + detect-changes: + runs-on: dev + container: + image: node:18-alpine # 建议替换为包含git的自定义镜像 + outputs: + modules: ${{ steps.filter.outputs.modules }} + matrix-empty: ${{ steps.filter.outputs.empty }} + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 2 # 需要对比上一个commit + + - name: Detect Changed Modules + id: filter + run: | + # 获取变更的文件 + CHANGED_FILES=$(git diff --name-only HEAD~1 HEAD) + + # 检测哪些模块的package.json变更了 + MODULES=() + for module in $(ls -d Assets/*/); do + MODULE_NAME=$(basename $module) + if echo "$CHANGED_FILES" | grep -q "^${module}package.json"; then + MODULES+=("\"$MODULE_NAME\"") + fi + done + + # 输出JSON数组给矩阵使用 + if [ ${#MODULES[@]} -eq 0 ]; then + echo "empty=true" >> $GITHUB_OUTPUT + echo "modules=[]" >> $GITHUB_OUTPUT + echo "📭 无模块版本变更,跳过发布" + else + echo "empty=false" >> $GITHUB_OUTPUT + echo "modules=[${MODULES[*]}]" >> $GITHUB_OUTPUT + echo "📦 待发布模块: ${MODULES[*]}" + fi + + # ========== 阶段2:准备代码(仅当有变更时) ========== prepare: + needs: detect-changes + if: needs.detect-changes.outputs.matrix-empty == 'false' 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 + - name: Checkout + uses: actions/checkout@v4 with: fetch-depth: 1 - single-branch: true + + - name: Upload Artifact + uses: actions/upload-artifact@v3 + with: + name: source-${{ github.sha }} + path: ./Assets/ + retention-days: 1 - - 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 加载) ========== + # ========== 阶段3:并行发布(仅发布变更的模块) ========== publish: - needs: prepare + needs: [detect-changes, prepare] + if: needs.detect-changes.outputs.matrix-empty == 'false' runs-on: dev container: image: node:18-alpine strategy: fail-fast: false - max-parallel: 2 + # max-parallel: 4 # 根据你的Runner资源调整,4-6通常安全 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 - + module: ${{ fromJSON(needs.detect-changes.outputs.modules) }} # 动态矩阵,只跑变更的模块 + 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 + # 直接下载artifact,无需tar/untar + - name: Download Source + uses: actions/download-artifact@v3 + with: + name: source-${{ github.sha }} + path: ./Assets/ + # 使用setup-node缓存(如果Gitea支持) - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '18' + registry-url: 'http://${{ env.SERVER_HOST }}/npm' + cache: 'npm' + cache-dependency-path: './Assets/${{ matrix.module }}/package.json' + + # 配置npm认证 + - name: Configure NPM + working-directory: ./Assets/${{ matrix.module }} run: | - ln -sf /srv/18-alpine/bin/node /usr/bin/node - ln -sf /srv/18-alpine/bin/npm /usr/bin/npm - node -v + echo "//${{ env.SERVER_HOST }}/:_authToken=${{ env.AuthToken }}" > .npmrc + echo "registry=http://${{ env.SERVER_HOST }}/npm" >> .npmrc - name: Publish ${{ matrix.module }} - working-directory: ${{ github.workspace }}/Assets/${{ matrix.module }} + working-directory: ./Assets/${{ matrix.module }} run: | - echo "🚀 开始发布 ${{ matrix.module }}" - CURRENT_VERSION=$(node -p "require('./package.json').version") - echo "当前版本: $CURRENT_VERSION" + echo "🚀 发布 ${{ matrix.module }}@$CURRENT_VERSION" - # 配置 npm registry - echo "registry=http://${SERVER_HOST}/npm" > .npmrc - echo "//${SERVER_HOST}/:_authToken=${AuthToken}" >> .npmrc + # 先检查是否已存在该版本,避免重复发布错误 + if npm view ${{ matrix.module }}@$CURRENT_VERSION version &>/dev/null; then + echo "⚠️ 版本 $CURRENT_VERSION 已存在,跳过" + exit 0 + fi - # 发布(失败不阻断其他任务) - npm publish || echo "⚠️ 发布失败,继续执行" - - echo "✅ ${{ matrix.module }} 处理完成" + npm publish --access public || echo "❌ 发布失败" - - name: Job Complete - if: always() - run: echo "======== ${{ matrix.module }} 发布 Job 结束 ========" - - # ========== 阶段3:清理(可选但推荐) ========== + # ========== 阶段4:清理 ========== cleanup: - needs: publish + needs: [publish, detect-changes] + if: always() 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 "✅ 清理完成" \ No newline at end of file + - name: Delete Artifact + uses: actions/delete-artifact@v3 + with: + name: source-${{ github.sha }} + failOnError: false \ No newline at end of file