11name : Rust CI
2-
32on :
43 pull_request :
5- paths-ignore :
6- - ' frontend/**'
74 push :
85 branches :
96 - main
10-
117concurrency :
128 group : rust-${{ github.ref }}
139 cancel-in-progress : true
14-
1510permissions :
1611 contents : read
17-
1812defaults :
1913 run :
2014 # Enable fail-fast behavior
2115 shell : bash -e {0}
22-
2316env :
2417 # Disable incremental compilation for faster from-scratch builds
2518 CARGO_INCREMENTAL : 0
2619 RUSTFLAGS : " --cfg tokio_unstable"
2720 CARGO_TERM_COLOR : always
28-
2921jobs :
22+ # Detect if rust code changed
23+ changes :
24+ runs-on : ubuntu-latest
25+ outputs :
26+ rust : ${{ steps.filter.outputs.rust }}
27+ steps :
28+ - uses : actions/checkout@v4
29+ - uses : dorny/paths-filter@v2
30+ id : filter
31+ with :
32+ filters : |
33+ rust:
34+ - '**/*.rs'
35+ - '**/Cargo.toml'
36+ - '**/Cargo.lock'
37+ - '.github/workflows/rust-ci.yml'
38+
3039 fmt :
3140 name : Rustfmt
3241 runs-on : ubuntu-latest
42+ needs : changes
43+ if : needs.changes.outputs.rust == 'true'
3344 steps :
3445 - uses : actions/checkout@v4
35-
3646 - uses : actions-rust-lang/setup-rust-toolchain@v1
3747 with :
3848 toolchain : stable
3949 components : rustfmt
40-
4150 - name : Check formatting
4251 run : cargo fmt --all -- --check
43-
52+
4453 # clippy:
4554 # name: Clippy
4655 # runs-on: depot-ubuntu-24.04
56+ # needs: changes
57+ # if: needs.changes.outputs.rust == 'true'
4758 # steps:
4859 # - uses: actions/checkout@v4
49-
60+ #
5061 # - uses: actions-rust-lang/setup-rust-toolchain@v1
5162 # with:
5263 # toolchain: stable
5364 # components: clippy
54-
65+ #
5566 # - uses: Swatinem/rust-cache@v2
56-
67+ #
5768 # - name: Run clippy
5869 # run: cargo clippy --all-targets --all-features -- -W warnings
59-
70+
6071 check :
6172 name : Check
6273 runs-on : depot-ubuntu-24.04
74+ needs : changes
75+ if : needs.changes.outputs.rust == 'true'
6376 steps :
6477 - uses : actions/checkout@v4
65-
6678 - uses : actions-rust-lang/setup-rust-toolchain@v1
6779 with :
6880 toolchain : stable
69-
7081 - uses : Swatinem/rust-cache@v2
71-
7282 - name : Check
7383 run : cargo check --all-targets --all-features
7484 env :
7585 # Deny warnings
7686 RUSTFLAGS : --cfg tokio_unstable -D warnings
77-
87+
7888 # test:
7989 # name: Test
8090 # runs-on: depot-ubuntu-24.04
91+ # needs: changes
92+ # if: needs.changes.outputs.rust == 'true'
8193 # steps:
8294 # - uses: actions/checkout@v4
8395 #
@@ -93,9 +105,34 @@ jobs:
93105 # deny:
94106 # name: Deny
95107 # runs-on: ubuntu-latest
108+ # needs: changes
109+ # if: needs.changes.outputs.rust == 'true'
96110 # steps:
97111 # - uses: actions/checkout@v4
98112 # - name: cargo deny
99113 # uses: EmbarkStudios/cargo-deny-action@v1
100114 # with:
101115 # rust-version: "1.88.0"
116+
117+ # This job always runs and should be the required status check
118+ status-check :
119+ name : Rust CI Status
120+ runs-on : ubuntu-latest
121+ needs : [changes, fmt, check]
122+ if : always()
123+ steps :
124+ - name : Check job status
125+ run : |
126+ # If rust code didn't change, consider it a pass
127+ if [ "${{ needs.changes.outputs.rust }}" != "true" ]; then
128+ echo "No Rust changes detected, skipping checks"
129+ exit 0
130+ fi
131+
132+ # If rust code changed, verify all jobs passed
133+ if [ "${{ needs.fmt.result }}" == "failure" ] || [ "${{ needs.check.result }}" == "failure" ]; then
134+ echo "One or more required jobs failed"
135+ exit 1
136+ fi
137+
138+ echo "All Rust checks passed"
0 commit comments