Repository navigation
ci(release): ship Linux openhuman-core tarballs and push GHCR image - #1442
Conversation
Production release-production.yml previously left two surfaces unshipped: - build-docker logged into GHCR but had no docker build / push step, so ghcr.io/tinyhumansai/openhuman-core was never published per release. - build-desktop ran with build_sidecar: false, so headless Linux operators had no openhuman-core CLI artifact on the GitHub Release. This commit: - Completes build-docker with docker/build-push-action, pushes :latest, :v<version>, :<version> tags to GHCR (linux/amd64), and verifies the pushed image is pullable. - Adds build-cli-linux matrix (x86_64 + aarch64 ubuntu runners) that reuses scripts/release/package-cli-tarball.sh to attach openhuman-core-<version>-<target>.tar.gz + .sha256 to the GitHub Release. - Wires both jobs into publish-release (asset validation now requires the two Linux tarballs) and cleanup-failed-release (deletes the pushed GHCR image versions if a downstream phase fails). - Updates the stale staging comment about future GHCR work and points cloud-deploy.md at the actually-published image plus the new headless-tarball install path. Closes tinyhumansai#1439
📝 WalkthroughWalkthroughProduction release pipeline now explicitly orchestrates Docker image publishing to GHCR with multi-tag support ( ChangesProduction Release with Docker Publishing and Linux CLI Distribution
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Comment |
Mirror the production `build-docker` job in `release-staging.yml` but with `push: false`. `deploy-smoke.yml` already exercises the Dockerfile on PRs that touch core sources; this adds the equivalent gate at the staging-tag boundary so a green staging cut means the next prod promotion's GHCR push will succeed too. No `:staging-*` GHCR tag pollution. Refs tinyhumansai#1439
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (1)
gitbooks/features/cloud-deploy.md (1)
161-176: ⚡ Quick winDocument checksum verification before extracting the tarball.
This new install path pipes a release artifact straight into
tar, even though the release workflow now publishes checksum companions for these Linux artifacts. Please show asha256sum -cstep before installation.Safer example
BASE="openhuman-core-${VERSION}-${TARGET}.tar.gz" CHECKSUM="${BASE}.sha256" # adjust if the uploaded checksum file uses a different name curl -fsSLO "https://github.com/tinyhumansai/openhuman/releases/download/v${VERSION}/${BASE}" curl -fsSLO "https://github.com/tinyhumansai/openhuman/releases/download/v${VERSION}/${CHECKSUM}" sha256sum -c "${CHECKSUM}" sudo tar -xz -C /usr/local/bin -f "${BASE}" openhuman-core --version🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@gitbooks/features/cloud-deploy.md` around lines 161 - 176, Replace the direct curl | tar pipeline with a two-step download-and-verify flow: download the release tarball and its checksum companion (use the same VERSION and TARGET variables from the snippet), run sha256sum -c against the downloaded checksum file to verify integrity, and only if verification succeeds run tar -xz -C /usr/local/bin -f "<tarball>"; keep the ARCH/TARGET detection and the final openhuman-core --version invocation unchanged so the flow remains ARCH/TARGET -> download .tar.gz and .sha256 -> sha256sum -c -> tar -xzf -> openhuman-core --version.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.github/workflows/release-production.yml:
- Around line 568-572: The current release asset validation only allows the
Linux CLI tarballs (the regexes
/^openhuman-core-.*-x86_64-unknown-linux-gnu\.tar\.gz$/ and
/^openhuman-core-.*-aarch64-unknown-linux-gnu\.tar\.gz$/) but does not require
their checksum companions; update the validation to also require the checksum
asset patterns (for example add regexes matching the checksum files such as
/^openhuman-core-.*-x86_64-unknown-linux-gnu\.tar\.gz\.sha256$/ and
/^openhuman-core-.*-aarch64-unknown-linux-gnu\.tar\.gz\.sha256$/) and include
them in the same allowed/required assets list or gate that block so the release
cannot pass without those checksum artifacts.
- Around line 389-420: The workflow currently emits and pushes the mutable
:latest tag during the build, which can point to an unreleased image; change the
image-tags step (id: image-tags) to omit emitting "${base}:latest" so tags only
include "${base}:${TAG}" and "${base}:${VERSION}", and keep the
docker/build-push-action@v6 step using those immutable tags; then add a new
post-release step (run after the publish-release job succeeds) that
retags/pushes "${base}:latest" to GHCR so :latest is only applied after a
successful publish. Also update the publish-release job's asset validation
patterns to require the Linux tarballs and their checksum files by adding the
corresponding "*.tar.gz" and "*.sha256" patterns to the required assets list.
---
Nitpick comments:
In `@gitbooks/features/cloud-deploy.md`:
- Around line 161-176: Replace the direct curl | tar pipeline with a two-step
download-and-verify flow: download the release tarball and its checksum
companion (use the same VERSION and TARGET variables from the snippet), run
sha256sum -c against the downloaded checksum file to verify integrity, and only
if verification succeeds run tar -xz -C /usr/local/bin -f "<tarball>"; keep the
ARCH/TARGET detection and the final openhuman-core --version invocation
unchanged so the flow remains ARCH/TARGET -> download .tar.gz and .sha256 ->
sha256sum -c -> tar -xzf -> openhuman-core --version.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: e530cef2-6e4e-402e-9fc4-c9149e148340
📒 Files selected for processing (3)
.github/workflows/release-production.yml.github/workflows/release-staging.ymlgitbooks/features/cloud-deploy.md
… assets CodeRabbit review on PR tinyhumansai#1442: - Move `:latest` push out of `build-docker` and into a new `tag-docker-latest` job that runs after `publish-release` succeeds. `build-docker` now only pushes immutable `:v<version>` / `:<version>` tags. If a downstream phase (build-cli-linux, publish-updater-manifest, asset-validation) fails, `cleanup-failed-release` deletes the tagged image versions and `:latest` is never moved — previously, `:latest` could point at a build whose release got rolled back. - Add the `.tar.gz.sha256` checksum companions to the `publish-release` asset validation. `package-cli-tarball.sh` already uploads them; gating on them prevents a partial release without the integrity files. Refs tinyhumansai#1439
|
@coderabbitai review |
✅ Actions performedReview triggered.
|
Summary
build-dockernow actually builds and pushesghcr.io/tinyhumansai/openhuman-core(:latest,:v<version>,:<version>) instead of just logging into GHCR and exiting.build-cli-linuxmatrix builds standaloneopenhuman-coreforx86_64-unknown-linux-gnuandaarch64-unknown-linux-gnuand attachesopenhuman-core-<version>-<target>.tar.gz(+.sha256) to the GitHub Release.publish-releaseasset validation now requires both Linux tarballs alongside the Tauri installers;cleanup-failed-releasedeletes the pushed GHCR image versions if a downstream phase fails.build-dockerjob inrelease-staging.ymlso a Dockerfile regression fails staging before promotion.cloud-deploy.mdat the actually-published image plus a no-Docker tarball install path.Problem
release-production.ymlinvokedbuild-desktop.ymlwithbuild_sidecar: false, so the optional Linuxopenhuman-coreartifact path never ran on the production cut, andbuild-dockerstopped afterdocker login— nodocker build/docker pushstep. Self-hosters followinggitbooks/features/cloud-deploy.md, anyone automating headless Linux servers, and release hygiene (one tag = all shipping surfaces) all paid the cost.Solution
build-dockerwithdocker/build-push-action(linux/amd64), three tags per release, OCI labels (source,revision,version,title), GHA-scoped buildx cache, and a post-pushdocker pull/docker image inspectsmoke step. Stayed single-arch — QEMU emulation triples Rust build time; arm64 users pull the standalone tarball or build from source. Documented as a follow-up.build-cli-linuxmatrix usingubuntu-22.04(x86_64) andubuntu-24.04-arm(aarch64). Reuses the existingscripts/release/package-cli-tarball.sh(the same scriptrelease-packages.ymlalready drives), with the same Sentry DSN guard,OPENHUMAN_BUILD_SHA(12-char) baking, andOPENHUMAN_APP_ENV=production.publish-release.needs+if. Asset validation appendsopenhuman-core-.*-x86_64-unknown-linux-gnu.tar.gzand...-aarch64-...tar.gz.cleanup-failed-releasewalks the freshly pushed:v<version>and:<version>GHCR tags and deletes their package versions (:latestis left alone — clobbering the moving tag would orphan downstream pulls of the previous release).build-dockerjob torelease-staging.ymlthat mirrors the production build but withpush: false, load: true.deploy-smoke.ymlalready covers Dockerfile regressions on PRs that touch core sources; this is the equivalent gate at the staging-tag boundary so a green staging cut means the next prod promotion's GHCR push will succeed.release-staging.yml(no longer claims GHCR is future work). Cloud-deploy doc now leads withdocker pull ghcr.io/tinyhumansai/openhuman-core:latestand adds a no-Docker tarball install snippet.Submission Checklist
Verify pushed image is pullablestep pluspublish-releaseasset validation enforce both new outputs at run time, and the stagingbuild-dockerjob exercises the Dockerfile build path on every staging cut.app/srcorsrc/modified. Issue Production release workflow should ship Linux openhuman-core binaries and a real GHCR Docker image #1439 acceptance criteria explicitly exempts pure YAML from the diff-coverage gate.docker/build-push-actionanddocker/login-actionare already used indeploy-smoke.yml;actions/checkout,Swatinem/rust-cache, anddtolnay/rust-toolchainmirror whatrelease-packages.ymlalready pins.docs/RELEASE-MANUAL-SMOKE.mdonce the next prod cut produces real GHCR + tarball artifacts to verify against.Closes #1439in the## Relatedsection.Impact
build-cli-linuxadds ~one cargo release build per arch in parallel.build-dockeradds the cached image build. No effect onbuild-desktopruntime.packages: writepermission andsecrets.GITHUB_TOKEN; OCI labels expose the build SHA + version for provenance. Sentry DSN validation matches the pattern already used byrelease-packages.yml.:latestwill start moving on the next prod cut. Compose users who pinned to a built-locally image are unaffected; those who switch toimage: ghcr.io/tinyhumansai/openhuman-core:latest(now documented) get the published bits.Related
docker-compose.ymlto default to the published image with a documented "build locally" override.AI Authored PR Metadata (required for Codex/Linear PRs)
Linear Issue
Commit & Branch
issue/1439-production-release-workflow-should-shipValidation Run
pnpm --filter openhuman-app format:checknot affected.pnpm typecheck— no TypeScript modified.Validation Blocked
command:N/Aerror:N/Aimpact:N/ABehavior Changes
openhuman-coretarballs in addition to Tauri desktop installers; staging cuts now also exercise the Dockerfile build path (without pushing).docker pull ghcr.io/tinyhumansai/openhuman-core:vX.Y.Zworks; release pages listopenhuman-core-<version>-{x86_64,aarch64}-unknown-linux-gnu.tar.gz.Parity Contract
build_sidecarstaysfalse); existing macOS / Windows / Linux.deboutputs andlatest.jsonvalidation are untouched.release-packages.ymlis left disabled — itsbuild-cli-linux-arm64job is the model the new matrix mirrors but does not duplicate.publish-releasestill requires every existing installer pattern; the two new patterns are additive.cleanup-failed-releaseretains its existing tag/release deletion and only refines the GHCR cleanup that was previously dead code.Duplicate / Superseded PR Handling