name: CI on: push: branches: [master] pull_request: branches: [master] jobs: test: runs-on: debian-latest strategy: matrix: node-version: [18.x, 20.x, 22.x, 24.x] steps: - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} # v0.7.2-fix: 不用 cache —— Gitea act runner 对 setup-node 的 npm 缓存 # post 步骤(cache-save tar 打包)支持不完善,矩阵 job 并行时打包失败 # 会把整个 job 标红(即便 Run tests 已通过)。npm ci 每次 1~2 分钟可接受。 - name: Install dependencies run: npm ci # v0.8.0: 源码类型检查 - name: Type check (src) run: npm run typecheck # v0.8.0 新增:**测试代码**类型检查。 # 此前 tests/ 既不在 tsconfig include 中,babel-jest 又只剥离类型不做检查, # 于是测试里的类型错误、拼写错误、未 await 的断言全部不可见 # (审计实例:v025-fixes 里标题写 indexeddb、实际传 'opfs' 的用例长期存活)。 - name: Type check (tests) run: npm run typecheck:tests # v0.8.0: lint 不再 continue-on-error —— 此前 lint 失败永远不让 CI 变红, # 形同虚设。现在 src 与 tests 都纳入,0 error 才通过。 - name: Lint run: npm run lint # v0.7.2: Run tests 拆两步 —— 常规套件并行(快),重型套件串行(runInBand)。 # 此前重型测试(10 万行 kv/opfs、生产矩阵)与常规套件在慢 runner 上并行 # 争抢 CPU 与 4GB 堆 → 单测超时(120~180s)与 OOM 类假失败。 # # v0.8.0: 常规套件**带覆盖率**运行(此前 CI 从不跑 --coverage,且 jest.config # 没有任何 coverageThreshold → 覆盖率掉到 0% 也全绿)。阈值定义在 jest.config.cjs。 - name: Run tests (regular suites, with coverage gate) run: npx jest --coverage --forceExit --maxWorkers=1 --no-cache --testPathIgnorePatterns='/node_modules/|/tests/e2e/|aria-prod-load|kvstore-stress|aria-matrix-audit|aria-idx-flush-race' env: NODE_OPTIONS: --max-old-space-size=4096 # v0.7.3-ci: 重型套件只在单一 Node 版本(20.x LTS)跑一次 —— # 压力测试验证存储正确性/性能护栏,不依赖 Node 版本差异; # 4 个矩阵 job 并行时重型套件各占 ~1.2GB RSS(实测), # 4G 内存 runner 上 4 份并行必被 OOM killer 杀掉(exit 137)。 - name: Run tests (heavy suites, serial) if: matrix.node-version == '20.x' run: npx jest --forceExit --runInBand --no-cache tests/engine/aria-prod-load.test.ts tests/engine/kvstore-stress.test.ts tests/engine/aria-matrix-audit.test.ts tests/engine/aria-idx-flush-race.test.ts env: NODE_OPTIONS: --max-old-space-size=4096 - name: Build run: npm run build # v0.8.0: 校验仓库内 dist/ 与源码同步。 # 此前 dist/ 已提交入库(42 个提交都在改 dist),但 CI 只 build 到工作区、 # 不校验是否与源码一致 → 发布产物可以静默落后于源码。 # 仅在单一 Node 版本上校验(构建结果与 Node 版本无关)。 - name: Verify dist is in sync with src if: matrix.node-version == '20.x' run: | if ! git diff --quiet -- dist/; then echo "::error::dist/ 与源码不同步。请在本地运行 npm run build 并提交 dist/。" git diff --stat -- dist/ exit 1 fi echo "dist/ 与源码同步 ✓" e2e: runs-on: debian-latest # 与 MetonaEditor 一致:Playwright 官方镜像(自带 Chromium 与全部系统依赖), # 避免 runner 宿主(Debian 11)不被 Playwright 1.62 支持的问题 container: mcr.microsoft.com/playwright:v1.62.1-noble timeout-minutes: 20 steps: - uses: actions/checkout@v4 - name: Use Node.js uses: actions/setup-node@v4 with: node-version: 22.x # v0.7.2-fix: 同上,e2e job 也不用 npm 缓存(cache-save post 失败风险) - name: Install dependencies run: npm ci - name: Build run: npm run build - name: Verify Playwright browsers run: npx playwright install chromium # v0.8.0: e2e 覆盖真实崩溃注入(CDP Page.crash)与真实 OPFS 语义 - name: Run E2E tests run: npm run test:e2e