Build and attach the module cdylib to each release - #16
Conversation
Add two new workflow jobs that build and publish the compiled cdylib for tinychannels-module across eleven platform-distro combinations, then create a GitHub release with the archives and a checksum manifest. The publish-rust job now exposes the computed version and tag as outputs so the downstream jobs can reference the exact release commit. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
Co-authored-by: Medulla <medulla@tinyhumans.ai>
|
Important Approval pendingCodeRabbit has no unresolved comments, but it has not reviewed the latest commit. Use the checkbox below to review the latest commit. CodeRabbit will approve the changes if it finds no blocking issues.
Comment |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
tinysweeper found nothing blocking. Approving.
$0.0068 · 76,823 in / 1,917 out · 8,826 cached (11%) · openrouter/openai/text-embedding-3-small, deepseek/deepseek-v4-flash, z-ai/glm-5.2 · 407 embedded
critique: $0.0025 · 29,910 in / 1,011 out · 0 cached (0%) · deepseek/deepseek-v4-flash
security: $0.0025 · 25,198 in / 732 out · 8,826 cached (35%) · z-ai/glm-5.2, deepseek/deepseek-v4-flash
tests: $0.0012 · 14,421 in / 106 out · 0 cached (0%) · deepseek/deepseek-v4-flash
description: $0.0006 · 7,294 in / 68 out · 0 cached (0%) · deepseek/deepseek-v4-flash
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 890b98ee1d
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Add a GitHub Actions workflow to automate the release process, ensuring consistent and repeatable releases directly from the repository. Auto-committed-on: dragonfly Co-authored-by: Medulla <medulla@tinyhumans.ai>
PR babysitter statusHead: c3912ef Fixes pushed this pass:
Feedback handled:
CI: Rust SDK ✅ ✅, CodeRabbit ✅ (rate-limited, non-blocking pass). Threads: 4 resolved, 0 actionable remaining. Blocking reviews: 0. Proceeding to merge per explicit authorization, given all real CI is green, all feedback is addressed, and the failing check is an external bot-infra issue whose own output says to merge by hand once reviewed. |
Summary
Builds
tinychannels-modulefor every supported platform and attaches theartifacts to each release. Follow-up to #15, where this was raised as a P1 and
deliberately deferred so it would not ride along with the workspace split that
had to touch the same workflow.
Without it the module crate is undeliverable:
publish = falsemeans it neverreaches crates.io, and what a host actually loads is the compiled
cdylib.OpenHuman's
modules::registrypins each artifact by a SHA-256 digest takenverbatim from a published release, so until a release carries these archives
the module cannot be pinned and therefore cannot be loaded at all.
Two new jobs, modelled on the equivalent pair in
tinyhumansai/tinydocs:native-bundles— 11-way matrix, builds--release --package tinychannels-module, packages the library withLICENSE,README.mdand amodules.tomlcarrying the library's own digest, uploads one archive perplatform.
github-release— collects them, generateschecksum.tomlwith theTinyBus CLI, creates the release, then downloads and loads the published
artifact the way a host would as a final check.
Problem
release.ymlpublished the two Rust crates and stopped.tinychannels-modulewas explicitly excluded from packaging (correctly — it is
publish = false),but nothing took its place, so no release has ever carried a loadable module.
Solution
The matrix is per-distro, not per-target, and that is the point. A
.sobuilt against glibc 2.39 fails to
dlopenon a 2.35 host with a symbol-versionerror the ABI gate cannot phrase helpfully. OpenHuman's
modules::platformprobes glibc and prefers the newest build that could work — which only helps if
the older build exists. Hence
ubuntu-22.04andubuntu-24.04, each in botharchitectures, plus two macOS generations and three Windows runners.
Decisions worth reviewing:
fail-fast: false, plus a hard asset-count check. One unavailable runnershould not cost the other ten artifacts, but a partial set must never be
published — a release missing
ubuntu-22.04-arm64is one that silently cannotbe installed on that platform. So the matrix tolerates a failure and
github-releaserefuses anything other than exactly 11 archives.main.ref: needs.publish-rust.outputs.tag,so the artifact matches the released source rather than whatever
mainmovedon to while the matrix was running. This required adding an
outputs:block topublish-rust, which previously exposed nothing.rests on each
iddescribing the machine that built it; a runner image thatchanged architecture would otherwise produce a correctly-named artifact that
cannot load.
checksum.tomlis generated by the TinyBus CLI, not by hand. It is themanifest the loader compares its pinned digest against, so the writer and the
reader stay the same implementation. There are two digests by design: the
in-archive
modules.tomlcovers the library, the release-levelchecksum.tomlcovers the archives, and the host checks both.ubuntu-24.04-x86_64archive throughtinybus'sgithub_module_hostexampleusing the digest from the manifest — so a release that cannot actually be
installed fails here rather than in the field on whichever platform nobody
tested.
Verification
A release workflow cannot be exercised without cutting a tag, so I verified the
parts that are testable locally rather than claiming more than I checked:
cargo build --locked --release --package tinychannels-modulesucceeds, andemits
target/release/libtinychannels_module.so— the exact path and libraryname the packaging step derives.
tinychannels-module-<version>-<id>.tar.gzcontaining the library,LICENSE,README.mdand a well-formedmodules.toml.tinybus modules checksumsubcommand and thegithub_module_hostexampleboth exist in the vendored
vendor/tinybus(c35105f) at the paths theworkflow invokes.
Not verified, and cannot be until a real release runs: the runner labels
themselves (
ubuntu-22.04-arm,macos-26-intel,windows-11-arm), the WindowsPowerShell packaging block, and the cross-job artifact hand-off. These are taken
from
tinydocs' workflow, which exercises them on every release.Impact
needs: publish-rustandrun after it, so a failure in either cannot affect what reaches crates.io.
tinychannelsin OpenHuman'smodules::registry.Related
.github/workflows/release.yml:141).tinyhumansai/openhuman, then moving thechannels runtime onto the bus.