Skip to content

feat(ci): tenant-locked app builds (IBL_TENANT) with per-tenant releases - #406

Open
sonegillis1 wants to merge 2 commits into
mainfrom
feat/tenant-locked-builds
Open

feat(ci): tenant-locked app builds (IBL_TENANT) with per-tenant releases#406
sonegillis1 wants to merge 2 commits into
mainfrom
feat/tenant-locked-builds

Conversation

@sonegillis1

Copy link
Copy Markdown
Contributor

Wires the existing (shipped) IBL_TENANT tenant-lock feature into the release pipeline so tenant-locked desktop apps can be produced from CI.

What it does

On Actions → Release macOS DMG / Release Windows → Run workflow, a new ibl_tenant input:

  • Flows to IBL_TENANT (compile-time option_env!get_locked_tenant), so the built app is hard-locked to that tenant — forces the tenant on open, hides the tenant switcher (see hooks/use-tenant-lock.ts, components/tenant-lock.tsx).
  • Names the build with a tenant suffix (ibl.ai_<version>_<tenant>_universal.dmg, …_<tenant>_<arch>-setup.exe) so it never collides with the standard build.
  • Publishes it to a shared per-tenant release app-v<version>-<tenant> (DMG + x64/arm64 installers on one release) with a stable public download URL.
  • Surfaces that URL as a download badge in the run's job summary.

Normal (multi-tenant) builds are unchanged — every tenant path is gated on ibl_tenant != ''.

Files

  • reusable-release-macos-dmg.yml / release-macos-dmg.yml — input, IBL_TENANT env, tenant-publish step + dispatch passthrough.
  • reusable-release-windows.yml / release-windows.yml — same, per-arch (x64 + arm64) publishing to the shared release.

Testing

CI-only (can't run locally). Trigger a tenant dispatch from this branch (workflow_dispatch runs the workflow from the selected branch) to validate before merge.

🤖 Generated with Claude Code

Add an `ibl_tenant` workflow_dispatch input to the macOS and Windows
release workflows. When set, it flows to IBL_TENANT (compile-time,
option_env! -> get_locked_tenant) so the built app is hard-locked to that
tenant (forces the tenant, hides the switcher). The build is then given a
tenant-suffixed name and published to a shared per-tenant release
(app-v<version>-<tenant>) — DMG + x64/arm64 installers on one release —
with a stable download URL surfaced as a badge in the run summary. Normal
(multi-tenant) builds are unchanged; all tenant logic is gated on
ibl_tenant != ''.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@sonegillis1
sonegillis1 requested a review from mamigot as a code owner August 4, 2026 11:06
macOS will not hide the ".app" extension for "ibl.ai.app": ".ai" is a
registered file extension, so Finder shows the full name regardless of the
extension-hidden FinderInfo bit (verified — even Finder's own
`set extension hidden` leaves the displayed name "ibl.ai.app", whereas e.g.
zoom.us.app hides fine because ".us" is not registered). The re-master step
set the bit (confirmed =1 on shipped DMGs) with zero visible effect, while
adding a full re-sign + re-notarize + re-staple round — the exact step that
failed the 0.95.7 release. Remove it; the DMG now ships as tauri-action
builds it (already signed, notarized, stapled).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@sonegillis1 sonegillis1 added the run-tests Trigger PR validation pipeline label Aug 4, 2026
@bnsoni bnsoni added run-tests Trigger PR validation pipeline and removed run-tests Trigger PR validation pipeline labels Aug 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

run-tests Trigger PR validation pipeline

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants