name: Rust
on:
push:
branches: [main]
pull_request:
env:
CARGO_TERM_COLOR: always
RUSTFLAGS: -D warnings
permissions:
contents: read
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy
- uses: Swatinem/rust-cache@v2
- run: cargo fmt --all --check
- run: cargo clippy --all-targets --all-features
- run: cargo doc --no-deps
test:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
features: ["", "rayon"]
steps:
- uses: actions/checkout@v7
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- run: cargo test --features "${{ matrix.features }}"
- run: cargo build --examples --features "${{ matrix.features }}"
fixtures:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: astral-sh/setup-uv@v9.0.0
- run: uv run --with opencv-python-headless --with numpy tests/fixtures/generate.py
- name: Fixtures match regenerated output
run: git diff --exit-code tests/fixtures/opencv.txt
release-please:
needs: [check, test, fixtures]
if: github.event_name == 'push'
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
outputs:
released: ${{ steps.release.outputs.release_created }}
steps:
- uses: googleapis/release-please-action@v5
id: release
with:
config-file: release-please-config.json
manifest-file: .release-please-manifest.json
publish:
needs: release-please
if: needs.release-please.outputs.released == 'true'
runs-on: ubuntu-latest
environment:
name: crates-io
url: https://crates.io/crates/mtb-align
permissions:
contents: read
id-token: write
steps:
- uses: actions/checkout@v7
- uses: dtolnay/rust-toolchain@stable
- uses: rust-lang/crates-io-auth-action@v1
id: auth
- env:
CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }}
run: |
version=$(cargo metadata --no-deps --format-version 1 | jq -r '.packages[0].version')
if curl -sfo /dev/null -H "User-Agent: mtb-align-ci" "https://crates.io/api/v1/crates/mtb-align/$version"; then
echo "mtb-align $version is already published"
else
cargo publish
fi