Expand GresIQ credential env vars for CI and build
- Add GRESIQ_API_KEY_DEV, GRESIQ_API_SECRET_DEV, GRESIQ_API_KEY_PRODUCTION, GRESIQ_API_SECRET_PRODUCTION, and HF_TOKEN to all CI jobs and release workflows. - Update build.rs to watch all GresIQ credential variants. - Refactor pulse client to use per-environment embedded credentials.
keypair34 committed
Apr 19, 2026 at 15:38 UTC
da160f964769ebf7c6b1275e76c71105fd5a0832
6 files changed
+102
-9
.github/workflows/ci.yml
+60
@@ -30,6 +30,12 @@ jobs:
30
clippy:
31
name: Clippy (macOS)
32
runs-on: macos-26
33
+ env:
34
+ GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
35
+ GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
36
+ GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
37
+ GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
38
+ HF_TOKEN: ${{ secrets.HF_TOKEN }}
39
steps:
40
- uses: actions/checkout@v6
41
- uses: dtolnay/rust-toolchain@stable
@@ -42,6 +48,12 @@ jobs:
48
test:
49
name: Test (macOS)
50
runs-on: macos-26
51
+ env:
52
+ GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
53
+ GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
54
+ GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
55
+ GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
56
+ HF_TOKEN: ${{ secrets.HF_TOKEN }}
57
steps:
58
- uses: actions/checkout@v6
59
- uses: dtolnay/rust-toolchain@stable
@@ -52,6 +64,12 @@ jobs:
64
check-ios:
65
name: Check (iOS device)
66
runs-on: macos-26
67
+ env:
68
+ GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
69
+ GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
70
+ GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
71
+ GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
72
+ HF_TOKEN: ${{ secrets.HF_TOKEN }}
73
steps:
74
- uses: actions/checkout@v6
75
- uses: dtolnay/rust-toolchain@stable
@@ -65,6 +83,12 @@ jobs:
83
check-ios-sim:
84
name: Check (iOS simulator)
85
runs-on: macos-26
86
+ env:
87
+ GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
88
+ GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
89
+ GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
90
+ GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
91
+ HF_TOKEN: ${{ secrets.HF_TOKEN }}
92
steps:
93
- uses: actions/checkout@v6
94
- uses: dtolnay/rust-toolchain@stable
@@ -78,6 +102,12 @@ jobs:
102
check-tvos:
103
name: Check (tvOS device)
104
runs-on: macos-26
105
+ env:
106
+ GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
107
+ GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
108
+ GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
109
+ GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
110
+ HF_TOKEN: ${{ secrets.HF_TOKEN }}
111
steps:
112
- uses: actions/checkout@v6
113
- uses: dtolnay/rust-toolchain@nightly
@@ -91,6 +121,12 @@ jobs:
121
check-tvos-sim:
122
name: Check (tvOS simulator)
123
runs-on: macos-26
124
+ env:
125
+ GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
126
+ GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
127
+ GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
128
+ GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
129
+ HF_TOKEN: ${{ secrets.HF_TOKEN }}
130
steps:
131
- uses: actions/checkout@v6
132
- uses: dtolnay/rust-toolchain@nightly
@@ -104,6 +140,12 @@ jobs:
140
check-visionos:
141
name: Check (visionOS device)
142
runs-on: macos-26
143
+ env:
144
+ GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
145
+ GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
146
+ GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
147
+ GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
148
+ HF_TOKEN: ${{ secrets.HF_TOKEN }}
149
steps:
150
- uses: actions/checkout@v6
151
- uses: dtolnay/rust-toolchain@nightly
@@ -117,6 +159,12 @@ jobs:
159
check-visionos-sim:
160
name: Check (visionOS simulator)
161
runs-on: macos-26
162
+ env:
163
+ GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
164
+ GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
165
+ GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
166
+ GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
167
+ HF_TOKEN: ${{ secrets.HF_TOKEN }}
168
steps:
169
- uses: actions/checkout@v6
170
- uses: dtolnay/rust-toolchain@nightly
@@ -130,6 +178,12 @@ jobs:
178
check-watchos:
179
name: Check (watchOS device)
180
runs-on: macos-26
181
+ env:
182
+ GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
183
+ GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
184
+ GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
185
+ GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
186
+ HF_TOKEN: ${{ secrets.HF_TOKEN }}
187
steps:
188
- uses: actions/checkout@v6
189
- uses: dtolnay/rust-toolchain@nightly
@@ -143,6 +197,12 @@ jobs:
197
check-watchos-sim:
198
name: Check (watchOS simulator)
199
runs-on: macos-26
200
+ env:
201
+ GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
202
+ GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
203
+ GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
204
+ GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
205
+ HF_TOKEN: ${{ secrets.HF_TOKEN }}
206
steps:
207
- uses: actions/checkout@v6
208
- uses: dtolnay/rust-toolchain@nightly
.github/workflows/release-sdk-dart.yml
+12
@@ -18,6 +18,12 @@ jobs:
18
outputs:
19
version: ${{ steps.meta.outputs.version }}
20
21
+ env:
22
+ GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
23
+ GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
24
+ GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
25
+ GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
26
+ HF_TOKEN: ${{ secrets.HF_TOKEN }}
27
steps:
28
- name: Checkout
29
uses: actions/checkout@v6
@@ -77,6 +83,12 @@ jobs:
83
runs-on: ubuntu-latest
84
if: startsWith(github.ref, 'refs/tags/')
85
86
+ env:
87
+ GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
88
+ GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
89
+ GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
90
+ GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
91
+ HF_TOKEN: ${{ secrets.HF_TOKEN }}
92
steps:
93
- name: Checkout
94
uses: actions/checkout@v6
.github/workflows/release-sdk-npm.yml
+12
@@ -18,6 +18,12 @@ jobs:
18
outputs:
19
version: ${{ steps.meta.outputs.version }}
20
21
+ env:
22
+ GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
23
+ GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
24
+ GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
25
+ GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
26
+ HF_TOKEN: ${{ secrets.HF_TOKEN }}
27
steps:
28
- name: Checkout
29
uses: actions/checkout@v6
@@ -73,6 +79,12 @@ jobs:
79
runs-on: ubuntu-latest
80
if: startsWith(github.ref, 'refs/tags/')
81
82
+ env:
83
+ GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
84
+ GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
85
+ GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
86
+ GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
87
+ HF_TOKEN: ${{ secrets.HF_TOKEN }}
88
steps:
89
- name: Checkout
90
uses: actions/checkout@v6
.github/workflows/release-sdk-swift.yml
+7
@@ -13,6 +13,13 @@ jobs:
13
build-and-release:
14
runs-on: macos-26
15
16
+ env:
17
+ GRESIQ_API_KEY_DEV: ${{ secrets.GRESIQ_API_KEY_DEV }}
18
+ GRESIQ_API_SECRET_DEV: ${{ secrets.GRESIQ_API_SECRET_DEV }}
19
+ GRESIQ_API_KEY_PRODUCTION: ${{ secrets.GRESIQ_API_KEY_PRODUCTION }}
20
+ GRESIQ_API_SECRET_PRODUCTION: ${{ secrets.GRESIQ_API_SECRET_PRODUCTION }}
21
+ HF_TOKEN: ${{ secrets.HF_TOKEN }}
22
+
23
steps:
24
- name: Checkout onde
25
uses: actions/checkout@v6
build.rs
+1
-1
@@ -7,7 +7,7 @@ fn main() {
7
let _ = dotenvy::from_filename(
8
std::path::Path::new(&std::env::var("CARGO_MANIFEST_DIR").unwrap()).join(".env"),
9
);
10
- for var in ["GRESIQ_API_KEY", "GRESIQ_API_SECRET", "HF_TOKEN"] {
10
+ for var in ["GRESIQ_API_KEY_DEV", "GRESIQ_API_SECRET_DEV", "GRESIQ_API_KEY_PRODUCTION", "GRESIQ_API_SECRET_PRODUCTION", "HF_TOKEN"] {
11
println!("cargo:rerun-if-env-changed={var}");
12
if let Ok(val) = std::env::var(var) {
13
if !val.is_empty() {
src/pulse/client.rs
+10
-8
@@ -2,12 +2,12 @@ use smbcloud_gresiq_sdk::{Environment, GresiqClient, GresiqCredentials};
2
3
use super::events::{InferenceEvent, ModelLoadedEvent};
4
5
-/// GresIQ API key embedded at SDK build time.
6
-/// Consumer apps never set this — it's Onde Inference's own credential.
7
-const EMBEDDED_API_KEY: Option<&str> = option_env!("GRESIQ_API_KEY");
8
-
9
-/// GresIQ API secret embedded at SDK build time.
10
-const EMBEDDED_API_SECRET: Option<&str> = option_env!("GRESIQ_API_SECRET");
5
+/// GresIQ credentials embedded at SDK build time — one pair per environment.
6
+/// Consumer apps never set these — they're Onde Inference's own credentials.
7
+const EMBEDDED_API_KEY_DEV: Option<&str> = option_env!("GRESIQ_API_KEY_DEV");
8
+const EMBEDDED_API_SECRET_DEV: Option<&str> = option_env!("GRESIQ_API_SECRET_DEV");
9
+const EMBEDDED_API_KEY_PRODUCTION: Option<&str> = option_env!("GRESIQ_API_KEY_PRODUCTION");
10
+const EMBEDDED_API_SECRET_SECRET_PRODUCTION: Option<&str> = option_env!("GRESIQ_API_SECRET_PRODUCTION");
11
12
/// Onde telemetry client. Wraps GresiqClient so pulse events land in the
13
/// right GresIQ-managed tables without consumer apps knowing anything about
@@ -34,8 +34,10 @@ impl PulseClient {
34
/// `edge_id` is a stable device identifier (installation UUID).
35
/// Pass an empty string to default to `"onde-unknown"`.
36
pub fn new(environment: Environment, edge_id: String) -> Option<Self> {
37
- let api_key = EMBEDDED_API_KEY?;
38
- let api_secret = EMBEDDED_API_SECRET?;
37
+ let (api_key, api_secret) = match environment {
38
+ Environment::Dev => (EMBEDDED_API_KEY_DEV?, EMBEDDED_API_SECRET_DEV?),
39
+ Environment::Production => (EMBEDDED_API_KEY_PRODUCTION?, EMBEDDED_API_SECRET_SECRET_PRODUCTION?),
40
+ };
41
42
let edge_id = if edge_id.is_empty() {
43
"onde-unknown".to_string()