1 name: CI
2
3 on:
4 push:
5 pull_request:
6 workflow_dispatch:
7
8 concurrency:
9 group: ci-${{ github.ref }}
10 cancel-in-progress: true
11
12 permissions:
13 contents: read
14
15 jobs:
16 # ── Formatting ────────────────────────────────────────────────────────────
17 fmt:
18 name: Format
19 runs-on: macos-26
20 steps:
21 - uses: actions/checkout@v6
22 - uses: dtolnay/rust-toolchain@stable
23 with:
24 components: rustfmt
25 - run: cargo fmt --all -- --check
26
27 # ── Lint ──────────────────────────────────────────────────────────────────
28 clippy:
29 name: Clippy (macOS)
30 runs-on: macos-26
31 env:
32 GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
33 GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
34 GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
35 GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
36 HF_TOKEN: ${{ secrets.HF_TOKEN }}
37 steps:
38 - uses: actions/checkout@v6
39 - uses: dtolnay/rust-toolchain@stable
40 with:
41 components: clippy
42 - uses: Swatinem/rust-cache@v2
43 - run: cargo clippy --all-targets -- -D warnings
44
45 # ── Tests (macOS — the only platform where tests run natively) ────────────
46 test:
47 name: Test (macOS)
48 runs-on: macos-26
49 env:
50 GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
51 GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
52 GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
53 GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
54 HF_TOKEN: ${{ secrets.HF_TOKEN }}
55 steps:
56 - uses: actions/checkout@v6
57 - uses: dtolnay/rust-toolchain@stable
58 - uses: Swatinem/rust-cache@v2
59 - run: cargo test --lib
60
61 # ── Cross-compile checks for Darwin platforms (highest priority) ─────────
62 check-macos-arm64:
63 name: Check (macOS arm64)
64 runs-on: macos-26
65 env:
66 GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
67 GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
68 GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
69 GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
70 HF_TOKEN: ${{ secrets.HF_TOKEN }}
71 steps:
72 - uses: actions/checkout@v6
73 - uses: dtolnay/rust-toolchain@stable
74 with:
75 targets: aarch64-apple-darwin
76 - uses: Swatinem/rust-cache@v2
77 with:
78 key: macos-arm64
79 - run: cargo check --target aarch64-apple-darwin
80
81 check-macos-intel:
82 name: Check (macOS x86_64)
83 runs-on: macos-26
84 env:
85 GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
86 GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
87 GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
88 GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
89 HF_TOKEN: ${{ secrets.HF_TOKEN }}
90 steps:
91 - uses: actions/checkout@v6
92 - uses: dtolnay/rust-toolchain@stable
93 with:
94 targets: x86_64-apple-darwin
95 - uses: Swatinem/rust-cache@v2
96 with:
97 key: macos-intel
98 - run: cargo check --target x86_64-apple-darwin
99
100 check-ios:
101 name: Check (iOS device)
102 runs-on: macos-26
103 env:
104 GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
105 GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
106 GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
107 GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
108 HF_TOKEN: ${{ secrets.HF_TOKEN }}
109 steps:
110 - uses: actions/checkout@v6
111 - uses: dtolnay/rust-toolchain@stable
112 with:
113 targets: aarch64-apple-ios
114 - uses: Swatinem/rust-cache@v2
115 with:
116 key: ios
117 - run: cargo check --target aarch64-apple-ios
118
119 check-ios-sim:
120 name: Check (iOS simulator)
121 runs-on: macos-26
122 env:
123 GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
124 GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
125 GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
126 GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
127 HF_TOKEN: ${{ secrets.HF_TOKEN }}
128 steps:
129 - uses: actions/checkout@v6
130 - uses: dtolnay/rust-toolchain@stable
131 with:
132 targets: aarch64-apple-ios-sim
133 - uses: Swatinem/rust-cache@v2
134 with:
135 key: ios-sim
136 - run: cargo check --target aarch64-apple-ios-sim
137
138 check-tvos:
139 name: Check (tvOS device)
140 runs-on: macos-26
141 env:
142 GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
143 GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
144 GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
145 GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
146 HF_TOKEN: ${{ secrets.HF_TOKEN }}
147 steps:
148 - uses: actions/checkout@v6
149 - uses: dtolnay/rust-toolchain@nightly
150 with:
151 components: rust-src
152 - uses: Swatinem/rust-cache@v2
153 with:
154 key: tvos
155 - run: cargo +nightly check -Z build-std --target aarch64-apple-tvos
156
157 check-tvos-sim:
158 name: Check (tvOS simulator)
159 runs-on: macos-26
160 env:
161 GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
162 GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
163 GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
164 GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
165 HF_TOKEN: ${{ secrets.HF_TOKEN }}
166 steps:
167 - uses: actions/checkout@v6
168 - uses: dtolnay/rust-toolchain@nightly
169 with:
170 components: rust-src
171 - uses: Swatinem/rust-cache@v2
172 with:
173 key: tvos-sim
174 - run: cargo +nightly check -Z build-std --target aarch64-apple-tvos-sim
175
176 check-visionos:
177 name: Check (visionOS device)
178 runs-on: macos-26
179 env:
180 GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
181 GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
182 GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
183 GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
184 HF_TOKEN: ${{ secrets.HF_TOKEN }}
185 steps:
186 - uses: actions/checkout@v6
187 - uses: dtolnay/rust-toolchain@nightly
188 with:
189 components: rust-src
190 - uses: Swatinem/rust-cache@v2
191 with:
192 key: visionos
193 - run: cargo +nightly check -Z build-std --target aarch64-apple-visionos
194
195 check-visionos-sim:
196 name: Check (visionOS simulator)
197 runs-on: macos-26
198 env:
199 GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
200 GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
201 GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
202 GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
203 HF_TOKEN: ${{ secrets.HF_TOKEN }}
204 steps:
205 - uses: actions/checkout@v6
206 - uses: dtolnay/rust-toolchain@nightly
207 with:
208 components: rust-src
209 - uses: Swatinem/rust-cache@v2
210 with:
211 key: visionos-sim
212 - run: cargo +nightly check -Z build-std --target aarch64-apple-visionos-sim
213
214 check-watchos:
215 name: Check (watchOS device)
216 runs-on: macos-26
217 env:
218 GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
219 GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
220 GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
221 GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
222 HF_TOKEN: ${{ secrets.HF_TOKEN }}
223 steps:
224 - uses: actions/checkout@v6
225 - uses: dtolnay/rust-toolchain@nightly
226 with:
227 components: rust-src
228 - uses: Swatinem/rust-cache@v2
229 with:
230 key: watchos
231 - run: cargo +nightly check -Z build-std --target aarch64-apple-watchos
232
233 check-watchos-sim:
234 name: Check (watchOS simulator)
235 runs-on: macos-26
236 env:
237 GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
238 GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
239 GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
240 GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
241 HF_TOKEN: ${{ secrets.HF_TOKEN }}
242 steps:
243 - uses: actions/checkout@v6
244 - uses: dtolnay/rust-toolchain@nightly
245 with:
246 components: rust-src
247 - uses: Swatinem/rust-cache@v2
248 with:
249 key: watchos-sim
250 - run: cargo +nightly check -Z build-std --target aarch64-apple-watchos-sim
251
252 # ── Cross-compile checks for Unix-family platforms ────────────────────────
253 check-linux:
254 name: Check (Linux x86_64)
255 runs-on: ubuntu-latest
256 env:
257 GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
258 GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
259 GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
260 GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
261 HF_TOKEN: ${{ secrets.HF_TOKEN }}
262 steps:
263 - uses: actions/checkout@v6
264 - uses: dtolnay/rust-toolchain@stable
265 with:
266 targets: x86_64-unknown-linux-gnu
267 - uses: Swatinem/rust-cache@v2
268 with:
269 key: linux-x86_64
270 - run: cargo check --target x86_64-unknown-linux-gnu
271
272 check-android:
273 name: Check (Android arm64)
274 runs-on: ubuntu-latest
275 env:
276 GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
277 GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
278 GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
279 GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
280 HF_TOKEN: ${{ secrets.HF_TOKEN }}
281 CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER: aarch64-linux-android34-clang
282 CC_aarch64_linux_android: aarch64-linux-android34-clang
283 AR_aarch64_linux_android: llvm-ar
284 steps:
285 - uses: actions/checkout@v6
286 - uses: dtolnay/rust-toolchain@stable
287 with:
288 targets: aarch64-linux-android
289 - uses: android-actions/setup-android@v4
290 - name: Configure Android NDK toolchain
291 shell: bash
292 run: |
293 echo "${ANDROID_NDK_LATEST_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin" >> "$GITHUB_PATH"
294 - uses: Swatinem/rust-cache@v2
295 with:
296 key: android-arm64
297 - run: cargo check --target aarch64-linux-android
298
299 # ── Cross-compile checks for Windows (lowest priority) ────────────────────
300 check-windows:
301 name: Check (Windows x86_64)
302 runs-on: windows-latest
303 env:
304 GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
305 GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
306 GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
307 GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
308 HF_TOKEN: ${{ secrets.HF_TOKEN }}
309 steps:
310 - uses: actions/checkout@v6
311 - uses: dtolnay/rust-toolchain@stable
312 with:
313 targets: x86_64-pc-windows-msvc
314 - uses: Swatinem/rust-cache@v2
315 with:
316 key: windows-x86_64
317 - run: cargo check --target x86_64-pc-windows-msvc