name: CI
on:
push:
branches: ['**']
pull_request:
workflow_call:
permissions:
contents: read
jobs:
check:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy
- uses: actions/setup-node@v4
with:
node-version: '22'
- uses: Swatinem/rust-cache@v2
- run: node --test tests/report-ui.cjs
- run: cargo fmt --all --check
- run: cargo clippy --locked --workspace --all-targets -- -D warnings
- run: cargo test --locked --workspace --all-targets
- run: cargo test --locked --workspace --doc
- uses: oven-sh/setup-bun@v2
if: runner.os == 'macOS'
with:
bun-version: '1.3.14'
- run: bun install --frozen-lockfile
if: runner.os == 'macOS'
working-directory: web
- run: cargo build --locked --bin resopt
if: runner.os == 'macOS'
- run: bun test tests/native-integration.test.ts
if: runner.os == 'macOS'
working-directory: web
env:
RESOPT_TEST_BIN: ${{ github.workspace }}/target/debug/resopt
browser:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
targets: wasm32-unknown-unknown
components: llvm-tools-preview
- uses: Swatinem/rust-cache@v2
with:
key: browser-wasm
- uses: oven-sh/setup-bun@v2
with:
bun-version: '1.3.14'
- run: cargo install wasm-bindgen-cli --version 0.2.128 --locked
- run: bun install --frozen-lockfile
working-directory: web
- run: bun run build
working-directory: web
- run: bun run typecheck
working-directory: web
- run: bun test
working-directory: web
- run: cargo test --locked --no-default-features --lib
- uses: actions/upload-artifact@v4
with:
name: browser-site
path: web/dist/
if-no-files-found: error
ui-e2e:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: actions/setup-node@v4
with:
node-version: '22'
- uses: Swatinem/rust-cache@v2
with:
key: ui-e2e
- run: cargo build --locked --release --bin resopt
- name: Drive the embedded UI in headless Chrome
run: |
mkdir "$RUNNER_TEMP/project"
node tests/browser/fixture.mjs "$RUNNER_TEMP/project"
node tests/browser/e2e.mjs target/release/resopt "$RUNNER_TEMP/project" "$RUNNER_TEMP/shots"
env:
CHROME_BIN: /usr/bin/google-chrome
- uses: actions/upload-artifact@v4
if: always()
with:
name: ui-e2e-screenshots
path: ${{ runner.temp }}/shots/
if-no-files-found: ignore