name: Regression # 每次 push / PR 自动跑回归。 # 目标:让质量不再依赖「人工记得跑」—— 这是 ROADMAP S1-P3 的核心价值。 # # 说明: # - playwright 是 devDependency(CI 专用工具),运行时依然零依赖。 # - dev-server 在 Ubuntu 上可正常跑(Node 脚本,跨平台)。 # - 失败时仍上传报告,便于排查。 on: push: branches: [main] pull_request: branches: [main] workflow_dispatch: jobs: regression: runs-on: ubuntu-latest timeout-minutes: 15 steps: - name: Checkout uses: actions/checkout@v4 - 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') }} restore-keys: | ${{ runner.os }}-playwright- - name: Install dependencies run: npm ci || npm install - name: Install playwright chromium run: npx playwright install --with-deps chromium - 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 & # 等服务就绪(最多 15 秒) 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 - name: Run regression run: node tools/run-regression.mjs - name: Upload report uses: actions/upload-artifact@v4 if: always() with: name: regression-report path: | tests/report.json tests/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('## 回归结果'); 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