name: CI checks on: pull_request: push: branches: main jobs: test: name: > Test${{ matrix.state != 'NOT_A_PUZZLE' && format(' {0}', matrix.state) || '' }} on ${{ matrix.target }} runs-on: ${{ matrix.os }} continue-on-error: ${{ matrix.state != 'NOT_A_PUZZLE' }} strategy: matrix: target: - Linux - macOS - Windows state: - NOT_A_PUZZLE - Orchard - NU6 include: - target: Linux os: ubuntu-latest-8cores - target: macOS os: macOS-latest - target: Windows os: windows-latest-8cores - state: Orchard extra_flags: orchard - state: NU6 rustflags: '--cfg zcash_unstable="nu6"' exclude: - target: macOS state: NU6 env: RUSTFLAGS: ${{ matrix.rustflags }} RUSTDOCFLAGS: ${{ matrix.rustflags }} steps: - uses: actions/checkout@v4 - id: prepare uses: ./.github/actions/prepare with: extra-features: ${{ matrix.state != 'NOT_A_PUZZLE' && matrix.extra_flags || '' }} - uses: actions/cache@v4 with: path: | ~/.cargo/bin/ ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ target/ key: ${{ runner.os }}-cargo-msrv-${{ hashFiles('**/Cargo.lock') }} - name: Run tests run: > cargo test --release --workspace ${{ steps.prepare.outputs.feature-flags }} - name: Run slow tests run: > cargo test --release --workspace ${{ steps.prepare.outputs.feature-flags }} --features expensive-tests -- --ignored - name: Verify working directory is clean run: git diff --exit-code # States that we want to ensure can be built, but that we don't actively run tests for. check-msrv: name: > Check${{ matrix.state != 'NOT_A_PUZZLE' && format(' {0}', matrix.state) || '' }} build on ${{ matrix.target }} runs-on: ${{ matrix.os }} continue-on-error: ${{ matrix.state != 'NOT_A_PUZZLE' }} strategy: matrix: target: - Linux - macOS - Windows state: - ZFuture include: - target: Linux os: ubuntu-latest - target: macOS os: macOS-latest - target: Windows os: windows-latest - state: ZFuture rustflags: '--cfg zcash_unstable="zfuture"' env: RUSTFLAGS: ${{ matrix.rustflags }} RUSTDOCFLAGS: ${{ matrix.rustflags }} steps: - uses: actions/checkout@v4 - id: prepare uses: ./.github/actions/prepare with: extra-features: ${{ matrix.state != 'NOT_A_PUZZLE' && matrix.extra_flags || '' }} - uses: actions/cache@v4 with: path: | ~/.cargo/bin/ ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ target/ key: ${{ runner.os }}-cargo-msrv-${{ hashFiles('**/Cargo.lock') }} - name: Run check run: > cargo check --release --workspace --tests ${{ steps.prepare.outputs.feature-flags }} - 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 - id: prepare uses: ./.github/actions/prepare - uses: actions/cache@v4 with: path: | ~/.cargo/bin/ ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ target/ key: ${{ runner.os }}-cargo-latest - 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 ${{ steps.prepare.outputs.feature-flags }} --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: Copy patch directives into synthetic crate run: | echo "[patch.crates-io]" >> ./ci-build/Cargo.toml cat ./crates/Cargo.toml | sed "0,/.\+\(patch.crates.\+\)/d" >> ./ci-build/Cargo.toml - 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 --features lightwalletd-tonic --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) runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - id: prepare uses: ./.github/actions/prepare - name: Run clippy uses: actions-rs/clippy-check@v1 with: name: Clippy (MSRV) token: ${{ secrets.GITHUB_TOKEN }} args: > ${{ steps.prepare.outputs.feature-flags }} --all-targets -- -D warnings clippy-beta: name: Clippy (beta) runs-on: ubuntu-latest continue-on-error: true steps: - uses: actions/checkout@v4 - id: prepare uses: ./.github/actions/prepare - 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: > ${{ steps.prepare.outputs.feature-flags }} --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 - id: prepare uses: ./.github/actions/prepare - uses: actions/cache@v4 with: path: | ~/.cargo/bin/ ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ target/ key: codecov-cargo-${{ hashFiles('**/Cargo.lock') }} - name: Generate coverage report run: > cargo tarpaulin --engine llvm ${{ steps.prepare.outputs.feature-flags }} --release --timeout 600 --out xml - name: Upload coverage to Codecov uses: codecov/codecov-action@v4.5.0 with: token: ${{ secrets.CODECOV_TOKEN }} doc-links: name: Intra-doc links runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - id: prepare uses: ./.github/actions/prepare - run: cargo fetch # Requires #![deny(rustdoc::broken_intra_doc_links)] in crates. - name: Check intra-doc links run: > cargo doc --all ${{ steps.prepare.outputs.feature-flags }} --document-private-items fmt: name: Rustfmt runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Check formatting run: cargo fmt --all -- --check protobuf: name: protobuf consistency runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - id: prepare uses: ./.github/actions/prepare - name: Install protoc uses: supplypike/setup-bin@v4 with: uri: 'https://github.com/protocolbuffers/protobuf/releases/download/v25.1/protoc-25.1-linux-x86_64.zip' name: 'protoc' version: '25.1' subPath: 'bin' - name: Trigger protobuf regeneration run: > cargo check --workspace ${{ steps.prepare.outputs.feature-flags }} - name: Verify working directory is clean run: git diff --exit-code 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 )