|
| 1 | +# Jumpstarter v0.9.0 — Release Notes |
| 2 | + |
| 3 | +## What's New |
| 4 | + |
| 5 | +* **Operator-only deployment**: Helm charts have been fully removed and operator-based installation is now the sole supported path for Jumpstarter services (#448, #683). |
| 6 | +* **DUT network isolation driver**: The new `jumpstarter-driver-dut-network` package enables full network isolation of devices under test, including DHCP/DNS via dnsmasq, IP aliasing, NTP responder, egress/ingress traffic filtering, and tcpdump streaming (#642, #667, #674, #686). |
| 7 | +* **Lease tags**: Leases now support user-defined metadata tags, making it easier to organize and filter leases in multi-team environments (#622). |
| 8 | +* **Lease expiration display**: The CLI now shows "expires at" and "remaining" columns in lease listings so you can see at a glance when leases will be released (#343). |
| 9 | +* **Token rotation**: Internal token rotation for long-running clients ensures sessions remain authenticated across token lifetimes without manual intervention (#695). |
| 10 | +* **gRPC health checking**: The controller now exposes the standard gRPC Health protocol, making it straightforward to configure readiness and liveness probes (#747). |
| 11 | +* **Exporter context env vars**: `jmp shell` now exposes `JMP_EXPORTER`, `JMP_LEASE`, and `JMP_EXPORTER_LABELS` environment variables for scripting convenience (#291). |
| 12 | +* **Secret/ConfigMap references for JWT CA certificates**: The operator can now reference Kubernetes Secrets and ConfigMaps for JWT CA certificates, removing the need to inline certificate data (#772). |
| 13 | +* **Exporter rapid failure detection**: Containerized exporters now detect crash loops and auto-exit, allowing the container runtime to handle restarts cleanly (#691). |
| 14 | +* **Access policy descriptions**: Access policy rules now support a `description` field for documentation purposes (#803). |
| 15 | +* **Default exporter config path**: Exporter configs now default to `~/.config/jumpstarter`, reducing boilerplate (#712). |
| 16 | +* **Configurable installer paths**: `INSTALL_DIR` and `VENV_DIR` can now be set via environment variables, giving more flexibility over where Jumpstarter is installed (#771). |
| 17 | +* **Consolidated `--insecure` flag**: Multiple TLS flags have been replaced with a single `--insecure` option for simpler configuration (#333). |
| 18 | +* **OCI credential model**: A new `OciCredentials` model and hardened credential resolution make flashing from private registries more reliable (#709). |
| 19 | +* **MicroShift bootc image**: A new container image for MicroShift-based deployments is now available (#314). |
| 20 | +* **JEP process**: Jumpstarter Enhancement Proposals (JEPs) have been formalized with docs, process, and initial proposals (#423, JEP-0011, JEP-0013, JEP-0014). |
| 21 | +* **Renovate migration**: Dependabot has been replaced with Renovate for better cross-ecosystem dependency grouping (#745). |
| 22 | +* **Testing and CI**: E2E tests have been converted from Bats to Go + Ginkgo with parallel builds, log collection on failure, and reusable composite actions. Quality gates for coverage and type checking, per-package test logs, path-based filtering, and merge-queue-only full matrix runs have also been added (#427, #439, #568, #730, #815, #830). |
| 23 | + |
| 24 | +## Driver Updates |
| 25 | + |
| 26 | +The table below summarizes driver-level changes in v0.9.0. |
| 27 | +`Status = New driver` indicates the package was added during the 0.9 release cycle. |
| 28 | + |
| 29 | +| Driver | Status | Notable updates | |
| 30 | +| :--- | :--- | :--- | |
| 31 | +| `android` | **New** | ADB and emulator power drivers (#403) | |
| 32 | +| `dut-network` | **New** | Full DUT network isolation: DHCP, DNS, NTP, tcpdump, traffic filtering (#642, #667, #674, #686) | |
| 33 | +| `mitmproxy` | **New** | HTTP(S) interception and backend mocking driver (#254) | |
| 34 | +| `noyito-relay` | **New** | NOYITO USB Relay power driver (#268) | |
| 35 | +| `obd` | **New** | OBD-II vehicle diagnostics driver (#789) | |
| 36 | +| `renode` | **New** | Renode embedded target emulator driver (#533, #557, #558) | |
| 37 | +| `someip` | **New** | SOME/IP driver wrapping opensomeip Python binding; static remote endpoint support (#391, #621, #629) | |
| 38 | +| `ssh-mount` | **New** | Remote filesystem mounting via SSH (#434) | |
| 39 | +| `st-link` | **New** | ST-LINK mass storage flasher for STM32 boards | |
| 40 | +| `ble` | Updated | Added tests (#536) | |
| 41 | +| `dutlink` | Updated | Fixed swapped voltage/current in power readings | |
| 42 | +| `esp32` | Updated | Release serial port before flash to prevent port-locked errors (#659) | |
| 43 | +| `flashers` | Updated | Default CA injection into flash commands (#742); improved RideSX error messages (#543); updated fls to 0.3.0 (#838, #839) | |
| 44 | +| `gpio` | Updated | Added read method required by PowerInterface | |
| 45 | +| `http-power` | Updated | Parse power measurements and add power read CLI command (#790) | |
| 46 | +| `iscsi` | Updated | Block device allowlist confinement (#432) | |
| 47 | +| `network` | Updated | HttpServer.close() properly releases port on cleanup (#740) | |
| 48 | +| `opendal` | Updated | Removed opendal dependency from QEMU driver (#535); fixed local path upload | |
| 49 | +| `pyserial` | Updated | PTY drain improvements to prevent output loss on macOS (#561, #734, #826) | |
| 50 | +| `qemu` | Updated | Added OCI flashing support (#555); construct image URL after HTTP server starts (#797) | |
| 51 | +| `sdwire` | Updated | Support unprogrammed FT200X EEPROM + macOS storage/mux fixes (#748) | |
| 52 | +| `shell` | Updated | Keep shell usable after token refreshes; block dangerous environment variables | |
| 53 | +| `someip` | Updated | Use opensomeip PyPI release; defer OsipClient creation; fail fast when unavailable (#595, #629) | |
| 54 | + |
| 55 | +## Operator / Controller Changes |
| 56 | + |
| 57 | +* Restricted operator ClusterRole RBAC permissions on roles/rolebindings |
| 58 | +* Restart controller pods when configmap changes |
| 59 | +* Set default resource requests/limits for controller and router pods (#714) |
| 60 | +* Add Secret/ConfigMap references for JWT CA certificates (#772) |
| 61 | +* Fix Containerfile build with rootless Podman (#822) |
| 62 | +* Prevent lease assignment to non-ready exporters (#426) |
| 63 | +* Serialize Dial/Listen queue handoff to prevent router token loss (#573) |
| 64 | +* Retry Dial and StatusMonitor poll on transient UNAVAILABLE (#606) |
| 65 | +* Server-side Dial retry with exponential backoff for transient Available status |
| 66 | +* gRPC keepalive configuration fields wired into server options (#399) |
| 67 | +* Authorization always derives resource names from OIDC username (#404) |
| 68 | +* Fix exporter state machine: stuck exporters on lease-end during hooks (#349) |
| 69 | +* Guard beforeLease hook from setting LEASE_READY after lease expiry (#655) |
| 70 | +* Release lease when beforeLease hook fails with onFailure=endLease (#823) |
| 71 | +* Deduplicate NotIn values in ParseLabelSelector (#741) |
| 72 | +* Fix flaky test for competing scheduled leases |
| 73 | +* Add description field to access policy rules (#803) |
| 74 | +* Update Go dependencies for CVE fixes (#447) |
| 75 | + |
| 76 | +## Installation |
| 77 | + |
| 78 | +**Install via the Jumpstarter Operator:** |
| 79 | + |
| 80 | +```bash |
| 81 | +kubectl apply -f https://github.com/jumpstarter-dev/jumpstarter/releases/download/v0.9.0/operator-installer.yaml |
| 82 | +``` |
| 83 | + |
| 84 | +### Documentation |
| 85 | + |
| 86 | +* [Install with Operator](https://jumpstarter.dev/main/getting-started/installation/service/service-operator.html) |
| 87 | +* [Production deployment](https://jumpstarter.dev/main/getting-started/installation/service/service-production.html) |
| 88 | + |
| 89 | +## Contributors |
| 90 | + |
| 91 | +We would like to thank all our contributors, with a special shout-out to new contributors in this release: |
| 92 | + |
| 93 | +| Commits | Name | GitHub | |
| 94 | +| :--- | :--- | :--- | |
| 95 | +| 53 | Paul Wallrabe | @raballew | |
| 96 | +| 7 | Vinicius Zein | @vtz | |
| 97 | +| 4 | Marek Mahut | @mmahut | |
| 98 | +| 1 | Alexandre Bailon | @anobli | |
| 99 | +| 1 | Pierre-Yves Chibon | @pypingou | |
| 100 | + |
| 101 | +## Full Changelog (v0.8.1..release-0.9) |
| 102 | + |
| 103 | +- docs: align production service guide with operator TLS and gRPC behavior (#388) (b21e5912) |
| 104 | +- Microshift bootc image (#314) (505e3dd2) |
| 105 | +- fix: reject deletion of already-released leases (#401) (0fe8ed70) |
| 106 | +- fix: validate name argument in admin create/delete commands (#398) (a08cb9fa) |
| 107 | +- fix: clean up listenQueues entry on listener disconnect (#397) (4a10a94b) |
| 108 | +- fix: reset retry counter after receiving data in exporter reconnect (#396) (933f5337) |
| 109 | +- Android ADB and Emulator Power Drivers (#403) (fba1b25d) |
| 110 | +- fix: wire keepalive configuration fields into gRPC server options (#399) (647aff95) |
| 111 | +- fix(authorization): always derive resource names from OIDC username (#404) (c043a331) |
| 112 | +- Fix exporter state machine: stuck exporters on lease-end during hooks (#349) (d6cad897) |
| 113 | +- shell: keep shell usable after token refreshes (6d062ec7) |
| 114 | +- NOYITO USB Relay Power Driver (#268) (b39a904b) |
| 115 | +- e2e: dump debug logs on test failure (#420) (e3fb3826) |
| 116 | +- ci(e2e): run operator e2e on main push, drop helm matrix (0d055197) |
| 117 | +- Add mitmproxy driver for HTTP(S) interception and backend mocking (#254) (f8c71162) |
| 118 | +- feat: show expires at and remaining columns in lease listing (#32) (c2bbf3f6) |
| 119 | +- fix(e2e): set COLUMNS=200 to prevent Rich table header wrapping (6e75343d) |
| 120 | +- fix: address review feedback for lease expiration display (99dd5021) |
| 121 | +- Revert "fix: address review feedback for lease expiration display" (558584e1) |
| 122 | +- fix: use timedelta .days and .seconds fields for remaining time formatting (402785b7) |
| 123 | +- docs: add note about ingress-nginx SSL passthrough requirement (b9907977) |
| 124 | +- fix: prevent lease assignment to non-ready exporters (#426) (c562cf2d) |
| 125 | +- test(e2e): use -o name and wc -l for pagination count checks (#419) (9fdd1ad3) |
| 126 | +- Restrict operator ClusterRole RBAC permissions on roles/rolebindings (042ef521) |
| 127 | +- feat: consolidate TLS flags into single --insecure option (#333) (b37e463c) |
| 128 | +- fix(shell): block dangerous environment variables in shell driver (331f665e) |
| 129 | +- fix(operator): restart controller pods when configmap changes (e1b64f9d) |
| 130 | +- fix(hooks): emit WARNING log inside context_log_source for client visibility (76755c62) |
| 131 | +- docs: add kubeconfig mount to container run examples (#437) (75b75373) |
| 132 | +- fix(deps): update Go dependencies to resolve known CVEs (#447) (3d5ffa7e) |
| 133 | +- Convert bats E2E tests to Go + Ginkgo (#439) (e044198a) |
| 134 | +- Fix swapped voltage/current in dutlink power readings (88966719) |
| 135 | +- Add server-side Dial retry for transient Available status (2264a0d2) |
| 136 | +- Use exponential backoff for Dial retry instead of fixed interval (f400b218) |
| 137 | +- Add tests for BLE driver (#536) (88b9c4fa) |
| 138 | +- Fix nginx ingress for e2e tests in kind clusters (b4bd9806) |
| 139 | +- ci: parallelize e2e container image and wheel builds (d7a65e02) |
| 140 | +- Increase Dial retry timeout from 10s to 30s to fix E2E flake (f473ede1) |
| 141 | +- improve error message in ridesx flashing (#543) (46de464c) |
| 142 | +- feat: add SOME/IP driver wrapping opensomeip Python binding (#391) (31d9cf3a) |
| 143 | +- Add Renode emulator driver for embedded target simulation (#533) (e8e97319) |
| 144 | +- docs/ci: Renode driver listing and conditional macOS Renode install (#557) (7d06f2e7) |
| 145 | +- fix(renode): address review follow-ups from PR #533 (#558) (4ba92e88) |
| 146 | +- ci: add quality gates for coverage and type checking (#427) (fcbbfbfa) |
| 147 | +- fix: resolve ty type diagnostics and add CI quality gates (#568) (a64be234) |
| 148 | +- Fix exporter deadlock when lease ends before before_lease_hook is set (#569) (aaf98be5) |
| 149 | +- Update install.sh default source from release-0.7 to release-0.8 (1c0a3d92) |
| 150 | +- fix: drain remaining PTY data after reader stop on macOS (#561) (74794de3) |
| 151 | +- fix(someip): defer OsipClient creation to first use (#595) (f92ac89f) |
| 152 | +- fix: skip afterLease flow when lease has already expired (#603) (bdb69e9d) |
| 153 | +- Fix: log UNIMPLEMENTED gRPC errors from ReportStatus as warning (#620) (4a61fe5b) |
| 154 | +- feat(someip): support static remote endpoint (no Service Discovery) (#621) (d3a4a968) |
| 155 | +- jumpstarter-driver-gpio: Add read method required by PowerInterface (f0ba0c1d) |
| 156 | +- fix(someip): use opensomeip PyPI release instead of git URL (d6ffbf38) |
| 157 | +- fix: lease transfer error (82559668) |
| 158 | +- Add Jumpstarter Enhancement Proposal (JEP) process and docs (#423) (49576004) |
| 159 | +- fix: replace httpbin.org with local server in mitmproxy passthrough test (7a174e78) |
| 160 | +- feat: add ST-LINK mass storage flasher driver for STM32 boards (96aa730b) |
| 161 | +- fix: address PR review feedback (b19d6327) |
| 162 | +- qemu: add OCI flashing to qemu driver (#555) (9a812c15) |
| 163 | +- feat: add tags field to lease, to allow user set metadata (#622) (947d4b99) |
| 164 | +- feat: add DUT network isolation driver (#642) (82e91875) |
| 165 | +- oci: support existing OCI credentials (abd5d919) |
| 166 | +- fix: address PR #642 review follow-ups for dut-network driver (#653) (e6a75404) |
| 167 | +- fix: guard beforeLease hook from setting LEASE_READY after lease expiry (#655) (7159a21a) |
| 168 | +- JEP-0013: Metrics, Tracing, and Log Observability (fab3f062) |
| 169 | +- JEP-0011 proposal (509db8d0) |
| 170 | +- fix(iscsi): block device allowlist confinement (#432) (6a510dab) |
| 171 | +- fix(container): add procps-ng for sysctl in dut-network driver (7864f393) |
| 172 | +- fix(dut-network): make add_ip_alias idempotent to prevent loop/crash (75ef6843) |
| 173 | +- feat(dut-network): rename static_leases to addresses, allow MAC-less entries (38a6f72a) |
| 174 | +- docs(dut-network): update README for addresses field and add-address/remove-address commands (e8362558) |
| 175 | +- fix(e2e): update DUT network e2e tests for addresses/add-address rename (00bf16fc) |
| 176 | +- feat(dut-network): add local NTP responder support (#667) (8e3ccb74) |
| 177 | +- fix: release serial port before ESP32 flash to prevent port-locked errors (#659) (a258f02b) |
| 178 | +- feat(dut-network): allow DNS hostnames in public_ip field (#672) (26094726) |
| 179 | +- dut-network: add tcpdump streaming support (#674) (abfaebab) |
| 180 | +- dut-network: enable dhcp-sequential-ip in dnsmasq by default (288da40c) |
| 181 | +- fix: preserve percent-encoding in presigned URLs to prevent signature invalidation (#662) (72e0ed8a) |
| 182 | +- fix: remove Helm charts and standardize on operator-based deployment (#448) (1d056d3d) |
| 183 | +- chore: remove obsolete migration script and leftover poetry.lock (#683) (ea9a9f49) |
| 184 | +- chore: enable ruff ERA rule to catch commented-out code (#684) (0c3d504d) |
| 185 | +- fix: detect original_url before operator guard to fix encoding with explicit operators (a0dbedbc) |
| 186 | +- fix: clean up dut-network state directory on driver close/reset (954095f3) |
| 187 | +- feat(dut-network): add egress and ingress traffic filtering (#686) (04891f62) |
| 188 | +- fix: detect exporter rapid failure loop and exit for container restart (e7371292) |
| 189 | +- fix: replace nonlocal with mutable container to satisfy ty type-checker (63425f95) |
| 190 | +- refactor: move rapid failure config from env vars to exporter config (c22dfe8a) |
| 191 | +- feat: add internal token rotation for clients (eedff884) |
| 192 | +- e2e: add token rotation tests (28e4a599) |
| 193 | +- docs: consolidate and improve documentation across the repository (#693) (7a765052) |
| 194 | +- fix: fix ridesx local path upload (12a99ae7) |
| 195 | +- fix: small fixes batch (#516, #525, #652, #517) (#681) (4e27c7ea) |
| 196 | +- feat(docs): self-host asciinema player to remove branding (#705) (ae354e5e) |
| 197 | +- docs: add gRPC protocol reference and consistent field descriptions (#703) (6b284332) |
| 198 | +- docs: align README and docs landing page with org profile (#706) (16527330) |
| 199 | +- docs: fix README link titles and CRDs ToC in multiversion build (#702) (a01296b8) |
| 200 | +- fix: preserve URL query parameters in storage flash for signed URLs (#435) (5c87e0c1) |
| 201 | +- fix: remove unreliable energenie.com link to prevent flaky CI (#707) (92e98f4f) |
| 202 | +- ci: skip e2e and python tests for docs-only changes (#708) (7c67bd0c) |
| 203 | +- Add jumpstarter-driver-ssh-mount package for remote filesystem mounting (#434) (33ad352f) |
| 204 | +- oci: add OciCredentials model and harden credential resolution (#709) (fbf73a69) |
| 205 | +- fix: serialize Dial/Listen queue handoff to prevent router token loss (#573) (e914a829) |
| 206 | +- fix: set default resource requests/limits for controller and router pods (#714) (616a4014) |
| 207 | +- fix(someip): fail fast when opensomeip native extension is unavailable (#629) (d706fa73) |
| 208 | +- Update opensomeip dependency to 0.1.5 (#716) (9c3e7e05) |
| 209 | +- fix: retry Dial and StatusMonitor poll on transient UNAVAILABLE (#606) (ad6f91b7) |
| 210 | +- feat: default exporter configs to ~/.config/jumpstarter (#712) (c07c4707) |
| 211 | +- ci: make linkcheck job non-blocking for PRs (#729) (54e3385c) |
| 212 | +- ci: extract e2e artifact loading into a reusable composite action (fa2f5763) |
| 213 | +- Remove opendal dependency from QEMU driver (#535) (e654084d) |
| 214 | +- fix: guard DurationParamType against OverflowError on large values (#722) (c1413322) |
| 215 | +- fix: use select() in PTY drain loop to prevent output loss on macOS (#733) (#734) (99c3cfed) |
| 216 | +- ci: collect controller and router logs from e2e runs (#730) (e798cd04) |
| 217 | +- fix: include exporter/client name and namespace in auth error messages (#726) (9b574664) |
| 218 | +- fix: raise TypeError in V1Alpha1Lease.from_dict for non-dict spec (#723) (3ed3c3f0) |
| 219 | +- fix: deduplicate NotIn values in ParseLabelSelector (#741) (00bf61a9) |
| 220 | +- Replace Dependabot with Renovate for cross-ecosystem dependency grouping (#745) (04b5b7b4) |
| 221 | +- fix: pin uv container image and fix docs substitutions (#749) (536ef4ac) |
| 222 | +- fix: HttpServer.close() properly releases port on cleanup (#740) (8f79b678) |
| 223 | +- feat: expose gRPC health checking protocol on the controller (#747) (4e22dfff) |
| 224 | +- feat: make INSTALL_DIR and VENV_DIR configurable via environment variables (#771) (e60a3d7b) |
| 225 | +- fix: consolidate Renovate Go groups and restrict Fedora to stable (#773) (eec0278c) |
| 226 | +- fix: restrict Fedora to stable and create go-toolchain group (#777) (1cebbd0e) |
| 227 | +- fix: remove stale e2e section from README (#752) (c88b979f) |
| 228 | +- fix: use {doc} role for symlinked doc references for Sphinx 8.2 (#778) (a1477390) |
| 229 | +- fix: skip uninstalled child drivers in composite CLI (#785) (24473f34) |
| 230 | +- feat: add jumpstarter-driver-obd for OBD-II vehicle diagnostics (#789) (ffd9cc1d) |
| 231 | +- fix: drop container image digest pinning, unify uv version, bump Fedora to 44 (#781) (590da7b4) |
| 232 | +- fix: construct image URL after HTTP server starts (#797) (8597d199) |
| 233 | +- feat: add description field to access policy rules (#803) (2d748d07) |
| 234 | +- Add exporter context env vars to jmp shell and env_with_metadata() helper (d074b997) |
| 235 | +- ci: move linkcheck to weekly scheduled workflow (#813) (e7bc41c9) |
| 236 | +- flashers: add default CA to be inject into flashing command (#742) (a235026f) |
| 237 | +- feat: driver/sdwire: support unprogrammed FT200X EEPROM + macOS storage/mux fixes (#748) (c6b0748f) |
| 238 | +- CI: per-package test logs, parallel runs, and uboot OOM fix (#815) (861e6819) |
| 239 | +- feat: add Secret/ConfigMap references for JWT CA certificates (#772) (16511650) |
| 240 | +- fix(container): pin UV binary to build platform in cross-compilation stages (#819) (96a6c7b8) |
| 241 | +- docs(jep-0014): simplified virtual exporter design (#744) (a3bcb14c) |
| 242 | +- fix(ci): use merge commit ref in backport workflow for fork PRs (#820) (51971c26) |
| 243 | +- fix(controller): fix Containerfile build with rootless Podman (#822) (c7c0ec96) |
| 244 | +- fix(ble): fix race condition in test_ble_driver_connect_stream (#825) (85542630) |
| 245 | +- fix(hooks): release lease when beforeLease hook fails with onFailure=endLease (#823) (4a5d98ea) |
| 246 | +- fix: retry PTY drain on empty select() to prevent data loss on macOS (#826) (86c308e0) |
| 247 | +- ci: reduce PR test matrix, run full matrix in merge queue (#830) (b38ff9ac) |
| 248 | +- fix: use shared uv cache for package tests (#832) (8cc61e1e) |
| 249 | +- ci: stop re-running validation workflows on push to main (#834) (f9d6f934) |
| 250 | +- update fls to 0.3.0 (#838) (c29eece3) |
| 251 | +- use 0.3.0 default for CLI (#839) (a899a449) |
| 252 | +- feat: parse power measurements in http-power and add a power read CLI command (#790) (96710823) |
| 253 | +- test: mark PTY-dependent hooks tests as xfail on macOS (#821) (#836) (70a5e3e1) |
| 254 | +- fix: retry connection when exporter is temporarily unavailable (#829) (26aee227) |
| 255 | +- chore: bump operator version to 0.9.0-rc.1 (78777b5a) |
| 256 | +- fix: allow skipping interactive confirmation in contribute script (28bc684b) |
0 commit comments