Repository navigation
feat: add cargo-deny for supply chain safety #834
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
2a05dd2
ed5f110
34643fc
ad81f25
6fc8218
476372b
6b3fcab
c7f6fbc
bbb5321
ce4dec7
9aefa98
ee849d3
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -16,6 +16,15 @@ jobs: | |
| - name: Check formatting | ||
| run: cargo fmt --all -- --check | ||
|
|
||
| deny-check: | ||
| name: cargo-deny | ||
| runs-on: ubuntu-latest | ||
| steps: | ||
| - name: Checkout repository | ||
| uses: actions/checkout@v6 | ||
| - name: Run cargo deny | ||
| uses: EmbarkStudios/cargo-deny-action@v2 | ||
|
|
||
| clippy: | ||
|
Comment on lines
+25
to
28
|
||
| name: Clippy (${{ matrix.name }}) | ||
| runs-on: ubuntu-latest | ||
|
|
@@ -71,18 +80,18 @@ jobs: | |
|
|
||
| # Roll-up job for branch protection | ||
| code-style: | ||
| name: Code Style (fmt + clippy) | ||
| name: Code Style (fmt + clippy + deny) | ||
| runs-on: ubuntu-latest | ||
| if: always() | ||
| needs: [format, clippy, clippy-windows] | ||
| needs: [format, clippy, clippy-windows, deny-check] | ||
| steps: | ||
| - run: | | ||
| if [[ "${{ needs.format.result }}" != "success" || "${{ needs.clippy.result }}" != "success" ]]; then | ||
| if [[ "${{ needs.format.result }}" != "success" || "${{ needs.clippy.result }}" != "success" || "${{ needs.deny-check.result }}" != "success" ]]; then | ||
| echo "One or more jobs failed" | ||
| exit 1 | ||
| fi | ||
| # clippy-windows only runs on main PRs, so skip/success are both acceptable | ||
| if [[ "${{ needs.clippy-windows.result }}" == "failure" ]]; then | ||
| echo "Windows clippy failed" | ||
| # clippy-windows only runs on main PRs, so skipped is acceptable but failure is not | ||
| if [[ "${{ needs.clippy-windows.result }}" != "success" && "${{ needs.clippy-windows.result }}" != "skipped" ]]; then | ||
| echo "Windows clippy failed: ${{ needs.clippy-windows.result }}" | ||
| exit 1 | ||
| fi | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,50 @@ | ||
| [advisories] | ||
| unmaintained = "workspace" | ||
| yanked = "deny" | ||
| ignore = [ | ||
| # Pre-existing advisories — tracked for upgrade in separate PRs | ||
| # serde_yml unsound/unmaintained — direct dep, upgrade tracked separately | ||
| "RUSTSEC-2025-0068", | ||
| # tokio-tar PAX header parsing — sandbox containers only | ||
| "RUSTSEC-2025-0111", | ||
| # wasmtime fd_renumber host panic — WASIp1, mitigated by fuel limits | ||
| "RUSTSEC-2025-0046", | ||
| # wasmtime shared linear memory unsoundness — no shared memory in our guests | ||
| "RUSTSEC-2025-0118", | ||
| # wasmtime guest-controlled resource exhaustion — mitigated by fuel/memory limits | ||
| "RUSTSEC-2026-0020", | ||
| # wasmtime wasi:http/types.fields panic — mitigated by fuel limits | ||
| "RUSTSEC-2026-0021", | ||
| ] | ||
|
|
||
| [licenses] | ||
| version = 2 | ||
| allow = [ | ||
| "MIT", | ||
| "Apache-2.0", | ||
| "Apache-2.0 WITH LLVM-exception", | ||
| "BSD-2-Clause", | ||
| "BSD-3-Clause", | ||
| "ISC", | ||
| "Unicode-3.0", | ||
| "Unicode-DFS-2016", | ||
| "OpenSSL", | ||
| "Zlib", | ||
| "MPL-2.0", | ||
| "0BSD", | ||
| "BSL-1.0", | ||
| "CC0-1.0", | ||
| "Unlicense", | ||
| "CDLA-Permissive-2.0", | ||
| ] | ||
| unused-allowed-license = "allow" | ||
|
|
||
| [bans] | ||
| multiple-versions = "warn" | ||
| wildcards = "deny" | ||
|
|
||
| [sources] | ||
| unknown-registry = "deny" | ||
| unknown-git = "deny" | ||
| allow-registry = ["https://github.com/rust-lang/crates.io-index"] | ||
| allow-git = [] |
| Original file line number | Diff line number | Diff line change | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,21 @@ | ||||||||||||
| #!/usr/bin/env bash | ||||||||||||
| set -euo pipefail | ||||||||||||
|
|
||||||||||||
|
||||||||||||
| # Ensure we are running from the repository root | |
| SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" | |
| cd "${SCRIPT_DIR}/../.." |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fixed in ee849d3 — added cd "$(git rev-parse --show-toplevel)" at the top of the script.
Copilot
AI
Mar 10, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This script is labeled quality_gate_strict, but it silently skips the cargo-deny checks when cargo-deny isn’t installed (only printing a warning). That can allow local/CI “strict” runs to pass without supply-chain checks. Consider failing with a clear install instruction, or gating the skip behind an explicit opt-out env var (e.g. ALLOW_MISSING_CARGO_DENY=1).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fixed in bbb5321 — strict mode now fails when cargo-deny is not installed.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In the new
deny-checkjob, thesteps:list items are not indented understeps(they’re aligned at the same level), which makes the workflow YAML invalid and will prevent GitHub Actions from parsing the file. Also consider adding the same Rust toolchain installation step used by the other jobs (dtolnay/rust-toolchain@stable) socargois guaranteed to be available when running the cargo-deny action.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Verified — YAML is valid and already uses the GitHub Action, not
cargo install.