name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
env:
CARGO_TERM_COLOR: always
RUST_BACKTRACE: 1
jobs:
test:
name: Test (${{ matrix.os }}, ${{ matrix.rust }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
rust: [stable, "1.85"]
steps:
- uses: actions/checkout@v4
- name: Install Rust ${{ matrix.rust }}
uses: dtolnay/rust-toolchain@stable
with:
toolchain: ${{ matrix.rust }}
- name: Cache cargo registry
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ matrix.rust }}-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-${{ matrix.rust }}-
- name: Install cargo-nextest
uses: taiki-e/install-action@v2
with:
tool: nextest
- name: Run tests
shell: bash
run: |
if [ "${{ matrix.rust }}" = "stable" ]; then
cargo nextest run --all-features --profile ci
else
cargo nextest run --no-default-features --features serialization,input-components,data-components,display-components,navigation-components,overlay-components,compound-components --profile ci
fi
- name: Run doc tests
shell: bash
env:
RUSTDOCFLAGS: ${{ matrix.os == 'windows-latest' && '-C link-args=/STACK:16777216' || '' }}
run: |
if [ "${{ matrix.rust }}" = "stable" ]; then
cargo test --doc --all-features
else
cargo test --doc --no-default-features --features serialization,input-components,data-components,display-components,navigation-components,overlay-components,compound-components
fi
- name: Build examples
shell: bash
run: |
if [ "${{ matrix.rust }}" = "stable" ]; then
cargo build --examples
else
cargo build --examples --no-default-features --features serialization,input-components,data-components,display-components,navigation-components,overlay-components,compound-components
fi
no-default-features:
name: No Default Features
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
toolchain: stable
- name: Cache cargo registry
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-no-default-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-no-default-
- name: Check without default features
run: cargo check --no-default-features
- name: Install cargo-nextest
uses: taiki-e/install-action@v2
with:
tool: nextest
- name: Test without default features
run: cargo nextest run --no-default-features --profile ci
- name: Run doc tests without default features
run: cargo test --doc --no-default-features
clippy:
name: Clippy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
toolchain: stable
components: clippy
- name: Cache cargo registry
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-clippy-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-clippy-
- name: Run clippy
run: cargo clippy --all-targets --all-features -- -D warnings
fmt:
name: Format
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
toolchain: stable
components: rustfmt
- name: Check formatting
run: cargo fmt --all -- --check
coverage:
name: Coverage
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
toolchain: stable
- name: Install cargo-tarpaulin
run: cargo install cargo-tarpaulin
- name: Cache cargo registry
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-coverage-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-coverage-
- name: Generate coverage
run: cargo tarpaulin --out xml --output-dir coverage
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
files: coverage/cobertura.xml
fail_ci_if_error: false
token: ${{ secrets.CODECOV_TOKEN }}
docs:
name: Documentation
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
toolchain: stable
- name: Cache cargo registry
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-docs-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-docs-
- name: Build documentation
run: cargo doc --no-deps --all-features
env:
RUSTDOCFLAGS: -D warnings
- name: Setup Pages
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
uses: actions/configure-pages@v4
- name: Prepare docs for deployment
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
run: |
echo '<meta http-equiv="refresh" content="0; url=envision/index.html">' > target/doc/index.html
- name: Upload artifact
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
uses: actions/upload-pages-artifact@v3
with:
path: target/doc
changes:
name: Detect Changes
runs-on: ubuntu-latest
permissions:
pull-requests: read
outputs:
backend: ${{ steps.filter.outputs.backend }}
runtime: ${{ steps.filter.outputs.runtime }}
component-view: ${{ steps.filter.outputs.component-view }}
component-events: ${{ steps.filter.outputs.component-events }}
steps:
- uses: actions/checkout@v4
- uses: dorny/paths-filter@v3
id: filter
with:
filters: |
backend:
- 'src/backend/**'
- 'benches/capture_backend.rs'
- 'Cargo.toml'
- 'Cargo.lock'
runtime:
- 'src/app/**'
- 'src/backend/**'
- 'src/overlay/**'
- 'benches/runtime.rs'
- 'Cargo.toml'
- 'Cargo.lock'
component-view:
- 'src/component/**'
- 'src/backend/**'
- 'src/theme/**'
- 'benches/component_view.rs'
- 'Cargo.toml'
- 'Cargo.lock'
component-events:
- 'src/component/**'
- 'src/input/**'
- 'benches/component_events.rs'
- 'Cargo.toml'
- 'Cargo.lock'
bench-backend:
name: Bench Backend
needs: changes
if: needs.changes.outputs.backend == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
toolchain: stable
- name: Cache cargo registry
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-bench-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-bench-
- name: Restore baseline
uses: actions/cache@v4
with:
path: target/criterion
key: criterion-baseline-backend-${{ github.base_ref || 'main' }}
restore-keys: |
criterion-baseline-backend-main
- name: Run benchmarks
run: cargo bench --bench capture_backend --all-features
- name: Save baseline
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
uses: actions/cache/save@v4
with:
path: target/criterion
key: criterion-baseline-backend-main
- name: Upload benchmark results
if: always()
uses: actions/upload-artifact@v4
with:
name: criterion-report-backend
path: target/criterion
retention-days: 14
bench-runtime:
name: Bench Runtime
needs: changes
if: needs.changes.outputs.runtime == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
toolchain: stable
- name: Cache cargo registry
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-bench-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-bench-
- name: Restore baseline
uses: actions/cache@v4
with:
path: target/criterion
key: criterion-baseline-runtime-${{ github.base_ref || 'main' }}
restore-keys: |
criterion-baseline-runtime-main
- name: Run benchmarks
run: cargo bench --bench runtime --all-features
- name: Save baseline
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
uses: actions/cache/save@v4
with:
path: target/criterion
key: criterion-baseline-runtime-main
- name: Upload benchmark results
if: always()
uses: actions/upload-artifact@v4
with:
name: criterion-report-runtime
path: target/criterion
retention-days: 14
bench-component-view:
name: Bench Component View
needs: changes
if: needs.changes.outputs.component-view == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
toolchain: stable
- name: Cache cargo registry
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-bench-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-bench-
- name: Restore baseline
uses: actions/cache@v4
with:
path: target/criterion
key: criterion-baseline-component-view-${{ github.base_ref || 'main' }}
restore-keys: |
criterion-baseline-component-view-main
- name: Run benchmarks
run: cargo bench --bench component_view --all-features
- name: Save baseline
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
uses: actions/cache/save@v4
with:
path: target/criterion
key: criterion-baseline-component-view-main
- name: Upload benchmark results
if: always()
uses: actions/upload-artifact@v4
with:
name: criterion-report-component-view
path: target/criterion
retention-days: 14
bench-component-events:
name: Bench Component Events
needs: changes
if: needs.changes.outputs.component-events == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
toolchain: stable
- name: Cache cargo registry
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-bench-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-bench-
- name: Restore baseline
uses: actions/cache@v4
with:
path: target/criterion
key: criterion-baseline-component-events-${{ github.base_ref || 'main' }}
restore-keys: |
criterion-baseline-component-events-main
- name: Run benchmarks
run: cargo bench --bench component_events --all-features
- name: Save baseline
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
uses: actions/cache/save@v4
with:
path: target/criterion
key: criterion-baseline-component-events-main
- name: Upload benchmark results
if: always()
uses: actions/upload-artifact@v4
with:
name: criterion-report-component-events
path: target/criterion
retention-days: 14
deploy-docs:
name: Deploy Documentation
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
needs: docs
runs-on: ubuntu-latest
permissions:
pages: write
id-token: write
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4