name: CI
on:
push:
branches: [master, main]
pull_request:
branches: [master, main]
permissions:
contents: read
env:
CARGO_TERM_COLOR: always
RUST_BACKTRACE: 1
jobs:
test:
name: Test
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
rust: [stable]
steps:
- uses: actions/checkout@v6
- name: Install Rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.rust }}
components: rustfmt, clippy
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
with:
shared-key: "ci-${{ matrix.os }}"
- name: Check formatting
run: cargo fmt -- --check
- name: Run clippy
run: cargo clippy --all-targets --all-features -- -D warnings
- name: Build
run: cargo build --release --verbose
- name: Build binary for tests
run: cargo build
- name: Run tests
run: cargo test --verbose
coverage:
name: Code Coverage
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
with:
shared-key: "coverage"
- name: Install tarpaulin
run: cargo install cargo-tarpaulin
- name: Build binary for tests
run: cargo build
- name: Generate coverage report
run: cargo tarpaulin --out Xml --skip-clean
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v6
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: cobertura.xml
fail_ci_if_error: false
check-msrv:
name: Check MSRV
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Install Rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: 1.85.0
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
with:
shared-key: "msrv"
- name: Check build
run: cargo check --all-features
check-vscode-extension:
name: Check VSCode Extension
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: '20'
- name: Install dependencies
run: |
cd extensions/vscode-extension
npm install
npm install -g @vscode/vsce
- name: Lint
run: |
cd extensions/vscode-extension
npm run lint
- name: Compile TypeScript
run: |
cd extensions/vscode-extension
npm run compile
- name: Package extension (dry-run)
run: |
cd extensions/vscode-extension
mkdir -p bin
touch bin/pytest-language-server-x86_64-unknown-linux-gnu
vsce package --skip-license
check-intellij-plugin:
name: Check IntelliJ Plugin
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: '21'
- name: Cache Gradle
uses: actions/cache@v5
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: gradle-${{ hashFiles('extensions/intellij-plugin/**/*.gradle*', 'extensions/intellij-plugin/**/gradle-wrapper.properties') }}
restore-keys: gradle-
- name: Build plugin
run: |
cd extensions/intellij-plugin
chmod +x gradlew
./gradlew buildPlugin --no-daemon
- name: Verify plugin structure
run: |
cd extensions/intellij-plugin
ls -la build/distributions/
# Verify ZIP was created
test -f build/distributions/pytest-language-server-*.zip
check-zed-extension:
name: Check Zed Extension
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: wasm32-wasip1
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
with:
shared-key: "zed-extension"
workspaces: "extensions/zed-extension -> target"
- name: Check Zed extension compiles
run: |
cd extensions/zed-extension
cargo check --target wasm32-wasip1
- name: Validate extension.toml
run: |
cd extensions/zed-extension
# Basic validation that required fields exist
grep -q "^id = " extension.toml
grep -q "^name = " extension.toml
grep -q "^version = " extension.toml
grep -q "^schema_version = " extension.toml
echo "extension.toml validation passed"
check-homebrew-formula:
name: Check Homebrew Formula
runs-on: macos-latest
steps:
- uses: actions/checkout@v6
- name: Validate formula syntax
run: brew style Formula/pytest-language-server.rb
- name: Verify formula has valid checksums
run: |
# Check that formula doesn't have placeholder checksums
if grep -q "REPLACE_WITH" Formula/pytest-language-server.rb; then
echo "❌ Formula contains placeholder checksums"
exit 1
fi
echo "✅ Formula checksums look valid"