Skip to content

ci(release): sign updater artifacts and publish latest.json - #42

Merged
DevVig merged 1 commit into
mainfrom
feat/release-updater-artifacts
Jul 18, 2026
Merged

ci(release): sign updater artifacts and publish latest.json#42
DevVig merged 1 commit into
mainfrom
feat/release-updater-artifacts

Conversation

@DevVig

@DevVig DevVig commented Jul 18, 2026

Copy link
Copy Markdown
Owner

What

Completes the in-app self-updater (follow-up to #41) by producing the artifacts it consumes at release time.

Release plumbing

  • bundle.createUpdaterArtifacts: truetauri build emits the signed Microbridge.app.tar.gz + .sig updater bundle alongside the .app/DMG.
  • Signing secrets (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 --config override, so releases never hard-fail.
  • Per-arch packing: the updater tarball is renamed Microbridge-<target>.app.tar.gz so the two matrix legs don't collide as release assets.
  • latest.json generated in the publish job (via jq, from the .sig contents) with darwin-aarch64 + darwin-x86_64 entries, and uploaded as a release asset. The app's endpoint releases/latest/download/latest.json always resolves to the newest release.

Docs

  • README principle chore(deps): bump softprops/action-gh-release from 2 to 3 #2 reworded: the daemon stays zero-network; the app's only network call is the opt-in, user-triggered update check. No background pings.
  • INSTALL.md documents the in-app update path for direct installs and the brew-managed behavior.

Channel safety (recap from #41)

Brew installs carry a .microbridge-brew marker; the app routes those to brew upgrade and 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 (targeting v0.2.0). Merge order matters only in that both this and #41 must be on main before tagging — no release is cut before then.

Verification

  • release.yml validated as YAML; tauri.conf.json valid JSON with createUpdaterArtifacts: true.
  • cargo build on the tauri crate passes with the config change.

🤖 Generated with Claude Code

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>
Copilot AI review requested due to automatic review settings July 18, 2026 15:01
@coderabbitai

coderabbitai Bot commented Jul 18, 2026

Copy link
Copy Markdown

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your recent review volume is higher than typical usage, so adaptive limits are currently applied.

Next review available in: 20 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

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 configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: e03649cb-a094-46d1-a260-00ac92c7d26e

📥 Commits

Reviewing files that changed from the base of the PR and between a02da6e and f81f06b.

📒 Files selected for processing (4)
  • .github/workflows/release.yml
  • INSTALL.md
  • README.md
  • apps/microbridge-ui/src-tauri/tauri.conf.json

Comment @coderabbitai help to get the list of available commands.

@DevVig
DevVig merged commit c179bd3 into main Jul 18, 2026
7 checks passed
@DevVig
DevVig deleted the feat/release-updater-artifacts branch July 18, 2026 15:02

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.json during 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.

Comment on lines +237 to +238
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}"
DevVig added a commit that referenced this pull request Jul 18, 2026
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants