Files
aurora-admin/.github/workflows/regression.yml
T
aurora-admin f1fbfc2ddb
Regression / regression (push) Canceled after 0s
feat(品牌标识): 几何 K 图标(favicon/顶栏标记/theme-color) + 并行会话成果入库
## 品牌标识(本次会话)

起因:品牌此前没有任何图形标识 —— 唯一 favicon 是内联 data-URI 里的字母「A」,
那是 v2.0.0「Aurora Admin → Kole UI」改名漏掉的一处(PC 顶栏也是「A」,
移动端站已是「K」;移动端文档站则完全没有 favicon)。

- 几何:24 网格三个互不接触的笔画(竖 + 两斜),圆头描边;
  描边 2.25 → 16px 标签页尺寸下正好 1.5px = 规范原文「描边1.5px」
- 取色分两套(刻意):favicon 硬编码品牌蓝/白(渲染在浏览器标签栏,不继承 kole-dark);
  顶栏标记走 currentColor(实测暗色下自动转 rgb(20,22,28))
- 新增 theme-color 双条(light #FFFFFF / dark #1C1F26,取 --kole-color-card-bg)
- 修 site/app.js hero 标语 KOLE ADMIN → KOLE UI(改名变形残留)
- 移动端 7 个模板补 favicon(此前计数 0)

验收:门禁 9 条全 OK(site-routing/site-routes/mobile-docs/mobile-site/isolation/
theme/nav/i18n/icons);PC 回归 1464/1464 · 移动端 807/807,各连跑 8 次一致;
两端 favicon 405 字节逐字节一致;PC 站控制台错误 1→0。

## 并行会话成果(本次一并入库)

- 图标系统:2576 图标(TDesign/Element Plus,MIT)+ 11 端注入 + 5 个构建门禁工具
  + IconPreview 预览页 + ICON-SPEC.md 冻结规格
- 移动端平台:47 组件 × 6 端 + 文档站 53 页 + 隔离门禁
- PC 组件:103 个大后台组件 / 组件11 批次
- uni-app:PC 端试点 + 移动端端实现 + 真实编译验证

## 工程

- .gitignore 补 .scratch/ 与 .zcode-preexisting-*.txt(会话中间产物,实测 9.1MB,不入库)
- CHANGELOG 补品牌标识条目
- ROADMAP 登 S8-P4(品牌标识任务包 + og:image/apple-touch-icon 未做部分)
2026-09-21 10:05:48 +08:00

233 lines
10 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
name: Regression
# 每次 push / PR 自动跑回归。
# 所有检查都在 Node 20 上执行;playwright 仅作为 CI 开发依赖。
on:
push:
branches: [main]
pull_request:
branches: [main]
workflow_dispatch:
permissions:
contents: read
jobs:
regression:
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- name: Checkout
uses: actions/checkout@v4
with:
persist-credentials: false
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Cache playwright browsers
uses: actions/cache@v4
with:
path: ~/.cache/ms-playwright
key: ${{ runner.os }}-playwright-${{ hashFiles('package.json', 'package-lock.json') }}
restore-keys: |
${{ runner.os }}-playwright-
- name: Install dependencies
run: npm ci
- name: Install playwright chromium
run: npx --no-install playwright install --with-deps chromium
# npm run verify:nav 的断言依赖字体度量(7 条链接的文字宽度决定顶栏装不装得下)。
# 缺 CJK 字体时中文会退化成豆腐块或拉丁回退,宽度随之改变 → 断言假失败。
- name: Install CJK fonts
run: sudo apt-get update -qq && sudo apt-get install -y -qq fonts-noto-cjk
- name: Verify zero runtime dependencies
run: |
node -e "
const p = require('./package.json');
const deps = Object.keys(p.dependencies || {});
if (deps.length) {
console.error('FAIL: 运行时依赖必须为空,实际: ' + deps.join(', '));
process.exit(1);
}
console.log('zero-dep OK');
"
- name: Start dev server
run: |
node site/dev-server.js &
for i in $(seq 1 30); do
if curl -sf http://127.0.0.1:3311/site/data.json > /dev/null; then
echo "server ready after ${i} attempt(s)"
exit 0
fi
sleep 0.5
done
echo "FAIL: dev-server 未在 15 秒内就绪"
exit 1
# 三套分发产物都要能重建:PC(dist/)+ 移动端(dist/mobile/)+ PC×uni-app(dist/uniapp-pc/)。
# dist/ 不入库,所以必须先构建,后面的隔离门禁(C 组)才检查得到真实产物。
- name: Build distribution artifacts
run: npm run build
# 移动端的 site/m 与 tests/mobile 是**生成物且入库**(与 PC 的 site/components、tests/<slug>.html 同策略:
# 部署直接拷仓库,不跑构建)。因此必须证明「仓库里的版本 = 构建能复现的版本」,
# 否则会出现「改了索引忘了重跑构建」→ 部署的仍是旧页面,且没有任何报错。
- name: Assert mobile artifacts are reproducible
run: |
if ! git diff --quiet -- site/m tests/mobile; then
echo "FAIL: 移动端生成物与仓库内已提交版本不一致,请重跑 npm run build:mobile 并提交"
git diff --stat -- site/m tests/mobile
exit 1
fi
echo "mobile artifacts reproducible"
# 隔离这种"没发生的事"只能靠断言证明:PC 的目录/数据/测试/分发里不得出现任何移动端痕迹,
# 移动端索引声明的 6 端文件必须齐全。28 条断言,见 tools/verify-mobile-isolation.mjs。
- name: Verify mobile isolation
run: npm run verify:isolation
# uni-app 端(移动端 18 个 + PC 端 3 个试点):SFC 结构 / node --check 语法 / 禁 DOM API /
# 手势必须 touch 事件 / 类名与令牌前缀按平台隔离 / 移动 rpx、PC px。
- name: Verify uni-app ends
run: npm run verify:uniapp
# uni-app **真实编译**(H5 + 微信小程序):静态门禁只能证明「源码长得合规」,
# 证明不了「编译器接受它」——本仓库有两次「静态全绿却编译不过」的实例
# (RangeQuickPicker 的 const 重赋值、CodeInput 的 emit 遮蔽),都是真编译才暴露的。
# 依赖装在隔离目录 .tmp/uniapp-build,主 job 的依赖不含 @dcloudio;
# 未缓存时**跳过并告警**而不是红:那是环境问题不是代码问题(脚本自身退出码 2)。
- name: Verify uni-app real build
run: |
if [ -d .tmp/uniapp-build/node_modules/@dcloudio ]; then
node tools/verify-uniapp-build.mjs
else
echo "::warning::uni-app 工具链未缓存,跳过真实编译验证(安装命令见 tools/verify-uniapp-build.mjs 头部)"
fi
# 移动端文档站的完整性(生成物的"缺内容"不会报错,只会悄悄少一块):
# 组件页 14 个小节齐全 / 侧栏列全组件且恰好一个高亮 / **契约 API 与 4 个框架端源码逐名一致**
# / 每端代码块非空 / 契约变体类名在 CSS 里真实存在 / 页面壳无残留占位符。
- name: Verify mobile docs completeness
run: npm run verify:mobile-docs
- name: Verify i18n
run: node tools/verify-i18n.mjs
# API 表说明的出处可溯性:每条说明都要能指认来源,「规格」类必须是规格原文逐字引用
# (判据与反例见 tools/verify-api-docs.mjs 头部)。
- name: Verify API docs provenance
run: npm run verify:api-docs
- name: Verify site routing
run: node tools/verify-site-routing.mjs
# 无 # 路由(History API)只在真浏览器里成立:服务器回落 + SPA 壳 <base> +
# 资源绝对地址 + pushState/历史四件事得同时对,静态检查只能证明文件里有那几行。
- name: Verify site routes in browser
run: node tools/verify-site-routes.mjs
- name: Verify cross-platform structure
run: node tools/verify-cross-platform.mjs
- name: Verify theme modes
run: node tools/verify-theme.mjs
# 模板页库(S4-P11):4 个典型后台页的浏览器实测 —— 令牌生效 / 非白屏 / 零控制台错误 /
# 逐页交互(表单校验、筛选分页、批量操作、抽屉、开关、保存与放弃)/ 375–1024px 无横向溢出。
# 静态检查证明不了「交互可用」,而模板页的价值恰恰全在交互上。
- name: Verify page templates
run: npm run verify:templates
# 演示帧内「覆盖型浮层」必须铺满真实视口:模态 / 图片预览 / 全屏弹窗 / 加载遮罩的
# position:fixed 以帧视口为包含块,而演示帧是按内容高度撑开的 —— 「点击图片只在
# 演示框内全屏」就是本脚本要拦的缺陷。含反向用例:贴边浮层与水印不得被提升。
- name: Verify stage overlay lift
run: npm run verify:stage-overlay
- name: Run regression
run: node tools/run-regression.mjs
# 移动端回归:同引擎同口径,不同数据源(site/m/data.mobile.json)与报告(tests/mobile-report.json)。
# 触控行为断言(滑动/下拉/标签切换)只在移动端行为库里,PC 侧不加载、不受影响。
- name: Run mobile regression
run: npm run regression:mobile
# 移动端文档站/测试站的浏览器实测:本次实测踩到「组件文档页资源路径少一级 → 样式与演示帧静默 404,
# 页面文字照常显示、结构断言全过」。四类取值只能在真浏览器里拿到:HTTP 状态、控制台错误、
# 演示帧是否真有内容(不是 404 页)、令牌是否解析成 44px。
- name: Verify mobile site in browser
run: npm run verify:mobile-site
- name: Smoke test site
run: npm run smoke:site
# 顶栏窄屏折叠(≤1366px 汉堡 + 抽屉):18 个宽度 × 中英双语 + 抽屉交互,约 35 秒。
# 必须在浏览器里跑 —— 元素"可见"不等于"点得到":遮罩层叠、visibility 过渡
# 都会让点击静默失效,而矩形与可见性断言全都会通过(改动前实测踩中两个)。
- name: Verify responsive nav
run: npm run verify:nav
# 「在线测试」页把用户编辑的 HTML 灌进 iframe 跑,是站上唯一的不可信内容入口。
# 安全边界(不透明源 / sandbox 权限 / 两条 CSP 取交集)与预览帧的资源基准
# (srcdoc 继承父页 URL,演示源码里的 ./Xxx.css 会解析错)都只在真浏览器里可判:
# 静态读代码只能看到属性字符串,看不到"到底拦没拦住、样式落在哪个 URL"。
- name: Verify playground
run: npm run verify:playground
- name: Upload report
uses: actions/upload-artifact@v4
if: always()
with:
name: regression-report
path: |
tests/report.json
tests/report-junit.xml
tests/cross-platform-report.json
tests/mobile-report.json
tests/mobile-report-junit.xml
retention-days: 30
- name: Publish test summary
if: always()
run: |
if [ -f tests/report.json ]; then
node -e "
const r = require('./tests/report.json');
const a = r.assertions;
console.log('## 回归结果(PC)');
console.log('');
console.log('| 项 | 值 |');
console.log('|---|---|');
console.log('| 通过率 | ' + r.passRate + '% |');
console.log('| 断言 | ' + a.pass + '/' + (a.pass + a.fail) + ' |');
console.log('| N/A | ' + (a.na || 0) + ' |');
console.log('| 页面全通过 | ' + r.pagesAllPass + '/' + r.pages + ' |');
console.log('| 超时 | ' + ((r.timedOut || []).length) + ' |');
" >> "$GITHUB_STEP_SUMMARY"
fi
if [ -f tests/mobile-report.json ]; then
node -e "
const r = require('./tests/mobile-report.json');
const a = r.assertions;
console.log('');
console.log('## 回归结果(移动端)');
console.log('');
console.log('| 项 | 值 |');
console.log('|---|---|');
console.log('| 通过率 | ' + r.passRate + '% |');
console.log('| 断言 | ' + a.pass + '/' + (a.pass + a.fail) + ' |');
console.log('| N/A | ' + (a.na || 0) + ' |');
console.log('| 页面全通过 | ' + r.pagesAllPass + '/' + r.pages + ' |');
console.log('| 超时 | ' + ((r.timedOut || []).length) + ' |');
" >> "$GITHUB_STEP_SUMMARY"
fi