ci(release): sign updater artifacts and publish latest.json - #42
Conversation
Completes the in-app self-updater by producing the artifacts it consumes: - Enable `bundle.createUpdaterArtifacts` so `tauri build` emits the signed `.app.tar.gz` + `.sig` updater bundle. - Export the updater signing secrets into the UI build; forks without the key still build (updater artifacts auto-disabled via `--config`). - Pack the updater tarball per-arch (avoids a name collision between the two matrix legs) and generate/upload `latest.json` pointing at both. - The updater endpoint (releases/latest/download/latest.json) resolves to whatever the newest release ships. Docs: clarify README principle #2 (daemon stays zero-network; the app's only network call is the opt-in, user-triggered update check) and document the in-app update path in INSTALL.md. The signing keypair and GitHub secrets are already in place. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
Warning Review limit reachedYou’ve reached a temporary PR review limit under our Fair Usage Limits Policy. Next review available in: 20 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (4)
Comment |
There was a problem hiding this comment.
Pull request overview
This PR completes the release-time plumbing needed for Microbridge’s Tauri in-app self-updater by ensuring updater artifacts are produced/signed in CI and by generating the latest.json manifest that the app consumes. It also updates end-user documentation to clarify the “zero-network daemon” principle and describe the direct-install update path.
Changes:
- Enable Tauri updater artifact creation (
bundle.createUpdaterArtifacts) and wire signing secrets into the macOS UI build workflow (with a no-secret fallback that disables updater artifacts). - Package and publish per-architecture updater tarballs and generate/upload
latest.jsonduring the release publish job. - Update README/INSTALL docs to reflect the user-triggered, opt-in update check and brew-vs-direct install behavior.
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
| README.md | Clarifies “zero-network” scope (daemon stays zero-network; UI update check is opt-in/user-triggered). |
| INSTALL.md | Documents in-app update behavior for direct installs and brew-managed upgrade path. |
| apps/microbridge-ui/src-tauri/tauri.conf.json | Enables creation of signed updater artifacts during Tauri bundling. |
| .github/workflows/release.yml | Adds signing env, per-arch updater artifact packaging, and latest.json generation/publishing. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| SIG_AARCH="$(find artifacts -type f -name 'Microbridge-aarch64-apple-darwin.app.tar.gz.sig' | head -1)" | ||
| SIG_X86="$(find artifacts -type f -name 'Microbridge-x86_64-apple-darwin.app.tar.gz.sig' | head -1)" |
| set -euo pipefail | ||
| TAG="${GITHUB_REF_NAME}" | ||
| VERSION="${TAG#v}" | ||
| BASE="https://github.com/DevVig/microbridge/releases/download/${TAG}" |
Bumps every version location `0.1.0 → 0.2.0` to cut **v0.2.0** — the
first release that carries the in-app updater and publishes
`latest.json`.
## Why the bump has to match the tag
`release.yml` derives the updater manifest version from the tag
(`VERSION="${TAG#v}"`), while the built app reports its version from
`tauri.conf.json`. If those disagree, a fresh v0.2.0 install would see
`latest.json`'s `0.2.0` as newer than its own `0.1.0` and try to update
to itself. So this bumps both sides together.
## Locations bumped (7 files)
- `apps/microbridge-ui/src-tauri/tauri.conf.json` — **the one the
updater compares**
- `apps/microbridge-ui/package.json` + `package-lock.json`
- `apps/microbridge-ui/src-tauri/Cargo.toml` + `Cargo.lock`
- root `Cargo.toml` (`[workspace.package]`) + `Cargo.lock` (daemon
crates)
Version-only change; no code touched. CI covers the build.
## After merge
Tag `v0.2.0` → `release.yml` rebuilds and republishes **everything from
one build**: new signed/notarized DMG, the app tarball Homebrew
installs, the updater artifacts, and `latest.json`. First real exercise
of the PR #42 signing/manifest pipeline. A `chore(brew): bump formula to
v0.2.0` PR auto-opens after publish so `brew upgrade` catches up to the
same release.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Release**
* Updated the application version from 0.1.0 to 0.2.0 across the product
and workspace metadata.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
What
Completes the in-app self-updater (follow-up to #41) by producing the artifacts it consumes at release time.
Release plumbing
bundle.createUpdaterArtifacts: true→tauri buildemits the signedMicrobridge.app.tar.gz+.sigupdater bundle alongside the.app/DMG.TAURI_SIGNING_PRIVATE_KEY+_PASSWORD) exported into the UI build. Already set on the repo. Forks without the key still build — updater artifacts auto-disable via a--configoverride, so releases never hard-fail.Microbridge-<target>.app.tar.gzso the two matrix legs don't collide as release assets.latest.jsongenerated in the publish job (viajq, from the.sigcontents) withdarwin-aarch64+darwin-x86_64entries, and uploaded as a release asset. The app's endpointreleases/latest/download/latest.jsonalways resolves to the newest release.Docs
Channel safety (recap from #41)
Brew installs carry a
.microbridge-brewmarker; the app routes those tobrew upgradeand never self-replaces, so the formula version and the on-disk bundle can't drift. Direct/DMG installs self-update.How it's exercised
This runs on the next
v*tag (targetingv0.2.0). Merge order matters only in that both this and #41 must be onmainbefore tagging — no release is cut before then.Verification
release.ymlvalidated as YAML;tauri.conf.jsonvalid JSON withcreateUpdaterArtifacts: true.cargo buildon the tauri crate passes with the config change.🤖 Generated with Claude Code