Skip to content

ci: implement full client test matrix covering all compatible versions and modloaders - #401

Open
ZekerZhayard wants to merge 2 commits into
xfl03:15-developfrom
ZekerZhayard:15/ci-test
Open

ZekerZhayard wants to merge 2 commits into
xfl03:15-developfrom
ZekerZhayard:15/ci-test

Conversation

@ZekerZhayard

@ZekerZhayard ZekerZhayard commented Oct 7, 2026 •

Copy link
Copy Markdown
Collaborator

人写的:

看这大半年 AI 宣传得天花乱坠,本来以为 AI 能包办大部分代码了,结果不知道是我的提示词写得不好还是咋的,在浪费了一百块钱的 token 之后,还是回到了「先让 AI 拉一坨大的,然后人工屎上雕花」的开发模式上来。

在开发之前以为没什么难度的,只需要 写个启动器->把服务器开起来->让客户端进服->截图 这么个流程就结束了,结果发现坑还不少,至少踩了以下的坑:

大肥鱼写的(单击展开):

概述

本 PR 为 CustomSkinLoader 引入完整的客户端自动化测试矩阵:在 PR / Beta 构建完成后,CI 会针对 build.info.json 中列出的全部游戏版本(1.8 ~ 26.3),自动匹配可用的 Fabric / Forge / NeoForge / Quilt 加载器,启动真实服务端与客户端,验证皮肤与披风的加载及渲染结果。

主要改动

CI 工作流

  • 新增可复用的 test.yml(workflow_call),由 pull-request.yml 与 beta.yml 在 build 之后调用。
  • prepare 作业在 windows-latest 上构建测试 installer 并生成测试矩阵;test 作业最多 20 并发、fail-fast: false,单个版本失败不影响其他版本。
  • 无论成败都会收集崩溃报告、日志、截图与 CustomSkinLoader.log,并合并为 all-test-diagnostics 产物。

矩阵生成与环境准备

  • Prepare-TestMatrix.ps1:从 Mojang version manifest、Fabric/Quilt meta、Forge/NeoForge Maven metadata 解析每个游戏版本可用的加载器及最新构建,输出 version / json_url / json_sha1 / loaders 矩阵。
  • Prepare-TestVersion.ps1:下载并 SHA-1 校验版本 JSON、Mojang 官方 Java 运行时与 Mesa3D 软件渲染;调用各加载器 installer(Forge 经测试 installer 驱动旧版 Swing GUI);解析 inheritsFrom 链并下载客户端/服务端/库/natives/资源/日志配置;为每个客户端生成自包含启动脚本(含 rules 求值、参数模板与 classpath 去重)。
  • ExternalArgs.psd1:集中管理特定版本所需的 workaround(如 javaagent 与 Quilt 的 blocklist 依赖)。

测试执行

  • Run-TestJob.ps1:启动本地服务端后依次启动客户端,通过日志标记('s profile loaded. 等)判定皮肤加载成功;30 秒无输出视为卡死,失败自动重试最多 3 次;随后发送 F5 / Tab / F2 截图,覆盖第三人称皮肤与玩家列表头像渲染。

测试侧代码(Test/)

  • 新增基于 ASM 的 javaagent,仅用于规避测试环境中的上游问题:Forge 网络重连(1.13.2 ~ 1.14.3)、旧版本自动连接(部分 Fabric/Quilt/Forge 版本)、Authlib 权限(1.16.4 ~ 1.16.5)、NeoForge 网络过滤器并发(1.20.5 ~ 26.1.2);不会进入发布产物。
  • 新增 legacy Forge installer 自动化入口 customskinloader.test.installer.Main。
  • 补充测试客户端配置(本地皮肤/披风、options.txt、eula.txt、server.properties)。

顺带修复

  • mapping.xml:PlayerTabOverlay 的 SRG 类名按版本拆分——1.13.2 及以下为 GuiPlayerTabOverlay,1.14.2 ~ 1.16.5 为 PlayerTabOverlayGui。
  • BytecodeRemapper:读取继承信息失败时捕获 Exception 而非仅 IOException,避免非 IO 异常中断映射解析。
  • 移除 publish action 与 Get-PublishInfo.ps1 中冗余的产物存在性校验。

验证方式

  • 本地构建测试 installer:./gradlew.bat -p Test build
  • 提交 PR 后,pull-request 工作流会在 build 完成后自动运行全部版本矩阵;所有客户端应输出皮肤加载标记并成功生成截图。

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant