name: CI on: push: branches: [main] pull_request: branches: [main] jobs: test: runs-on: ${{ matrix.os }} timeout-minutes: 60 # Windows runner 偶发卡顿,6 格矩阵整体留足余量 strategy: fail-fast: false matrix: # 项目核心场景是读取 Windows 通达信安装目录下的 .day 文件, # 路径分隔符 / GBK 文件名 / tzdata 时区行为在 Windows 上与 Linux 不同, # 故补充 Windows 矩阵覆盖这些平台特有路径。 os: [ubuntu-latest, windows-latest] python-version: ["3.10", "3.12", "3.13"] steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} cache: "pip" cache-dependency-path: | pyproject.toml requirements-dev.txt # 前端 dist 被 pyproject.toml 的 force-include 引用,pip install -e . # 要求它存在。先构建前端(type-check + vite build)。 - uses: actions/setup-node@v4 with: node-version: "20" cache: "npm" cache-dependency-path: web-ui/package-lock.json - run: npm ci working-directory: web-ui - run: npm run build working-directory: web-ui - run: pip install -e ".[dev]" - run: pip install -r requirements-dev.txt # test_ai_llm.py 依赖 LLM 异步任务轮询,CI 无 API key 且 runner 卡顿时 # 必然轮询超时抖挂(本地有 mock 可跑),CI 跳过 - run: python -m pytest tests/unit/ -v --tb=short --cov src/easy_tdx --cov-fail-under=60 --ignore=tests/unit/test_ai_llm.py - run: ruff check src/ tests/ - run: ruff format --check src/ tests/ mypy: runs-on: ubuntu-latest timeout-minutes: 30 steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: "3.13" cache: "pip" cache-dependency-path: pyproject.toml # 同 test job:force-include 要求 web-ui/dist 存在。 - uses: actions/setup-node@v4 with: node-version: "20" cache: "npm" cache-dependency-path: web-ui/package-lock.json - run: npm ci working-directory: web-ui - run: npm run build working-directory: web-ui - run: pip install -e ".[dev,web]" - run: mypy src/ # 前端构建检查。web-ui 此前只有本地 vue-tsc,CI 不覆盖, # 类型错误 / 破坏性 import 只有发布后用户才发觉(v1.17.9 的 # 65409694% 离谱数值 bug 即前端无回归守卫的典型后果)。 # 与 Python 版本无关,故独立 job,避免在 test matrix 里跑 6 遍。 frontend: runs-on: ubuntu-latest timeout-minutes: 60 # Playwright 安装 + E2E 首跑较慢 steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: "20" cache: "npm" cache-dependency-path: web-ui/package-lock.json - run: npm ci working-directory: web-ui - run: npm run build working-directory: web-ui # Playwright E2E(mock 模式):serve 托管刚构建的 dist,行情全部来自 # EASY_TDX_E2E_MOCK=1 合成数据,不连真实通达信服务器、不受交易时段限制。 # 需要 Python 侧 easy-tdx[web](webServer 用系统 python 启动 serve)。 - uses: actions/setup-python@v5 with: python-version: "3.13" cache: "pip" cache-dependency-path: pyproject.toml - run: pip install -e ".[web]" # 浏览器二进制按 lockfile 哈希缓存(版本变 → 新 key → 重下) - name: Cache Playwright browsers uses: actions/cache@v4 with: path: ~/.cache/ms-playwright key: playwright-${{ runner.os }}-${{ hashFiles('web-ui/package-lock.json') }} - run: npx playwright install --with-deps chromium working-directory: web-ui - run: npm run test:e2e working-directory: web-ui env: EASY_TDX_PYTHON: python