-
Notifications
You must be signed in to change notification settings - Fork 2
201 lines (185 loc) · 5.73 KB
/
ci.yml
File metadata and controls
201 lines (185 loc) · 5.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
env:
CARGO_TERM_COLOR: always
RUSTFLAGS: -Dwarnings
permissions:
contents: read
jobs:
# Check formatting with rustfmt
formatting:
name: cargo fmt
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
# Ensure rustfmt is installed and setup problem matcher
- uses: actions-rust-lang/setup-rust-toolchain@v1
with:
components: rustfmt
- name: Rustfmt Check
uses: actions-rust-lang/rustfmt@v1
# Lint with clippy
clippy:
name: Clippy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions-rust-lang/setup-rust-toolchain@v1
with:
components: clippy
- name: Run clippy
run: cargo clippy --all-targets --all-features -- -D warnings
# Build and test on multiple platforms
test:
name: Test (${{ matrix.os }})
runs-on: ${{ matrix.os }}
needs: [formatting, clippy]
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
steps:
- uses: actions/checkout@v6
- uses: actions-rust-lang/setup-rust-toolchain@v1
- uses: Swatinem/rust-cache@v2
- name: Build
run: cargo build --verbose
- name: Run doc tests
run: cargo test --doc --all-features
- name: Run example tests
run: cargo test --examples --all-features
- name: Run tests
run: cargo test --tests --all-features
# Run tests using Miri (curated subset)
miri:
name: Miri (${{ matrix.os }})
runs-on: ${{ matrix.os }}
needs: test
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]
steps:
- uses: actions/checkout@v6
- uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: nightly
components: miri
- uses: Swatinem/rust-cache@v2
- name: Install Miri
run: cargo miri setup
- name: Test with Miri (core DS + light policies)
run: |
cargo miri test --package cachekit --lib ds:: -- --skip concurrent --skip stress --skip large --skip performance --skip memory
cargo miri test --package cachekit --lib policy:: -- --skip concurrent --skip stress --skip large --skip performance --skip memory
env:
MIRIFLAGS: -Zmiri-isolation-error=warn
# Property-based tests with higher case count
property-tests:
name: Property Tests
runs-on: ubuntu-latest
needs: test
steps:
- uses: actions/checkout@v6
- uses: actions-rust-lang/setup-rust-toolchain@v1
- uses: Swatinem/rust-cache@v2
- name: Run property tests with increased cases
run: PROPTEST_CASES=1000 cargo test --lib property_tests
env:
RUST_BACKTRACE: 1
# Quick fuzz test on PRs (smoke test)
fuzz-quick:
name: Fuzz Tests (Quick)
runs-on: ubuntu-latest
needs: test
if: github.event_name == 'pull_request'
steps:
- uses: actions/checkout@v6
- uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: nightly
- uses: Swatinem/rust-cache@v2
with:
workspaces: "fuzz -> target"
- name: Install cargo-fuzz
run: cargo install cargo-fuzz
- name: Run fuzz smoke tests (60s each)
run: |
cd fuzz
# Run arbitrary_ops targets for smoke testing (representative subset)
# Convention: targets ending in _arbitrary_ops test general operation sequences
TARGETS=$(cargo fuzz list | grep '_arbitrary_ops$' || cargo fuzz list | head -n 10)
echo "Running smoke tests for the following targets:"
echo "$TARGETS"
echo ""
seed=1
for target in $TARGETS; do
echo "[$seed] Fuzzing $target for 60 seconds..."
cargo fuzz run "$target" -- -max_total_time=60 -seed=$seed -print_final_stats=1
seed=$((seed + 1))
echo ""
done
# Documentation build check
docs:
name: Documentation
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: stable
- uses: Swatinem/rust-cache@v2
- name: Build documentation
run: cargo doc --no-deps --all-features
env:
RUSTDOCFLAGS: -Dwarnings
# Security audit
security:
name: Security Audit
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: rustsec/audit-check@v2
with:
token: ${{ secrets.GITHUB_TOKEN }}
# Dependency policy checks across all execution paths
cargo-deny:
name: Cargo Deny
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions-rust-lang/setup-rust-toolchain@v1
- uses: Swatinem/rust-cache@v2
- name: Install cargo-deny
run: cargo install --locked cargo-deny
- name: Run cargo-deny checks
run: cargo deny check all
# Benchmarks (only on the main branch)
bench:
name: Benchmarks
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v6
- uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: stable
- uses: Swatinem/rust-cache@v2
- name: Run benchmarks
run: cargo bench --no-fail-fast
# Minimum Supported Rust Version check
msrv:
name: MSRV Check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: 1.85.0 # MSRV for Rust 2024 edition
- uses: Swatinem/rust-cache@v2
- name: Check MSRV
run: cargo check --all-features