A release process for teams
Updated · 6 min read · For release managers, developers
This page shows release managers and developers how to run releases as a team on Omnihorn. You build a release flow from channels: every build goes to a private test channel, then beta, then production. Approvals are a habit you agree on, and rollback is a channel reassignment you can do in a minute.
How a release moves through Omnihorn
A build reaches users only when a channel points at it. Uploading a build changes nothing for installed copies. Assigning it to a channel does. That one rule is the base of every release process on Omnihorn: you control who gets a build by choosing which channel it is on.
- Build: one uploaded version of your app, stored as
1.4.0+build.42. Builds never change after upload. To fix something you upload a new build. - Channel: a named stream such as
productionorbetathat installed copies check. Each channel serves exactly one build to everyone on it. - Private channel: a channel that needs a channel token or a password. Use private channels for testing.
There is no percentage rollout inside a channel. To ship to a small group first, put that group on its own channel. The channels guide covers channels in detail.
Roles in a workspace
Omnihorn has four member roles. Owner and admin can do the same things. Developer and viewer can do the day-to-day release work but not the account-level actions.
| What a member can do | Owner | Admin | Developer | Viewer |
|---|---|---|---|---|
| Upload builds, manage channels, build installers, see analytics | Yes | Yes | Yes | Yes |
| Create, list and revoke CI API keys | Yes | Yes | No | No |
| Rename or delete an app | Yes | Yes | No | No |
| Plan and billing | Yes | Yes | No | No |
| Rename the workspace and manage members | Yes | Yes | No | No |
| Delete the account that owns the workspace | Yes | No | No | No |
The viewer role is not read-only today. A viewer can assign builds to channels like a developer. If you need a strict separation between who builds and who ships, keep it as a process rule for now.
A release flow built from channels
Most teams do well with three stages: a private test channel, a beta channel and production. Each stage is a channel. Promoting a build means assigning the same build to the next channel. The files are never uploaded again.
Upload the build
Upload from CI or drag the build folder into the dashboard (see Upload builds). Wait until its status is active. A build that fails verification never reaches any channel.
Ship it to a private test channel
From CI, a push to a branch that no channel follows creates a private channel named after the branch. You can also create a private channel such as
qaby hand and assign the build to it. Testers install the installer built for that channel.Test it
QA runs the checks in Test a release before users get it: a clean install, an update from the previous version, and a rollback.
Promote it to beta
Open the
betachannel and assign the same build. Everyone on beta gets it on their next update check. Watch the Failed installs figure on the app’s Analytics tab.Promote it to production
When the agreed sign-off is in, assign the build to
production. Write the release notes on the build first: the installer shows them before an update.
If you upload from CI, a channel can follow a branch. For example, beta can follow main, so every merge goes to beta by itself. Keep production manual, so a person always makes the last step. The CI/CD guide explains following branches.
Approvals are a habit, not a feature
Omnihorn has no approval workflow. Nothing stops a member with access from assigning a build to production. Agree on the rule outside the tool and write it down. A simple version that works:
- Only the release manager assigns builds to
production. - A build goes to production only after it has been on beta for an agreed time with no new failures.
- QA records the build number they signed off, such as
1.4.0+build.42, in the release ticket. The release manager assigns exactly that build. - Production never follows a branch.
Plan your rollback before you need it
To roll back, open the channel and assign the previous good build. Installed copies treat any version that differs from theirs as an update, so the older build installs on their next check. No new upload and no new installer is needed.
- Pin the last good build. Pinned builds, builds live on a channel and the newest builds of an app are protected from automatic cleanup. Pin the previous production build before each release so it is there when you need it.
- Stop CI from moving the channel. A channel that follows a branch takes the next matching push, which would replace your rollback. During an incident, stop following the branch or pause the pipeline.
- Know your delay. Installed copies pick up a change at their next update check. How often they check is set per channel. Opening the app’s installer window checks at once.
The blog post How to roll back a bad desktop release walks through an incident step by step.
Release checklist
| Step | Who | Done when |
|---|---|---|
| Build uploaded and active | Developer or CI | The build page shows status active and the expected file count |
| Release notes written | Developer | The build page shows the notes |
| Assigned to the private test channel | Developer | The channel page shows the build |
| Test installer built for that channel | Developer | The Installer tab shows the channel’s installer as ready |
| Clean install, update and rollback tested | QA | The build number is recorded as signed off |
| Promoted to beta | Release manager | Beta shows the build; no new failures on the Analytics tab |
| Previous production build pinned | Release manager | The build list shows it pinned |
| Promoted to production | Release manager | Production shows the signed-off build number |
| Rollback owner on call | Release manager | Someone can reassign the previous build until the release has settled |
Who does what
| Role in your team | Owns | Uses in Omnihorn |
|---|---|---|
| Developer | Builds, release notes, the CI workflow | Builds tab, CI/CD tab (an owner or admin creates the API key) |
| QA | Test channels, sign-off | Channel tokens, the test installer, the silent update check |
| Release manager | Promotion, rollback, timing | Channel pages, build pinning, Analytics tab |
| Workspace owner | Plan, billing, API keys, app deletion | Settings, the app’s Settings tab |
›Can I require an approval before a build goes to production?
Not inside Omnihorn. There is no approval step. Agree that only one person assigns production builds and record the signed-off build number in your release ticket.
›Can I roll out a build to a percentage of users?
No. A channel serves one build to everyone on it. Use separate channels, such as beta and production, as rings.
›Can I invite my team today?
Not yet. Invites are coming soon. Today a workspace has one member. CI uploads use API keys, which do not need a member account.
›Does promoting a build upload it again?
No. Promoting assigns the same stored build to another channel. The signed file list is the same on every channel.
Keep reading
Something wrong or missing? Tell us.