name: Test Rust on: push: branches: [master] pull_request: branches: [master] concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: changes: name: Paths filter runs-on: ubuntu-22.04 outputs: should_run: ${{ steps.filter.outputs.src }} steps: - uses: actions/checkout@v4 - uses: AurorNZ/paths-filter@v4 id: filter with: filters: | src: - '!web/package.json' - '!web/package-lock.json' - '!web/packages/**' - '!**/*.md' build: needs: changes if: needs.changes.outputs.should_run== 'true' name: Test Rust ${{ matrix.rust_version }} / ${{ matrix.os }} runs-on: ${{ matrix.os }} continue-on-error: ${{ matrix.rust_version == 'nightly' || matrix.rust_version == 'beta' }} strategy: fail-fast: false matrix: rust_version: [stable] os: [ubuntu-22.04, windows-latest, macos-latest] include: - rust_version: nightly os: ubuntu-22.04 - rust_version: beta os: ubuntu-22.04 steps: - uses: actions/checkout@v4 - name: Install Rust toolchain uses: dtolnay/rust-toolchain@stable with: toolchain: ${{ matrix.rust_version }} components: rustfmt, clippy - name: Install Linux dependencies if: runner.os == 'Linux' run: | sudo add-apt-repository ppa:kisak/kisak-mesa -y sudo apt-get update sudo apt install -y libasound2-dev libxcb-shape0-dev libxcb-xfixes0-dev libgtk-3-dev mesa-vulkan-drivers libpango1.0-dev - name: Cache Cargo output uses: Swatinem/rust-cache@v2 with: shared-key: "desktop" save-if: ${{ github.ref == 'refs/heads/master' }} - name: Check formatting if: runner.os == 'Linux' run: cargo fmt --all -- --check - name: Check clippy # not critical on other platforms, and slows down Windows if: runner.os == 'Linux' # Don't fail the build for clippy on nightly, since we get a lot of false-positives run: cargo clippy --all --all-features --tests ${{ (matrix.rust_version != 'nightly' && '-- -D warnings') || '' }} - name: Check licensing and duplicates in used crates if: ${{ runner.os == 'Linux' && matrix.rust_version == 'stable' }} uses: EmbarkStudios/cargo-deny-action@v1 - name: Check documentation if: runner.os == 'Linux' run: cargo doc --no-deps --all-features env: RUSTDOCFLAGS: -D warnings - name: Install cargo nextest uses: taiki-e/install-action@v2 with: tool: cargo-nextest - name: Run tests with image tests if: runner.os != 'macOS' # TODO: Disallow retries in general once we can allow only after SIGABRT. # See: https://github.com/nextest-rs/nextest/issues/1172 run: cargo nextest run --workspace --locked --no-fail-fast --retries 2 -j 4 --features imgtests,lzma,jpegxr env: XDG_RUNTIME_DIR: '' # dummy value, just to silence warnings about it missing - name: Run tests without image tests if: runner.os == 'macOS' run: cargo nextest run --workspace --locked --no-fail-fast -j 4 --features lzma,jpegxr env: XDG_RUNTIME_DIR: '' # dummy value, just to silence warnings about it missing - name: Upload images if: failure() uses: actions/upload-artifact@v4 with: name: swf_images_${{ matrix.rust_version }}_${{ matrix.os }} path: | tests*/**/*.actual*.png tests*/**/*.difference*.png check-required: needs: changes if: needs.changes.outputs.should_run == 'false' name: Test Rust ${{ matrix.rust_version }} / ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: matrix: rust_version: [stable] os: [ubuntu-22.04, windows-latest, macos-latest] include: - rust_version: nightly os: ubuntu-22.04 - rust_version: beta os: ubuntu-22.04 steps: - name: No-op run: echo noop