131 lines
4.9 KiB
YAML
131 lines
4.9 KiB
YAML
name: CI
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
pull_request:
|
|
|
|
env:
|
|
CARGO_TERM_COLOR: always
|
|
RUSTFLAGS: "-D warnings"
|
|
|
|
jobs:
|
|
fmt:
|
|
name: Format
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: dtolnay/rust-toolchain@stable
|
|
with:
|
|
components: rustfmt
|
|
- run: cargo fmt --all --check
|
|
|
|
clippy:
|
|
name: Lint (${{ matrix.lua }})
|
|
runs-on: ubuntu-latest
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
# mlua's Lua-flavor features are mutually exclusive, so we can't
|
|
# use --all-features. Run clippy under each supported flavor.
|
|
lua: [luajit, lua54]
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: dtolnay/rust-toolchain@stable
|
|
with:
|
|
components: clippy
|
|
- uses: Swatinem/rust-cache@v2
|
|
- run: cargo clippy --all-targets --no-default-features --features ${{ matrix.lua }} -- -D warnings
|
|
# pmacs-gpu is Lua-flavor-independent (it depends on pmacs-protocol,
|
|
# not pmacs), so the root-package clippy above never lints it. Lint
|
|
# it explicitly or its warnings slip through CI (audit F-001).
|
|
- run: cargo clippy -p pmacs-gpu --all-targets -- -D warnings
|
|
|
|
test:
|
|
name: Test (${{ matrix.os }} / ${{ matrix.lua }})
|
|
runs-on: ${{ matrix.os }}
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
os: [ubuntu-latest, macos-latest]
|
|
lua: [luajit, lua54]
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: dtolnay/rust-toolchain@stable
|
|
- uses: Swatinem/rust-cache@v2
|
|
- run: cargo build --all-targets --no-default-features --features ${{ matrix.lua }}
|
|
# Several acceptance binaries spawn real daemon / PTY child
|
|
# processes. Keep the harness serial so macOS runners do not
|
|
# expose cross-test process lifecycle races that are unrelated
|
|
# to the behavior under test.
|
|
- run: cargo test --all-targets --no-default-features --features ${{ matrix.lua }} -- --test-threads=1
|
|
- run: cargo test --doc --no-default-features --features ${{ matrix.lua }}
|
|
|
|
acceptance:
|
|
name: M1 Acceptance Gates
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: dtolnay/rust-toolchain@stable
|
|
- uses: Swatinem/rust-cache@v2
|
|
- name: perf, memory, and 30s fuzz gates
|
|
run: cargo test --release --test acceptance -- --ignored --nocapture --test-threads=1
|
|
|
|
m4-perf-gates:
|
|
name: M4 Perf Gates
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: dtolnay/rust-toolchain@stable
|
|
- uses: Swatinem/rust-cache@v2
|
|
- name: tree-sitter parse + highlight latency budgets
|
|
run: cargo test --release --test m4_acceptance -- --ignored --nocapture --test-threads=1
|
|
|
|
# m5-perf-gates: luajit-only by design.
|
|
# The keystroke-to-render gate measures protocol-path latency (Unix
|
|
# socket frontend ↔ daemon RTT plus the daemon's keymap-dispatch /
|
|
# buffer-mutate / repaint pipeline). Lua flavor is irrelevant — the
|
|
# measured path doesn't enter the Lua VM. Matrixing over flavors
|
|
# doubles CI cost without adding signal. If a future perf gate
|
|
# measures Lua-touching code paths (command dispatch via Lua,
|
|
# hook invocation), revisit then.
|
|
m5-perf-gates:
|
|
name: M5 Perf Gates
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: dtolnay/rust-toolchain@stable
|
|
- uses: Swatinem/rust-cache@v2
|
|
- name: keystroke-to-render p99 over loopback LocalSocket
|
|
run: cargo test --release --test m5_perf_acceptance -- --ignored --nocapture
|
|
|
|
# m6-perf-gates: luajit-only by design. The M6.6/M6.7 gates measure
|
|
# rope-append throughput, RSS ceiling, cancel-response latency,
|
|
# scrollback navigation latency, and scrollback search latency —
|
|
# none of which exercise the Lua VM's hot path differently across
|
|
# flavors. Same reasoning as m5-perf-gates above.
|
|
#
|
|
# --test-threads=1 is required: the M6.6 RSS-ceiling gate samples
|
|
# process-wide /proc/self/status, and concurrent ingest / scrollback
|
|
# populate from sibling tests inflate that reading. Serializing
|
|
# gives each test a clean baseline. The wall-clock cost of serial
|
|
# execution (~5 minutes) is acceptable for a perf-gates job that
|
|
# only runs on push/PR.
|
|
m6-perf-gates:
|
|
name: M6 Perf Gates
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 15
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: dtolnay/rust-toolchain@stable
|
|
- uses: Swatinem/rust-cache@v2
|
|
- name: ingest rate, RSS ceiling, cancel p99, navigation p99, search p99
|
|
env:
|
|
# Full cancel profile remains the test default. Hosted CI has
|
|
# an effective five-minute ceiling for this job and variable
|
|
# PTY throughput, so keep the per-PR profile short and stable.
|
|
PMACS_M6_INGEST_MIN_BYTES_PER_SEC: "67108864"
|
|
PMACS_M6_CANCEL_TRIALS: "30"
|
|
PMACS_M6_CANCEL_MAX_DELAY_MS: "500"
|
|
run: cargo test --release --test m6_perf_acceptance -- --ignored --nocapture --test-threads=1
|