ci / 质量门禁 (push) Failing after 2m12s
背景:run #39 在第 8 步「单元测试与覆盖率」失败,日志报 环境变量校验失败:DATABASE_URL / REDIS_URL / JWT_ACCESS_SECRET / JWT_REFRESH_SECRET Required—— ci.yml 写的是 JWT_SECRET(应用实际读 JWT_ACCESS_SECRET 且要求 ≥32 位); 另集成测试依赖 seed 的部门 content-g1 与示例角色,ci.yml 只有 migrate deploy 无 seed。 改动: - JWT_SECRET 改为 JWT_ACCESS_SECRET,access / refresh 密钥均补足 32 位; - 「数据库迁移」步骤补充 pnpm db:seed(与本地 ci:local 对齐)。 影响面:仅 CI job env 与步骤,不改应用代码;种子只作用于 CI 的空库。 回滚方式:revert 本提交。 验证证据:推送后 run 上一次已推进到 Lint/类型检查通过(前两处修复生效),本次继续验证单测与后续链路。
127 lines
3.3 KiB
YAML
127 lines
3.3 KiB
YAML
# 自建 Gitea 已部署 Actions runner(gitea-runner-01,label ubuntu-latest):
|
||
# push main 自动执行,也可在 Actions 页面手动触发。轻量冒烟见 ci-smoke.yml。
|
||
# 本地等价命令:pnpm ci:local(推送前仍必须全绿,远端 CI 是第二道防线)。
|
||
name: ci
|
||
|
||
on:
|
||
push:
|
||
branches: [main]
|
||
workflow_dispatch:
|
||
|
||
concurrency:
|
||
group: ci-${{ github.ref }}
|
||
cancel-in-progress: true
|
||
|
||
jobs:
|
||
verify:
|
||
name: 质量门禁
|
||
runs-on: ubuntu-latest
|
||
timeout-minutes: 30
|
||
|
||
services:
|
||
postgres:
|
||
image: postgres:18-alpine
|
||
env:
|
||
POSTGRES_USER: postgres
|
||
POSTGRES_PASSWORD: postgres
|
||
POSTGRES_DB: lingxi_test
|
||
ports:
|
||
- 5432:5432
|
||
options: >-
|
||
--health-cmd "pg_isready -U postgres -d lingxi_test"
|
||
--health-interval 5s
|
||
--health-timeout 3s
|
||
--health-retries 10
|
||
redis:
|
||
image: redis:7.4-alpine
|
||
ports:
|
||
- 6379:6379
|
||
options: >-
|
||
--health-cmd "redis-cli ping"
|
||
--health-interval 5s
|
||
--health-timeout 3s
|
||
--health-retries 10
|
||
|
||
env:
|
||
NODE_ENV: test
|
||
LOG_LEVEL: error
|
||
DATABASE_URL: postgresql://postgres:postgres@127.0.0.1:5432/lingxi_test?schema=public
|
||
REDIS_URL: redis://127.0.0.1:6379
|
||
JWT_ACCESS_SECRET: ci-only-access-secret-at-least-32-chars
|
||
JWT_REFRESH_SECRET: ci-only-refresh-secret-at-least-32-chars
|
||
WEB_ORIGIN: http://127.0.0.1:4173
|
||
VITE_PUBLIC_API_BASE_URL: http://127.0.0.1:3000/api/v1
|
||
VITE_PUBLIC_DEMO_SESSION: 'true'
|
||
PLAYWRIGHT_CHANNEL: ''
|
||
|
||
steps:
|
||
- name: 检出代码
|
||
uses: actions/checkout@v4
|
||
|
||
- name: 安装 pnpm
|
||
uses: pnpm/action-setup@v4
|
||
with:
|
||
version: 10.34.9
|
||
|
||
- name: 安装 Node.js
|
||
uses: actions/setup-node@v4
|
||
with:
|
||
node-version: 24.15.0
|
||
cache: pnpm
|
||
|
||
- name: 安装依赖
|
||
run: pnpm install --frozen-lockfile
|
||
|
||
# workspace 包的 types 指向 dist/(gitignore),全新检出必须先构建,
|
||
# 否则 Lint 的类型感知规则会报 type that cannot be resolved。
|
||
- name: 构建 workspace 包(Lint 类型解析前置)
|
||
run: pnpm exec turbo run build --filter='./packages/*'
|
||
|
||
- name: 格式检查
|
||
run: pnpm format:check
|
||
|
||
- name: Lint
|
||
run: pnpm lint
|
||
|
||
- name: 类型检查
|
||
run: pnpm typecheck
|
||
|
||
- name: 单元测试与覆盖率
|
||
run: pnpm test
|
||
|
||
- name: 构建
|
||
run: pnpm build
|
||
|
||
- name: 数据库迁移与幂等种子
|
||
run: |
|
||
pnpm exec prisma migrate deploy
|
||
pnpm db:seed
|
||
|
||
- name: 集成测试
|
||
run: pnpm test:int
|
||
|
||
- name: 导出 OpenAPI 快照并检查破坏性变更
|
||
run: |
|
||
pnpm openapi:export
|
||
pnpm openapi:diff
|
||
|
||
- name: 安装 Playwright 浏览器
|
||
run: pnpm exec playwright install --with-deps chromium
|
||
|
||
- name: 端到端冒烟
|
||
run: pnpm test:e2e
|
||
|
||
- name: 归档测试产物
|
||
if: always()
|
||
uses: actions/upload-artifact@v4
|
||
with:
|
||
name: test-artifacts
|
||
if-no-files-found: ignore
|
||
path: |
|
||
coverage
|
||
apps/*/coverage
|
||
packages/*/coverage
|
||
test-results
|
||
playwright-report
|
||
openapi/lingxi.openapi.json
|