ci #11
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: ci | |
on: | |
pull_request: | |
push: | |
branches: | |
- main | |
workflow_dispatch: | |
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 | |
id: 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 from other repositories cannot not be trusted with repository secrets | |
if: matrix.os == 'windows-latest' && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) | |
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 unfortunately we cannot run tests | |
# on PRs from other repositories | |
if: matrix.os != 'windows-latest' || github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository | |
env: | |
# make insta generate new snapshots in CI | |
INSTA_UPDATE: new | |
run: cargo insta test --color=never | |
- 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: '**/*.snap.new' | |
- name: Upload unix binary | |
if: ${{ matrix.os != 'windows-latest' && ( success() || steps.build.outcome == 'success' ) }} | |
uses: actions/upload-artifact@v3 | |
with: | |
name: ${{ matrix.os }}-${{ matrix.rust }} | |
path: target/debug/bandwhich | |
- name: Upload windows binary | |
if: ${{ matrix.os == 'windows-latest' && ( success() || steps.build.outcome == 'success' ) }} | |
uses: actions/upload-artifact@v3 | |
with: | |
name: ${{ matrix.os }}-${{ matrix.rust }} | |
path: | | |
target/debug/bandwhich.exe | |
target/debug/bandwhich.pdb |