Pin the NUCLEO Renode download and cache every toolchain fetch - #55
Merged
fdesbiens merged 1 commit intoAug 31, 2026
Merged
Conversation
Two problems in the pipeline, one of them mine. The NUCLEO Renode job fetched renode-latest.linux-portable.tar.gz with no version pin and no checksum, while the PolarFire job three jobs above it already pinned Renode 1.16.1 and verified its SHA256. That pin landed in eclipse-threadx#49, so it was present in this file when eclipse-threadx#51 added the NUCLEO job; the new job was modelled on an older copy of the PolarFire step rather than the current one. The result was a suite whose emulator could change under it on any Renode release, with nothing verifying what was downloaded. The NUCLEO job now uses the same pinned, checksum-verified step as PolarFire. The checksum was recomputed from the published artefact rather than copied on trust. Separately, every run re-downloaded roughly a gigabyte: the xPack RISC-V toolchain at ~414 MB and Renode at ~52 MB in each of two jobs. All three are now restored by actions/cache, keyed on the pinned version so a future bump invalidates the cache instead of silently serving the old one. This completes what eclipse-threadx#53 started for the Arm toolchain. Caching only makes sense because these are now pinned. Caching an unpinned "latest" artefact would have frozen CI on whichever build happened to be fetched first, turning a reproducibility gap into an invisible one. All four jobs now follow the same shape: cache, install only on a cache miss, then put the tool on PATH as a separate step so it runs on hit and miss alike. The PolarFire job also gains a version-reporting step, matching the Arm job, so the log records which compiler produced the ELF. Verified both constructed download URLs resolve, and that the Renode 1.16.1 checksum matches the published artefact. Assisted-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
fdesbiens
pushed a commit
that referenced
this pull request
Sep 16, 2026
samplex demonstrates Eclipse ThreadX and NetX Duo on Cortex-M4 and RISC-V, but had no reference enablement for NXP's Cortex-M7 crossover parts, and no way to exercise the network stack in CI without hardware. This adds `targets/NXP/MIMXRT1064-EVK/`, built from `templates/target/` and implementing the `bsp/include/bsp/` contract, with three demos: `threadx_basic` (scheduling, timers, LED), `netx_echo` (ICMP, UDP and TCP echo on port 7) and `netx_trng_console` (on-chip TRNG behind a single-session TCP shell on port 23, serving one connection at a time). The ENET and KSZ8081 PHY drivers are vendored rather than tracked from `getting-started`, which is on the same archive track as `iot-devkit`. Every SDK and CMSIS download is pinned to a tag or commit and SHA256-verified. A Renode platform model and a headless Python runner join the existing CI, reusing the pinned toolchain and Renode steps from #53 and #55. Renode 1.16.1, all three demos green: `threadx_basic` asserts the worker thread runs at tick 100; `netx_echo` asserts link up, ARP, ICMP reply and 23-byte UDP and TCP echoes across two emulated nodes; `netx_trng_console` asserts four distinct non-zero entropy words, remote LED toggle, uptime telemetry, and that an over-long command line is refused without dropping the session. Not run on hardware. The README records what the emulator stubs: CCM and ANALOG are tag stubs whose registers read back fixed values, the 600 MHz banner is a compile-time constant, and Renode's TRNG model implements neither the programming sequence nor the ENT15 block-consume semantics, so the driver's bring-up is unverified on silicon. Signed-off-by: Ali Eissa <ali.eissa.dev@gmail.com> Assisted-by: Google DeepMind Antigravity (Gemini 3.8 Flash) <noreply@antigravity.google>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Pin the NUCLEO Renode download and cache every toolchain fetch
Two problems, one of them mine.
1. The NUCLEO Renode download was unpinned and unverified
test-nucleo-renodefetchedrenode-latest.linux-portable.tar.gz— no version pin, no checksum — whiletest-polarfire-renode, three jobs above it in the same file, already pinned Renode 1.16.1 and verified its SHA256.That pin landed in #49, so it was already present when #51 added the NUCLEO job. The new job was modelled on an older copy of the PolarFire step rather than on the current file. The consequence: a regression suite whose emulator could change underneath it on any Renode release, with nothing verifying what was downloaded.
The NUCLEO job now uses the same pinned, checksum-verified step as PolarFire. The checksum was recomputed from the published artefact rather than copied on trust — it matches.
2. Roughly a gigabyte re-downloaded per run
All three are now restored by
actions/cache, keyed on the pinned version so a future bump invalidates the cache rather than silently serving the old one. This completes for the remaining downloads what #53 did for the Arm toolchain.These two changes are not independent. Caching only makes sense because the artefacts are now pinned — caching an unpinned
latestwould have frozen CI on whichever build happened to be fetched first, converting a reproducibility gap into an invisible one.Shape
All four jobs now follow the same structure:
Splitting the PATH export out of the install step is what makes a cache hit usable — folded together, a hit would skip the
GITHUB_PATHwrite and the tool would vanish from the job.The PolarFire job also gains a version-reporting step, matching the Arm job from #53, so the log records which compiler produced the ELF.
Verification
200), with the version substituted exactly as the workflow builds it.1a532d4b…9617c, matching what the PolarFire job asserts.Cache behaviour itself is only observable on the runner: the first run populates, the second should show hits and skipped installs.