Skip to content

mac-smoke

mac-smoke #3

Workflow file for this run

# Boots the released mac zip on a real Apple Silicon runner — the project has
# no mac testers, so this is the only execution the mac artifact gets before
# users do. Runs automatically when a release is published, and on demand from
# the Actions tab (pick a tag, or leave empty for the latest release).
#
# The heavy lifting is tools/packaged-smoke.mjs in SMOKE_MAC_APP mode: the
# same static file checks as the local gate, then a real boot against a
# throwaway pod home — seed plants files, WebID card exists, app page loads,
# router answers.
name: mac-smoke
on:
release:
types: [published]
workflow_dispatch:
inputs:
tag:
description: 'Release tag to test (e.g. v2.1.7); empty = latest release'
required: false
default: ''
jobs:
boot:
# Apple Silicon — the x64 app runs under Rosetta here, same as real users.
runs-on: macos-14
timeout-minutes: 15
steps:
- uses: actions/checkout@v4 # for tools/packaged-smoke.mjs + package.json
- uses: actions/setup-node@v4
with:
node-version: 24
- name: Download the release's mac zip
env:
GH_TOKEN: ${{ github.token }}
run: |
TAG='${{ github.event.inputs.tag || github.event.release.tag_name }}'
if [ -z "$TAG" ]; then
TAG=$(gh release view --repo "$GITHUB_REPOSITORY" --json tagName -q .tagName)
fi
echo "testing release $TAG"
echo "TAG=$TAG" >> "$GITHUB_ENV"
gh release download "$TAG" --repo "$GITHUB_REPOSITORY" \
--pattern '*-mac-x64.zip' --dir "$RUNNER_TEMP/dk"
- name: Unzip like a user
run: |
ditto -x -k "$RUNNER_TEMP"/dk/*-mac-x64.zip "$RUNNER_TEMP/dk/unzipped"
xattr -cr "$RUNNER_TEMP/dk/unzipped" || true
- name: Static checks + boot the packaged app
run: |
SMOKE_EXPECT_VERSION="${TAG#v}" \
SMOKE_MAC_APP="$RUNNER_TEMP/dk/unzipped/Solid Data Kitchen.app" \
node tools/packaged-smoke.mjs
# Video-playback probe (the 2026-07-16 "videos do not play on macOS"
# reports): a second boot WITH the GPU (users run with it; the plain
# smoke boot disables it) + CDP, then codec matrix + a real archive.org
# h.264 stream + a drive of the actual Movies room.
- name: Video playback probe
run: |
# the first boot's server children can outlive their SIGKILLed app —
# wait for the smoke ports to free so this boot can't adopt dying
# servers (the stale-server relaunch gotcha)
for i in $(seq 1 30); do
lsof -nP -iTCP:18400 -iTCP:18410 -iTCP:18401 -sTCP:LISTEN >/dev/null 2>&1 || break
sleep 2
done
SMOKE_EXPECT_VERSION="${TAG#v}" \
SMOKE_MAC_APP="$RUNNER_TEMP/dk/unzipped/Solid Data Kitchen.app" \
SMOKE_VIDEO=1 DRIVE_MOVIES=1 \
node tools/packaged-smoke.mjs