name: CI
on:
push:
branches: [main]
pull_request:
permissions:
contents: read
concurrency:
group: ci-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
quality:
name: Quality
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- name: Check out repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 with:
persist-credentials: false
- name: Install Rust stable
run: rustup toolchain install stable --profile minimal --component rustfmt --component clippy
- name: Install pre-commit
run: python3 -m pip install -r requirements.txt
- name: Run pre-commit
run: pre-commit run --all-files
- name: Lint
run: cargo +stable clippy --all-targets --all-features -- -D warnings
- name: Build documentation
env:
RUSTDOCFLAGS: -D warnings
run: cargo +stable doc --all-features --no-deps
- name: Verify package
run: cargo +stable package
native-tests:
name: Test (${{ matrix.runner }})
strategy:
fail-fast: false
matrix:
include:
- runner: ubuntu-22.04
experimental: false
- runner: ubuntu-24.04
experimental: false
- runner: ubuntu-22.04-arm
experimental: false
- runner: ubuntu-24.04-arm
experimental: false
- runner: windows-2022
experimental: false
- runner: windows-2025
experimental: false
- runner: windows-11-arm
experimental: false
- runner: macos-15-intel
experimental: false
- runner: macos-26-intel
experimental: false
- runner: macos-15
experimental: false
- runner: macos-26
experimental: false
- runner: ubuntu-26.04
experimental: true
- runner: ubuntu-26.04-arm
experimental: true
- runner: windows-11-vs2026-arm
experimental: true
- runner: xcode-27
experimental: true
runs-on: ${{ matrix.runner }}
continue-on-error: ${{ matrix.experimental }}
timeout-minutes: 15
steps:
- name: Check out repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 with:
persist-credentials: false
- name: Install Rust stable
run: rustup toolchain install stable --profile minimal
- name: Run tests
run: cargo +stable test --all-features
msrv:
name: Test MSRV (Rust 1.85)
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- name: Check out repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 with:
persist-credentials: false
- name: Install Rust 1.85
run: rustup toolchain install 1.85.0 --profile minimal
- name: Run all targets on the MSRV
run: cargo +1.85.0 test --all-targets --all-features
wasi-tests:
name: Test WebAssembly (WASI)
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- name: Check out repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 with:
persist-credentials: false
- name: Install Rust stable and WASI target
run: rustup toolchain install stable --profile minimal --target wasm32-wasip1
- name: Install Wasmtime
uses: taiki-e/install-action@7f4eb899022d8fe70b20c4f3de697aa85c309026 with:
tool: wasmtime@47.0.3
fallback: none
- name: Run tests in Wasmtime
env:
CARGO_TARGET_WASM32_WASIP1_RUNNER: wasmtime
run: cargo +stable test --target wasm32-wasip1 --all-features --lib --tests
browser-tests:
name: Test WebAssembly (Chrome)
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- name: Check out repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 with:
persist-credentials: false
- name: Install Rust stable and browser WebAssembly target
run: rustup toolchain install stable --profile minimal --target wasm32-unknown-unknown
- name: Install wasm-pack
uses: taiki-e/install-action@7f4eb899022d8fe70b20c4f3de697aa85c309026 with:
tool: wasm-pack@0.15.0
fallback: none
- name: Run tests in headless Chrome
run: wasm-pack test --headless --chrome -- --all-features