name: ci on: pull_request: push: branches: - main jobs: get-msrv: name: Get declared MSRV from Cargo.toml runs-on: ubuntu-latest outputs: msrv: ${{ steps.get_msrv.outputs.msrv }} steps: - name: Install ripgrep run: sudo apt-get install -y ripgrep - name: Checkout repository uses: actions/checkout@v4 - name: Get MSRV id: get_msrv run: rg '^\s*rust-version\s*=\s*"(\d+(\.\d+){0,2})"' --replace 'msrv=$1' Cargo.toml >> "$GITHUB_OUTPUT" test: name: test needs: get-msrv env: # Emit backtraces on panics. RUST_BACKTRACE: 1 runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] rust: - ${{ needs.get-msrv.outputs.msrv }} - stable - nightly steps: - name: Checkout repository uses: actions/checkout@v4 - name: Install Rust uses: dtolnay/rust-toolchain@master with: toolchain: ${{ matrix.rust }} components: rustfmt, clippy - name: Check formatting run: cargo fmt --all -- --check - name: Build run: cargo build --verbose # This is useful for debugging problems when the expected build artifacts # (like shell completions and man pages) aren't generated. - name: Show build.rs stderr shell: bash run: | # it's probably okay to assume no spaces? STDERR_FILES=$(find "./target/debug" -name stderr | grep bandwhich) for FILE in $STDERR_FILES; do echo "::group::$FILE" cat "$FILE" echo "::endgroup::" done - name: Run clippy run: cargo clippy --all-targets --all-features -- -D warnings - name: Install cargo-insta uses: taiki-e/install-action@v2 with: tool: cargo-insta - name: Install npcap on Windows # PRs cannot not be trusted with repository secrets if: (matrix.os == 'windows-latest') && (github.event_name != 'pull_request') env: NPCAP_OEM_URL: ${{ secrets.NPCAP_OEM_URL }} run: | Invoke-WebRequest -Uri "$env:NPCAP_OEM_URL" -OutFile "$env:TEMP/npcap-oem.exe" # for this ridiculous `&` syntax alone, I'd rather use COBOL than Powershell # see https://stackoverflow.com/a/1674950/5637701 & "$env:TEMP/npcap-oem.exe" /S - name: Run tests using cargo-insta id: run_tests # npcap is needed to run tests on Windows, so this is an unfortunate # sacrifice we have to make in the name of security if: (matrix.os != 'windows-latest') || (github.event_name != 'pull_request') run: cargo insta test - name: Upload snapshots of failed tests if: ${{ failure() && steps.run_tests.outcome == 'failure' }} uses: actions/upload-artifact@v3 with: name: ${{ matrix.os }}-${{ matrix.rust }}-failed_snapshots path: src/tests/cases/snapshots/*.snap.new - name: Upload unix binary if: matrix.os != 'windows-latest' uses: actions/upload-artifact@v3 with: name: ${{ matrix.os }}-${{ matrix.rust }} path: target/debug/bandwhich - name: Upload windows binary if: matrix.os == 'windows-latest' uses: actions/upload-artifact@v3 with: name: ${{ matrix.os }}-${{ matrix.rust }} path: | target/debug/bandwhich.exe target/debug/bandwhich.pdb