name: CI checks on: [push, pull_request] jobs: test: name: Test on ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, windows-latest, macOS-latest] steps: - uses: actions/checkout@v4 - name: Run tests run: cargo test --all-features --verbose --release --all - name: Run slow tests run: cargo test --all-features --verbose --release --all -- --ignored - name: Verify working directory is clean run: git diff --exit-code build-latest: name: Latest build on ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, windows-latest, macOS-latest] steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable id: toolchain - run: rustup override set ${{steps.toolchain.outputs.name}} - name: Remove lockfile to build with latest dependencies run: rm Cargo.lock - name: Build crates run: cargo build --workspace --all-targets --all-features --verbose - name: Verify working directory is clean (excluding lockfile) run: git diff --exit-code ':!Cargo.lock' build-nodefault: name: Build target ${{ matrix.target }} runs-on: ubuntu-latest strategy: matrix: target: - wasm32-wasi steps: - uses: actions/checkout@v4 with: path: crates # We use a synthetic crate to ensure no dev-dependencies are enabled, which can # be incompatible with some of these targets. - name: Create synthetic crate for testing run: cargo init --lib ci-build - name: Copy Rust version into synthetic crate run: cp crates/rust-toolchain.toml ci-build/ - name: Add zcash_proofs as a dependency of the synthetic crate working-directory: ./ci-build run: cargo add --no-default-features --path ../crates/zcash_proofs - name: Add zcash_client_backend as a dependency of the synthetic crate working-directory: ./ci-build run: cargo add --no-default-features --path ../crates/zcash_client_backend - name: Copy pinned dependencies into synthetic crate run: cp crates/Cargo.lock ci-build/ - name: Add target working-directory: ./ci-build run: rustup target add ${{ matrix.target }} - name: Build for target working-directory: ./ci-build run: cargo build --verbose --target ${{ matrix.target }} bitrot: name: Bitrot check runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 # Build benchmarks to prevent bitrot - name: Build benchmarks run: cargo build --all --benches clippy: name: Clippy (MSRV) timeout-minutes: 30 runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Run clippy uses: actions-rs/clippy-check@v1 with: name: Clippy (MSRV) token: ${{ secrets.GITHUB_TOKEN }} args: --all-features --all-targets -- -D warnings clippy-beta: name: Clippy (beta) timeout-minutes: 30 runs-on: ubuntu-latest continue-on-error: true steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@beta id: toolchain - run: rustup override set ${{steps.toolchain.outputs.name}} - name: Run Clippy (beta) uses: actions-rs/clippy-check@v1 continue-on-error: true with: name: Clippy (beta) token: ${{ secrets.GITHUB_TOKEN }} args: --all-features --all-targets -- -W clippy::all codecov: name: Code coverage runs-on: ubuntu-latest container: image: xd009642/tarpaulin:develop-nightly options: --security-opt seccomp=unconfined steps: - uses: actions/checkout@v4 - name: Generate coverage report run: cargo tarpaulin --engine llvm --all-features --release --timeout 600 --out xml - name: Upload coverage to Codecov uses: codecov/codecov-action@v3.1.4 doc-links: name: Intra-doc links runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: cargo fetch # Requires #![deny(rustdoc::broken_intra_doc_links)] in crates. - name: Check intra-doc links run: cargo doc --all --all-features --document-private-items fmt: name: Rustfmt timeout-minutes: 30 runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Check formatting run: cargo fmt --all -- --check uuid: name: UUID validity runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Extract UUIDs id: extract run: | { echo 'UUIDS<> "$GITHUB_OUTPUT" - name: Check UUID validity env: UUIDS: ${{ steps.extract.outputs.UUIDS }} run: uuidparse -n -o type $UUIDS | xargs -L 1 test "invalid" != - name: Check UUID type env: UUIDS: ${{ steps.extract.outputs.UUIDS }} run: uuidparse -n -o type $UUIDS | xargs -L 1 test "random" = - name: Check UUID uniqueness env: UUIDS: ${{ steps.extract.outputs.UUIDS }} run: > test $( uuidparse -n -o uuid $U4 | wc -l ) -eq $( uuidparse -n -o uuid $U4 | sort | uniq | wc -l )