Two unrelated tweaks grouped into one PR to keep churn low. ## Ports Backend 8000 → 3900, Vite dev 5173 → 3901, 3902 reserved for future IPC. Port 8000 conflicts with Django/Rails/Jupyter/Airflow on most dev machines; the uncommon 3900 range dodges that. Touched: - frontend/src-tauri/src/lib.rs (BACKEND_PORT) - frontend/src-tauri/tauri.conf.json (devUrl) - frontend/vite.config.js (server.port) - frontend/src/api/client.ts (hardcoded API base) - frontend/src/App.jsx (PREVIEW_API fallback) - backend/main.py (CORS allowlist + uvicorn.run default) Rust sidecar launcher and FastAPI uvicorn port stay in sync via the `BACKEND_PORT` constant + explicit port=3900. ## CI caches Build time shaves across ci.yml and release.yml: - `astral-sh/setup-uv@v3` → `enable-cache: true` keyed on uv.lock (~45 s saved per run after uv.lock stabilises) - `awalsh128/cache-apt-pkgs-action` for ffmpeg (~25 s saved) - `actions/cache@v4` on `~/.bun/install/cache` keyed on bun.lock (~15 s saved; applied to both test gate and build matrix) Expected warm test job: ~45-60 s (was ~2-3 min). Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
88 lines
2.6 KiB
YAML
88 lines
2.6 KiB
YAML
# PR-gated continuous integration — runs backend pytest + frontend node:test
|
|
# + TypeScript typecheck on every pull request and push to main. Keeps the
|
|
# heavy 4-platform Tauri bundle off this path (that's release.yml on tag
|
|
# push) so PRs turn around in a few minutes instead of ~40.
|
|
|
|
name: CI
|
|
|
|
on:
|
|
pull_request:
|
|
branches: [main]
|
|
push:
|
|
branches: [main]
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
env:
|
|
# Run all JavaScript actions on Node 24 (GH deprecates Node 20 in Sep 2026).
|
|
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
|
|
|
|
jobs:
|
|
test:
|
|
name: Tests (backend + frontend)
|
|
runs-on: ubuntu-22.04
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Setup Python 3.11
|
|
uses: actions/setup-python@v5
|
|
with:
|
|
python-version: "3.11"
|
|
|
|
# enable-cache persists ~/.cache/uv across runs, keyed on uv.lock —
|
|
# turns `uv sync` from ~45 s cold to ~5 s warm.
|
|
- name: Install uv
|
|
uses: astral-sh/setup-uv@v3
|
|
with:
|
|
enable-cache: true
|
|
cache-dependency-glob: "uv.lock"
|
|
|
|
# Node 22 is needed for --experimental-strip-types so node:test can
|
|
# import .ts files directly from frontend/src/api/*.
|
|
- name: Setup Node 22
|
|
uses: actions/setup-node@v4
|
|
with:
|
|
node-version: '22'
|
|
|
|
- name: Setup Bun
|
|
uses: oven-sh/setup-bun@v1
|
|
|
|
# apt install ffmpeg is ~30 s every run; cache the resolved .debs.
|
|
- name: System deps (ffmpeg)
|
|
uses: awalsh128/cache-apt-pkgs-action@latest
|
|
with:
|
|
packages: ffmpeg
|
|
version: 1.0
|
|
|
|
- name: Install Python deps
|
|
run: uv sync
|
|
|
|
- name: Run pytest
|
|
run: uv run pytest tests/ -q --tb=short
|
|
|
|
# Cache ~/.bun/install/cache keyed on bun.lock — `bun install` drops
|
|
# from ~15 s cold to near-instant on warm cache.
|
|
- name: Cache bun deps
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: ~/.bun/install/cache
|
|
key: ${{ runner.os }}-bun-${{ hashFiles('frontend/bun.lock', 'bun.lock') }}
|
|
restore-keys: |
|
|
${{ runner.os }}-bun-
|
|
|
|
- name: Install frontend deps
|
|
working-directory: frontend
|
|
run: bun install
|
|
|
|
- name: Frontend typecheck
|
|
working-directory: frontend
|
|
run: bunx tsc --noEmit
|
|
|
|
# Invoke node directly (not `bun run test`) because `bun run` auto-aliases
|
|
# `node` to `bun` in script bodies, and bun doesn't support
|
|
# --experimental-strip-types.
|
|
- name: Run frontend node:test
|
|
working-directory: frontend
|
|
run: node --experimental-strip-types --no-warnings --test ../tests/frontend/*.test.mjs
|