Skip to content
Latchkey

How to Run rustfmt and clippy in GitHub Actions

Rust catches a lot at compile time, but rustfmt and clippy catch the style and correctness smells the compiler allows.

Run cargo fmt --check and cargo clippy -- -D warnings so any formatting drift or lint warning fails the job.

Steps

  • Install the rustfmt and clippy components with the toolchain.
  • Run cargo fmt --all -- --check to verify formatting.
  • Run cargo clippy --all-targets -- -D warnings so warnings become errors.

Workflow

.github/workflows/rust-lint.yml
name: Rust Lint
on: [pull_request]
jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
        with:
          components: rustfmt, clippy
      - run: cargo fmt --all -- --check
      - run: cargo clippy --all-targets --all-features -- -D warnings

Notes

  • Cache the cargo registry and target dir to keep clippy runs fast.
  • On Latchkey managed runners Rust lint jobs run cheaper and self-heal if a runner drops.

Verify it actually works

A workflow that runs is not a workflow that works. Confirm the behaviour on a real event rather than on a manual dispatch, because trigger conditions, permissions, and context values all differ between the two.

Terminal
# 1. validate the file before pushing
docker run --rm -v "$(pwd):/repo" --workdir /repo rhysd/actionlint:latest -color

# 2. trigger the real event, not workflow_dispatch
git commit --allow-empty -m "ci: verify trigger" && git push

# 3. watch it and read the conclusion, not just the colour
gh run watch
gh run view --log-failed

What usually goes wrong first

  • The workflow file must exist on the default branch before scheduled or dispatch triggers appear at all.
  • GITHUB_TOKEN permissions default to read-only in many organisations. Declare a permissions: block listing every scope the job needs.
  • Fork pull requests get a read-only token and no access to secrets, regardless of workflow configuration.
  • actions/checkout gives you depth 1 on a detached HEAD, so anything needing history or a branch name needs fetch-depth: 0.

Frequently asked questions

How do I run rustfmt and clippy in GitHub Actions?
Run cargo fmt --check and cargo clippy -- -D warnings so any formatting drift or lint warning fails the job.

Related guides

References

Run this faster and cheaper on Latchkey managed runners - self-healing included. Start free → 30-day trial · No credit card