更新 .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:
|
||||
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
|
||||
Reference in New Issue
Block a user