Automate releases so Omarchy can package Elsewhen - #2
Merged
Merged
Conversation
This was referenced Sep 16, 2026
Collaborator
Author
|
Proved end to end on an omabot worker (a real Omarchy from the 4.0.1 ISO), together with omacom/omarchy-pkgs#483 and omacom/omarchy#12157.
Not covered: the Actions run itself, which needs the workflow on |
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.


Elsewhen is moving from a git checkout under
~/.config/omarchy/pluginsto a pacman package,elsewhen, built by omarchy-pkgs from this repository's GitHub releases and installed by Omarchy by default. That gives the plugin its own lifecycle: releases are cut here, the package tracks them, andomarchy updatecarries them to users. This PR is the elsewhen side: automated release publishing, and the version set to 0.1.0 for the first release.Companion PRs: omarchy-pkgs omacom/omarchy-pkgs#483 (the package, draft until v0.1.0 exists) and omarchy omacom/omarchy#12157 (default package, bar placement, and migration; stacked on omacom/omarchy#12051, which adds the packaged plugin root).
Release automation
.github/workflows/release.ymlhas two entry points. Run workflow with aversioninput runscutonmain: it refuses any other branch, an existing tag, and a version that is not above every existingv*tag and at least the manifest's own (scripts/check-version-bump.sh); writes the version withscripts/set-version.sh; runsscripts/check-manifest.shandtests/run --offline; commitsRelease vX.Y.Zasgithub-actions[bot]only if that changed anything (main already carries 0.1.0, so the first run tags the existing head); creates an annotated tag; and pushes commit and tag atomically.publishruns in the same run (a push made with the workflow token cannot start another) or on a directv*tag push: it requires the tag to be onmainand equal tovplus the manifest version, re-runs the checks, refuses an existing release, and runsgh release create --verify-tag --generate-notes(--prereleasefor-versions).manifest.jsonis the only version pin.set-version.shrewrites that one line surgically and refuses a manifest with more than one version-shaped line.check-manifest.shis the CI validation step moved into a script socutandpublishrun exactly what CI runs, plus a SemVer shape check on the version. The version guard orders prereleases below their release (SemVer order, whichsort -Valone gets backwards). Actions are pinned by SHA, the same pins as atreyu#35.manifest.jsongoes from 1.0.0 to 0.1.0, matching where the plugin stands; the first tag will be v0.1.0.Verification
scripts/check-manifest.sh,tests/test-set-version.sh,tests/test-check-version-bump.sh, andtests/run --offline(node checks, currency check, qmltestrunner 6 of 6) pass.cutin scratch clones: at 0.1.0 no commit and the tag on HEAD; at 0.2.0 aRelease v0.2.0bot commit, then the tag.set-version.shfails its test. The version-guard test covers releases, prereleases, a manifest ahead of the tags, numeric ordering, and non-versionv*tags.cut, andpublish.Proved on a VM
This PR
check-version-bumpreports the first release,set-versionreportsalready at 0.1.0, no commit is made, and the annotated tag lands on the existing head. For 0.1.1 it makes aRelease v0.1.1commit asgithub-actions[bot]that touches onlymanifest.json, then tags. Asking for 0.1.0 again is refused:version 0.1.0 is not above the latest tag v0.1.1.qmltestrunner):scripts/check-manifest.sh,tests/test-set-version.sh,tests/test-check-version-bump.sh, andtests/run --offlinewith 14 checks and the QML suite at 6 of 6, all passing./usr/share, the panel opens with live clocks and weather, the helper's only write goes to~/.cache/omacom-elsewhen/data.json, andpacman -Qkk elsewhenreports 0 altered files after use.omarchy plugin addis retired by the Omarchy migration.main.Combined
The three PR heads were run together as the final state on an omabot worker, a linked clone of the Omarchy 4.0.1 ISO template whose shell predates the packaged plugin root: this PR at 84288b1, the package from omacom/omarchy-pkgs#483 at 56eced5, and the Omarchy change from omacom/omarchy#12157 at d681b16a on top of omacom/omarchy#12051 at baf85c34. Each step below is the part one PR owns, fed by the one before it.
cutsteps run against that branch produce thev0.1.0tag on the existing head, andgit archive --prefix=elsewhen-0.1.0/gives the archive in the layout of GitHub's tag archive.makepkgon the worker turns that archive intoelsewhen 0.1.0-1with the PR's PKGBUILD, onlysourceandsha256sumspointed at the local archive. A local pacman repository serves it in place of the Omarchy mirror.~/.config/omarchy/plugins, enabled on the old shell. The Omarchy tree is then replaced in place under that running shell, which is what the omarchy package upgrade does to/usr/share/omarchy. The realomarchy-migrateinstalls the package, retires the clone, and leaves the user's placement alone;omarchy-restart-shellbrings up a shell that listsomacom.elsewhen enabled packagedfrom/usr/share/omarchy/plugins/omacom.elsewhen, and the panel opens with live clocks and weather.v0.1.1makes aRelease v0.1.1bot commit and tag; the rebuilt package shows up as0.1.0-1 -> 0.1.1-1inpacman -Qu; after the upgrade and a shell restart the packaged manifest reads 0.1.1 with the widget still enabled andshell.jsonuntouched.pacman -Rns elsewhenthen leaves nothing under the packaged root.No defect surfaced in any of the three. The one visible effect is the transient the migration documents: between the migration and the shell restart the stale shell shows an empty slot where the widget was, and the rest of the desktop is unaffected.
Two things stood in for the real thing. Nothing was downloaded from GitHub, because the elsewhen repository is private and has no release yet. The other 37 migrations pending between the template's tree and the Omarchy head, Atreyu's among them since no
atreyupackage exists, were marked done so the runner executed only this one.The bar's right section across the stages (stock, the clone on the old shell, the stale shell after the migration, after the restart, inserted by the migration, fresh defaults, after the 0.1.1 upgrade, after removal), and the panel served from the packaged tree:
Not covered by the combined run: a full
omarchy update, which would pull three weeks of unrelated upgrades onto the template; an ISO install withelsewhenin the base package list; the GitHub Actions run itself; and makepkg or the upstream sync fetching from GitHub.Before the first release
0.1.0, fill the archive digest in the omarchy-pkgs PR and mark it ready, merge it, then merge the Omarchy PR after omarchy#12051. The Omarchy migration hard-fails if the package is not in the repo yet.