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 }} jobs: # ========== 阶段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: Checkout uses: actions/checkout@v4 with: fetch-depth: 1 - name: Upload Artifact uses: actions/upload-artifact@v3 with: name: source-${{ github.sha }} path: ./Assets/ retention-days: 1 # ========== 阶段3:并行发布(仅发布变更的模块) ========== publish: 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: 4 # 根据你的Runner资源调整,4-6通常安全 matrix: module: ${{ fromJSON(needs.detect-changes.outputs.modules) }} # 动态矩阵,只跑变更的模块 steps: # 直接下载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: | echo "//${{ env.SERVER_HOST }}/:_authToken=${{ env.AuthToken }}" > .npmrc echo "registry=http://${{ env.SERVER_HOST }}/npm" >> .npmrc - name: Publish ${{ matrix.module }} working-directory: ./Assets/${{ matrix.module }} run: | CURRENT_VERSION=$(node -p "require('./package.json').version") echo "🚀 发布 ${{ matrix.module }}@$CURRENT_VERSION" # 先检查是否已存在该版本,避免重复发布错误 if npm view ${{ matrix.module }}@$CURRENT_VERSION version &>/dev/null; then echo "⚠️ 版本 $CURRENT_VERSION 已存在,跳过" exit 0 fi npm publish --access public || echo "❌ 发布失败" # ========== 阶段4:清理 ========== cleanup: needs: [publish, detect-changes] if: always() runs-on: dev steps: - name: Delete Artifact uses: actions/delete-artifact@v3 with: name: source-${{ github.sha }} failOnError: false