name: Rust on: pull_request: jobs: clippy & fmt: runs-on: alpine container: rust:alpine env: CARGO_HOME: ${{ github.workspace }}/.cargo steps: - name: Install node for actions run: | apk add --no-cache nodejs git - name: Install rust components run: | rustup component add clippy rustfmt cargo clippy --version rustfmt --version - name: Checkout uses: actions/checkout@v4 - name: Cache cargo packages uses: actions/cache@v4 with: path: | .cargo/registry .cargo/git target key: rust-build-${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} restore-keys: | rust-${{ runner.os }}-cargo- - name: Clippy (with compile check) run: | manifests=$(find . \( -name .cargo -o -name .git -o -name target \) -prune -o -name Cargo.toml -print) if [ -z "$manifests" ]; then if [ -n "$(find . \( -name .cargo -o -name target \) -prune -o -name '*.rs' -print -quit)" ]; then echo "Rust files found but no Cargo.toml" exit 1 fi echo "No Rust project found" exit 0 fi status=0 for manifest in $manifests; do if (cd "$(dirname "$manifest")" && cargo clippy --all-targets --locked -- -D warnings); then echo "$manifest: Clippy passed" else echo "$manifest: Clippy failed" status=1 fi done exit $status - name: Format check run: | manifests=$(find . \( -name .cargo -o -name .git -o -name target \) -prune -o -name Cargo.toml -print) if [ -z "$manifests" ]; then if [ -n "$(find . \( -name .cargo -o -name target \) -prune -o -name '*.rs' -print -quit)" ]; then echo "Rust files found but no Cargo.toml" exit 1 fi echo "No Rust project found" exit 0 fi status=0 for manifest in $manifests; do if (cd "$(dirname "$manifest")" && cargo fmt --check); then echo "$manifest: formatting OK" else echo "$manifest: needs formatting" status=1 fi done exit $status