更新 .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
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:
@@ -1,123 +1,137 @@
|
|||||||
name: Plugin Library CI
|
name: Plugin Library CI (Optimized)
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [master, main]
|
branches: [master, main]
|
||||||
|
paths:
|
||||||
|
- 'Assets/**/package.json' # 只在版本文件变更时触发
|
||||||
|
- '.gitea/workflows/**'
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
SERVER_HOST: ${{ vars.SERVER_HOST }}
|
SERVER_HOST: ${{ vars.SERVER_HOST }}
|
||||||
AuthToken: ${{ vars.AUTH_TOKEN }}
|
AuthToken: ${{ vars.AUTH_TOKEN }}
|
||||||
# 定义本地缓存路径:按仓库+Commit ID 组织,避免冲突
|
|
||||||
CACHE_PATH: /srv/ci-cache/${{ github.repository }}/${{ github.sha }}
|
|
||||||
|
|
||||||
jobs:
|
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:
|
prepare:
|
||||||
|
needs: detect-changes
|
||||||
|
if: needs.detect-changes.outputs.matrix-empty == 'false'
|
||||||
runs-on: dev
|
runs-on: dev
|
||||||
container:
|
container:
|
||||||
image: node:18-alpine
|
image: node:18-alpine
|
||||||
steps:
|
steps:
|
||||||
- name: Install Tools
|
- name: Checkout
|
||||||
run: apk add --no-cache git tar gzip
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Checkout Repository
|
|
||||||
uses: http://106.52.62.106:3000/unity-registry/checkout@v4
|
|
||||||
with:
|
with:
|
||||||
fetch-depth: 1
|
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
|
# ========== 阶段3:并行发布(仅发布变更的模块) ==========
|
||||||
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:
|
publish:
|
||||||
needs: prepare
|
needs: [detect-changes, prepare]
|
||||||
|
if: needs.detect-changes.outputs.matrix-empty == 'false'
|
||||||
runs-on: dev
|
runs-on: dev
|
||||||
container:
|
container:
|
||||||
image: node:18-alpine
|
image: node:18-alpine
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
max-parallel: 2
|
# max-parallel: 4 # 根据你的Runner资源调整,4-6通常安全
|
||||||
matrix:
|
matrix:
|
||||||
module:
|
module: ${{ fromJSON(needs.detect-changes.outputs.modules) }} # 动态矩阵,只跑变更的模块
|
||||||
- 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:
|
steps:
|
||||||
# 关键优化:从本地 /srv 解压,无需任何网络操作
|
# 直接下载artifact,无需tar/untar
|
||||||
- name: Extract Source from /srv
|
- name: Download Source
|
||||||
run: |
|
uses: actions/download-artifact@v3
|
||||||
echo "📦 从本地缓存解压: ${{ env.CACHE_PATH }}/source.tar.gz"
|
with:
|
||||||
|
name: source-${{ github.sha }}
|
||||||
# 直接解压到 Gitea 默认工作目录(通常是 /workspace)
|
path: ./Assets/
|
||||||
mkdir -p ${{ github.workspace }}
|
|
||||||
tar xzf ${{ env.CACHE_PATH }}/source.tar.gz -C ${{ github.workspace }}
|
|
||||||
|
|
||||||
# 验证文件存在(调试用,稳定后可删除)
|
|
||||||
ls -la ${{ github.workspace }}/Assets/${{ matrix.module }}/package.json
|
|
||||||
|
|
||||||
|
# 使用setup-node缓存(如果Gitea支持)
|
||||||
- name: Setup Node.js
|
- 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: |
|
run: |
|
||||||
ln -sf /srv/18-alpine/bin/node /usr/bin/node
|
echo "//${{ env.SERVER_HOST }}/:_authToken=${{ env.AuthToken }}" > .npmrc
|
||||||
ln -sf /srv/18-alpine/bin/npm /usr/bin/npm
|
echo "registry=http://${{ env.SERVER_HOST }}/npm" >> .npmrc
|
||||||
node -v
|
|
||||||
|
|
||||||
- name: Publish ${{ matrix.module }}
|
- name: Publish ${{ matrix.module }}
|
||||||
working-directory: ${{ github.workspace }}/Assets/${{ matrix.module }}
|
working-directory: ./Assets/${{ matrix.module }}
|
||||||
run: |
|
run: |
|
||||||
echo "🚀 开始发布 ${{ matrix.module }}"
|
|
||||||
|
|
||||||
CURRENT_VERSION=$(node -p "require('./package.json').version")
|
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
|
if npm view ${{ matrix.module }}@$CURRENT_VERSION version &>/dev/null; then
|
||||||
echo "//${SERVER_HOST}/:_authToken=${AuthToken}" >> .npmrc
|
echo "⚠️ 版本 $CURRENT_VERSION 已存在,跳过"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
# 发布(失败不阻断其他任务)
|
npm publish --access public || echo "❌ 发布失败"
|
||||||
npm publish || echo "⚠️ 发布失败,继续执行"
|
|
||||||
|
|
||||||
echo "✅ ${{ matrix.module }} 处理完成"
|
|
||||||
|
|
||||||
- name: Job Complete
|
# ========== 阶段4:清理 ==========
|
||||||
if: always()
|
|
||||||
run: echo "======== ${{ matrix.module }} 发布 Job 结束 ========"
|
|
||||||
|
|
||||||
# ========== 阶段3:清理(可选但推荐) ==========
|
|
||||||
cleanup:
|
cleanup:
|
||||||
needs: publish
|
needs: [publish, detect-changes]
|
||||||
|
if: always()
|
||||||
runs-on: dev
|
runs-on: dev
|
||||||
if: always() # 即使发布失败也清理,防止磁盘堆积
|
|
||||||
container:
|
|
||||||
image: alpine:latest
|
|
||||||
steps:
|
steps:
|
||||||
- name: Remove Local Cache
|
- name: Delete Artifact
|
||||||
run: |
|
uses: actions/delete-artifact@v3
|
||||||
echo "🧹 清理临时文件: ${{ env.CACHE_PATH }}"
|
with:
|
||||||
rm -rf ${{ env.CACHE_PATH }}
|
name: source-${{ github.sha }}
|
||||||
# 如果上层目录为空,也一并删除
|
failOnError: false
|
||||||
rmdir $(dirname ${{ env.CACHE_PATH }}) 2>/dev/null || true
|
|
||||||
echo "✅ 清理完成"
|
|
||||||
Reference in New Issue
Block a user