ci: every push to main is also a numbered release

v<VERSION>.<commits on main> (VERSION starts at 0.1), with release notes since the
previous numbered release, marked as GitHub's latest release; only when no build
failed, and a re-run leaves an existing one alone. The rolling "latest" pre-release
stays: installed Studios and headsets update from it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ToastconcernandClaude Opus 5.5 committed 2026-10-24 16:50:31 -05:00
1 parent 81c6f5e2ad
commit d8e5d9e71e
4 files changed
+31 -3

No files matched your search

+23
View File
@@ -225,6 +225,19 @@ jobs:
GH_TOKEN: ${{ github.token }}
REPO: ${{ github.repository }}
steps:
# Every push to main is also a numbered release: VERSION (major.minor) and the number of commits on main.
- name: Check out history (for the version number)
if: github.ref == 'refs/heads/main'
uses: actions/checkout@v4
with:
path: src
fetch-depth: 0
- name: Version
if: github.ref == 'refs/heads/main'
run: |
version="v$(tr -d ' \r\n' < src/VERSION).$(git -C src rev-list --count HEAD)"
echo "VERSION_TAG=$version" >> "$GITHUB_ENV"
echo "$version"
- name: Download Studio build artifacts
uses: actions/download-artifact@v4
with:
@@ -304,6 +317,16 @@ jobs:
- name: Version release (tag v*)
if: ${{ startsWith(github.ref, 'refs/tags/v') && !contains(needs.*.result, 'failure') }}
run: gh release create "${{ github.ref_name }}" dist/* --repo "$REPO" --title "Frame Studio ${{ github.ref_name }}" --generate-notes
# The numbered release (push to main): GitHub's "Latest release", with the changes since the previous numbered
# one. Only when no build failed; a re-run of the same commit finds it there and leaves it.
- name: Numbered release (push to main)
if: ${{ github.ref == 'refs/heads/main' && !contains(needs.*.result, 'failure') }}
run: |
if gh release view "$VERSION_TAG" --repo "$REPO" > /dev/null 2>&1; then echo "$VERSION_TAG is already released"; exit 0; fi
previous=$(gh release list --repo "$REPO" --exclude-pre-releases --limit 1 --json tagName --jq '.[0].tagName // empty')
gh release create "$VERSION_TAG" dist/* --repo "$REPO" --target "${{ github.sha }}" --latest \
--title "Frame Studio $VERSION_TAG" --generate-notes ${previous:+--notes-start-tag "$previous"}
# The rolling "latest" pre-release: where installed Studios and headsets look for updates (latest.json).
- name: Latest build (push to main)
if: github.ref == 'refs/heads/main'
run: |
+1
View File
@@ -0,0 +1 @@
0.1
+5 -2
View File
@@ -119,7 +119,7 @@ rolling `latest` release and one shared `v*` tag namespace; each release contain
| When | What happens |
|---|---|
| Every push and pull request | Studio builds for Linux (x64, arm64), Windows (x64, arm64) and macOS (Apple Silicon); Frame Home is built on ARM64 and bundled into Studio packages. Successful outputs are kept as run artifacts. 32-bit and Intel Mac builds are local only (`scripts/build-studio.sh`). |
| A push to `main` | The **Latest build** pre-release is replaced with Studio builds and the standalone Frame Home installer. |
| A push to `main` | A numbered release, `v<VERSION>.<commits on main>` (for example `v0.1.51`), is published with the Studio builds and the Frame Home installer, with release notes for the changes since the previous one; it becomes GitHub's **Latest release**. It is only made when no build failed. The **Latest build** pre-release is replaced too: installed copies of Studio and Frame Home update from it. |
| A tag starting with `v` (for example `v1.0`) | One version release is published with both Studio packages and the Frame Home installer. |
| By hand | **Actions > build > Run workflow** |
@@ -127,7 +127,10 @@ A newer push to the same branch cancels a run that is still going.
Linux, macOS, and Frame Home jobs cache compiler outputs between runs; Windows/MSVC builds are not cached.
Linux jobs also cache downloaded apt packages, and macOS caches Homebrew downloads; apt repository metadata is still refreshed each run.
To publish versions:
The first two parts of the number come from the `VERSION` file at the top of the repository (`0.1`). To start a new
major or minor version, change it (for example to `1.0`); the last part keeps counting commits.
To publish a release by hand with a name of your own:
```sh
git tag v1.0
+2 -1
View File
@@ -43,7 +43,8 @@ see [install-frame-home.md](install-frame-home.md).
2. Pick a release:
- **Latest build** is rebuilt from the newest code every time the main branch changes. It is marked as a
pre-release.
- A **version release** (for example `v1.0`) is a fixed version.
- A **numbered release** (for example `v0.1.51`) is a fixed version. One is published for every change to the main
branch; the newest is marked **Latest** on the Releases page.
3. Download the file for your computer:
| Computer | File |