更新 .gitea/workflows/.gitlab-ci.yml
Some checks failed
Plugin Library CI (Optimized) / detect-changes (push) Failing after 5m19s
Plugin Library CI (Optimized) / prepare (push) Has been skipped
Plugin Library CI (Optimized) / publish (push) Has been skipped
Plugin Library CI (Optimized) / cleanup (push) Failing after 1m30s

This commit is contained in:
2026-04-11 11:21:43 +08:00
parent c486462a8c
commit dd26da3757

View File

@@ -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 "✅ 清理完成"
- name: Delete Artifact
uses: actions/delete-artifact@v3
with:
name: source-${{ github.sha }}
failOnError: false