Repository navigation
ci: auto-deploy Replicated releases to internal instances - #1123
Merged
Merged
Conversation
dylan-openhands
requested review from
aivong-openhands,
jlav and
mamoodi
as code owners
August 20, 2026 19:11
aivong-openhands
approved these changes
Aug 20, 2026
aivong-openhands
left a comment
Contributor
There was a problem hiding this comment.
It's a bummer that replicated didn't have an API for embedded cluster V2 :( hopefully V3 will have an API driven way to do this without us having to handroll a solution
Contributor
Author
|
Yep v3 supports headless upgrades from the CLI..so if we get to that point this gets much cleaner @aivong-openhands 🤞 |
dylan-openhands
force-pushed
the
dj/replicated-auto-deploy
branch
from
August 20, 2026 22:13
847885e to
d330aef
Compare
This was referenced Aug 20, 2026
Contributor
|
🚀 Released in openhands/0.50.0. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Embedded Cluster has no supported auto-update path on V2 so we have to handroll it with KOTS (the underlying k8s admin layer)
This wires the deploy into the release workflows and reports it. When a release publishes, the instance tracking that channel gets it, and a failure turns the release run red.
The deploy drives the same upgrade-service API the admin console's own wizard uses. It is undocumented (😢 ), so every call below was verified by hand against
replicated-unstable(0.45.0→0.48.0, then0.49.0) before any of it was written down.Why a
needs:job and notworkflow_runThe deploy has to be pinned to the release the caller just built, and
workflow_runonly ever executes the default-branch copy of a workflow — so the logic couldn't be iterated on a branch. Coupling it also means a deploy failure marks the release run red, which is the signal the PR check reads.Pinning, and why it needs a Makefile target
Three different numbers identify a release, and the one we actually use to update is totally hidden
versionLabel0.49.0Unstablerepublishes it on every push to main1451replicated release createprintschannelSequence/ KOTSupdateCursor404So the release job resolves its own release sequence to a
channelSequenceand hands that to the deploy.The channel comes from
make print-channelrather than a hardcodedUnstable, becauseMakefilederivesCHANNELfrom the branch.Helm Chart Checklist
Additional Notes
Files
scripts/replicated_deploy.sh— 100 lines, no retries or recovery by design. TakesKOTS_CURSOR, deploys exactly that release, or fails loudly with::error::..github/workflows/deploy-replicated.yml— reusable (workflow_call+workflow_dispatch),concurrency: replicated-deploy-<instance>,cancel-in-progress: false.release-replicated.yml/release-replicated-beta.yml— resolve the cursor, then call the deploy workflow as aneeds:job.deploy-gate.yml— non-blocking PR check, both lanes.Makefile— addsprint-channel. Purely additive;release, the guard, and local branch releases are untouched.README.md— native GitHub Actions badges for both lanes.The PR check is visibility only. It is deliberately not in the
mainruleset'srequired_status_checks, so a red X never blocks a merge. Promoting it later means adding the check contextlast-deployunder Settings → Rules → Rulesets — the context is the job name with no workflow prefix, which the four existingpublish-charts (…)entries confirm.It asserts coverage rather than age, because a stale badge reads as green: GitHub renders the last real conclusion forever, so a workflow that silently stopped firing stays passing. Each lane finds what should have triggered a deploy and checks a run exists for it.
release-replicated.yml's ownon.push.paths, read at runtime withyqso there's no second copy of that path list to drift. (yq, not PyYAML: YAML 1.1 parses a bareon:key as the booleanTrue.)openhands/*GitHub Release. Tag refs can't be used:git/matching-refssorts alphabetically, soopenhands/0.9.0outranksopenhands/0.49.0and the check would pin to a months-old tag and pass forever.