name: CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build-and-test:
name: Lint, Type Check, Test (${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Python 3.14
uses: actions/setup-python@v5
with:
python-version: '3.14'
allow-prereleases: true
- name: Install uv
shell: bash
run: |
curl -LsSf https://astral.sh/uv/install.sh | sh
echo "$HOME/.local/bin" >> $GITHUB_PATH
uv --version
- name: Cache uv dependencies
uses: actions/cache@v4
with:
path: |
~/.cache/uv
.venv
key: ci-uv-${{ runner.os }}-${{ hashFiles('pyproject.toml', 'uv.lock') }}
restore-keys: |
ci-uv-${{ runner.os }}-
- name: Sync dependencies
shell: bash
run: |
uv sync --dev
- name: Lint (ruff)
shell: bash
run: |
uv run ruff check
- name: Type check
shell: bash
run: |
uvx ty check
- name: Run tests
shell: bash
env:
PYTHONUTF8: "1"
run: |
uv run -m pytest -q
- name: Smoke test am-run (Ubuntu only)
if: matrix.os == 'ubuntu-latest'
shell: bash
run: |
uv run python -m mcp_agent_mail.cli am-run ci-slot -- echo "ok"
- name: Run performance benchmarks (Ubuntu only)
if: matrix.os == 'ubuntu-latest'
shell: bash
env:
PYTHONUTF8: "1"
RUN_BENCHMARKS: "1"
INSTRUMENTATION_ENABLED: "true"
run: |
uv run -m pytest tests/benchmarks/ -v -m benchmark --tb=short || true
- name: CI Performance Regression Check (Ubuntu only)
if: matrix.os == 'ubuntu-latest'
shell: bash
env:
PYTHONUTF8: "1"
run: |
uv run -m pytest tests/benchmarks/test_ci_regression.py -v -m ci_regression --tb=short
- name: Upload regression report artifact
if: matrix.os == 'ubuntu-latest' && always()
uses: actions/upload-artifact@v4
with:
name: regression-reports
path: tests/benchmarks/regression_reports/
if-no-files-found: ignore
retention-days: 30
- name: Upload benchmark results artifact
if: matrix.os == 'ubuntu-latest' && always()
uses: actions/upload-artifact@v4
with:
name: benchmark-results
path: tests/benchmarks/results/
if-no-files-found: ignore
retention-days: 30