Files
Frametop--frametop/.github/workflows/release.yml
T
DeeJanuzandClaude Opus 5.5 01796eb299 Releases: ship the Hand Recorder
The image builds ft-handpanel (hands/rec/build.sh, against scripts/openvr.sh
like gaze), and a release's installer offers the recorder: ft-camd's
capabilities and the menu entry, nothing to build. The FrameDrop window has a
Hand Recorder box, and --no-hand-recorder leaves it out. An entry from the
release before is renewed without asking, since it points into that
release's folder.

The recorder runs ft-hands through scripts/in-box instead of the "dev"
container, so a release uses its own container, and its repair hints say to
reinstall the release rather than run a build script.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 14:32:07 -06:00

106 lines
4.6 KiB
YAML

# Build Frametop's release on Depot's arm64 runners (the Frame is aarch64): the image from
# pack/Containerfile, the test gate inside it, then Frametop.zip (framedrop/build.sh), the
# image with its installer: FrameDrop installs it from a PC, or you unpack it on the headset
# and run Frametop/frametop-install.sh, or get.sh --release downloads it (pack/README.md,
# Releases). It's about 1.1 GB, under GitHub's 2 GB a file.
#
# A v* tag makes a draft GitHub release with the zip, its FrameDrop manifest, its
# frametop-release.json, and SHA256SUMS (a prerelease when the tag has a "-", like
# v0.3.0-exp.1). Nothing is public until someone publishes the draft. A manual run keeps the
# zip as the run's artifact for a week.
#
# podman, as on the Frame: the zip holds podman save's archive, which the headset loads with
# podman. Not on pushes or pull requests: Depot's runners are paid, and a fork's pull request
# would run on them. Actions are pinned to commit SHAs (the version in the comment).
name: release
on:
push:
tags: ["v*"]
workflow_dispatch:
permissions:
contents: write # the draft release
concurrency:
group: release-${{ github.ref }}
jobs:
release:
runs-on: depot-ubuntu-24.04-arm-4
timeout-minutes: 90
env:
FT_ENGINE: podman
steps:
# actions/checkout@v7.0.1
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- name: version
run: |
if [ "$GITHUB_REF_TYPE" = tag ]; then v=${GITHUB_REF_NAME#v}; else v=0.0.0-ci.${GITHUB_SHA::7}; fi
echo "VERSION=$v" >> "$GITHUB_ENV"
echo "FT_IMAGE=localhost/frametop:$v" >> "$GITHUB_ENV"
- name: build the image
run: ./ft dev build
# The unit gate: Python (strict), C, and shell, inside the image, so what passes here is
# what the zip installs.
- name: test (python, c, bash)
run: ./ft dev test
- name: smoke (what a release installs from the image)
run: |
podman run --rm --entrypoint sh "$FT_IMAGE" -c '
set -e
for p in ft-screens ft-spotpanel ft-pointer ft-powerd ft-gaze ft-gazepanel ft-stream ft-eyegrab whisper-server; do
test -x /opt/frametop/bin/$p
done
test -f /src/frametop/pointer/driver/build/driver_ft_pointer.so
test -x /src/frametop/hands/build/ft-camd
test -x /src/frametop/hands/build/ft-hands
test -x /src/frametop/hands/rec/build/ft-handpanel
/src/frametop/hands/models.sh check
test -x /src/frametop/pack/build/distrobox/install
/src/frametop/gaze/tracker/build/venv/bin/python -c "import numpy, cv2"
/src/frametop/voice/build/venv/bin/python -c "import numpy, sentencepiece, sherpa_onnx"
python3 -c "import PySide6, huggingface_hub"
command -v zstd >/dev/null'
# The FrameDrop manifest names the zip's URL in this repo's release (a fork's, in a fork).
- name: Frametop.zip
run: |
url=()
[ "$GITHUB_REF_TYPE" = tag ] &&
url=("https://github.com/$GITHUB_REPOSITORY/releases/download/$GITHUB_REF_NAME/Frametop.zip")
framedrop/build.sh --image "$FT_IMAGE" --version "$VERSION" --commit "$GITHUB_SHA" "${url[@]}"
- name: keep the zip (manual runs)
if: github.ref_type != 'tag'
# actions/upload-artifact@v7.0.2
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9
with:
name: Frametop-${{ env.VERSION }}
path: framedrop/build/
retention-days: 7
- name: draft release (tags)
if: github.ref_type == 'tag'
env:
GH_TOKEN: ${{ github.token }}
run: |
pre=() notes=pack/release-notes.md
if [[ $VERSION == *-* ]]; then
pre=(--prerelease)
# get.sh --release asks for a channel and offers stable first: an experimental
# release's install line names its channel.
notes=$RUNNER_TEMP/release-notes.md
sed 's/bash -s -- --release`/bash -s -- --release --experimental`/' pack/release-notes.md >"$notes"
grep -q -- '--release --experimental`' "$notes" ||
echo "::warning::pack/release-notes.md has no get.sh --release line to mark experimental"
fi
gh release create "$GITHUB_REF_NAME" --draft --verify-tag "${pre[@]}" \
--title "Frametop $VERSION" --notes-file "$notes" --generate-notes \
framedrop/build/Frametop.zip framedrop/build/frametop.framedrop.json \
framedrop/build/frametop-release.json framedrop/build/SHA256SUMS