mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2026-08-12 09:13:23 +00:00
Amethyst v1.13.1 (and every prior release) shipped only linux-x64 desktop
binaries — .deb, .rpm, .AppImage, .flatpak, .tar.gz. Same for the amy
CLI and geode relay. Users on aarch64 hardware (Pinebook, Ampere
Altra, Raspberry Pi 4/5, AWS Graviton, arm64 servers, arm64 Chromebooks
running crostini, etc.) can't install any of them.
This teaches the release matrix about arm64:
- Add `ubuntu-24.04-arm` legs to build-desktop, build-cli, and
build-geode. This is a standard, free public-repo GitHub-hosted
runner (4 CPU / 16 GB / 14 GB SSD / arm64) since early 2025. No
cross-compilation: jpackage / jlink / Compose Multiplatform 1.11
all produce host-native artifacts.
- Fetch the matching `appimagetool-<arch>.AppImage` from the same
1.9.0 release with an arch-specific SHA256 pin. `APPIMAGETOOL_URL`
becomes `APPIMAGETOOL_VERSION` + per-arch SHA256 env vars.
- Parametrize the portable tarball/zip filename by `matrix.arch`
(`amethyst-desktop-<ver>-linux-arm64.tar.gz` is now produced).
- Parametrize the Flatpak bundle filename and rewrite the manifest's
`GST_PLUGIN_SYSTEM_PATH` from `x86_64-linux-gnu` to
`aarch64-linux-gnu` on the arm64 leg. The Flathub-submission manifest
(`desktopApp/packaging/flatpak/flathub/`) still gates on
`only-arches: x86_64` — flipping that to include aarch64 is a
follow-up once a Flathub aarch64 build has been validated end-to-end.
- Make the `createReleaseAppImage` gradle task pick its host arch from
`System.getProperty("os.arch")` (amd64/x86_64 → `x86_64`, aarch64/
arm64 → `aarch64`). Same task, same command, drives both legs.
- Fix `desktopApp/packaging/appimage/AppRun` to compute the multiarch
library path from `uname -m` at launch time instead of hard-coding
`x86_64-linux-gnu`. One script works in both AppImages on the target
machine.
- Extend the desktop smoke test to run the release .deb build + launch
probe on `ubuntu-24.04-arm` too, so arch-specific ProGuard/jlink
breakage (missing native lib, arch-specific reflection root) is
caught at PR time.
- Update BUILDING.md and scripts/asset-name.sh docs with the new
arm64 asset names.
Follow-up assets published for the next tag push (v1.13.2+):
- amethyst-desktop-<ver>-linux-arm64.{deb,rpm,AppImage,flatpak,tar.gz}
- amy-<ver>-linux-arm64.{deb,rpm,tar.gz}
- geode-<ver>-linux-arm64.{deb,rpm,tar.gz}
Verification (local, before submitting):
- `python3 -c 'import yaml; yaml.safe_load(open(".github/workflows/create-release.yml"))'` — parses clean
- `bash -n scripts/asset-name.sh desktopApp/packaging/appimage/AppRun` — parses clean
- `actionlint` — reports only pre-existing shellcheck style hints; no new errors
- Confirmed `linuxdeploy-aarch64.AppImage` and
`appimagetool-aarch64.AppImage` exist under the same pinned release
tags used for x86_64; SHA256 recorded from a fresh download.
Not addressed (out of scope for this PR):
- Homebrew / winget bump workflows (`bump-homebrew*.yml`,
`bump-winget.yml`) — those consume the assets by name; the new arm64
filenames don't change any x86_64 name they already reference.
- Android arm64 continues to ship as before (already had it).
153 lines
5.3 KiB
YAML
153 lines
5.3 KiB
YAML
name: Desktop Smoke Test
|
|
|
|
on:
|
|
workflow_dispatch:
|
|
pull_request:
|
|
paths:
|
|
- 'desktopApp/**'
|
|
- '.github/workflows/smoke-test-desktop.yml'
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
concurrency:
|
|
group: smoke-desktop-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
# -------------------------------------------------------------------------
|
|
# 1) Compose UI test — verifies the composable tree renders (login screen)
|
|
# under the dev classpath. Catches missing string resources, broken
|
|
# composables, and basic dependency-graph issues.
|
|
# -------------------------------------------------------------------------
|
|
compose-ui-test:
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 30
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v7
|
|
|
|
- name: Set up JDK 21
|
|
uses: actions/setup-java@v5.6.0
|
|
with:
|
|
distribution: 'temurin'
|
|
java-version: 21
|
|
|
|
- name: Set up Gradle
|
|
uses: gradle/actions/setup-gradle@v6
|
|
with:
|
|
cache-read-only: true
|
|
|
|
- name: Install xvfb
|
|
run: sudo apt-get update && sudo apt-get install -y xvfb
|
|
|
|
- name: Run desktop tests (including UI smoke test)
|
|
run: xvfb-run --auto-servernum ./gradlew :desktopApp:test
|
|
|
|
# -------------------------------------------------------------------------
|
|
# 2) Release .deb build + launch — builds the ProGuard'd, jlink'd .deb
|
|
# package, installs it, and verifies the process stays alive for 10s.
|
|
# Catches ProGuard stripping (JNI, reflection), missing jlink modules
|
|
# (java.management, java.prefs), and native lib bundling issues.
|
|
#
|
|
# Runs on both x64 and arm64 hosted runners so release-time arm64 breakage
|
|
# (e.g. ProGuard rules missing an arch-specific reflection root) is caught
|
|
# at PR time instead of on the tag build.
|
|
# -------------------------------------------------------------------------
|
|
release-deb-launch:
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
os: [ubuntu-latest, ubuntu-24.04-arm]
|
|
runs-on: ${{ matrix.os }}
|
|
timeout-minutes: 45
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v7
|
|
|
|
- name: Set up JDK 21
|
|
uses: actions/setup-java@v5.6.0
|
|
with:
|
|
distribution: 'temurin'
|
|
java-version: 21
|
|
|
|
- name: Set up Gradle
|
|
uses: gradle/actions/setup-gradle@v6
|
|
with:
|
|
cache-read-only: true
|
|
|
|
- name: Install xvfb + packaging deps
|
|
run: sudo apt-get update && sudo apt-get install -y xvfb fakeroot
|
|
|
|
- name: Build release .deb
|
|
uses: nick-fields/retry@ad984534de44a9489a53aefd81eb77f87c70dc60 # v4.0.0
|
|
with:
|
|
max_attempts: 2
|
|
timeout_minutes: 20
|
|
command: ./gradlew --no-daemon :desktopApp:packageReleaseDeb
|
|
|
|
- name: Relax libicu dependency
|
|
run: |
|
|
set -euo pipefail
|
|
chmod +x scripts/relax-deb-libicu.sh
|
|
scripts/relax-deb-libicu.sh desktopApp/build/compose/binaries/main-release/deb/*.deb
|
|
|
|
- name: Install .deb
|
|
run: |
|
|
# jpackage's post-install script runs xdg-desktop-menu which fails
|
|
# on CI runners ("No writable system menu directory"). The files are
|
|
# extracted successfully; only the menu registration fails. Allow the
|
|
# dpkg error, then verify the binary was actually installed.
|
|
sudo dpkg -i desktopApp/build/compose/binaries/main-release/deb/*.deb || true
|
|
echo "Installed files:"
|
|
dpkg -L amethyst | head -30
|
|
# Fail if the binary wasn't actually extracted
|
|
test -d /opt/amethyst || test -d /opt/Amethyst || {
|
|
echo "FAIL: /opt/amethyst not found after dpkg -i"
|
|
exit 1
|
|
}
|
|
|
|
- name: Smoke test — app launches and stays alive
|
|
run: |
|
|
set -euo pipefail
|
|
|
|
# Find the launcher binary
|
|
LAUNCHER=$(find /opt -name "Amethyst" -type f -executable 2>/dev/null | head -1)
|
|
if [[ -z "$LAUNCHER" ]]; then
|
|
# Fallback: search dpkg file list
|
|
LAUNCHER=$(dpkg -L amethyst | grep -E '/bin/[Aa]methyst$' | head -1)
|
|
fi
|
|
if [[ -z "$LAUNCHER" ]]; then
|
|
echo "FAIL: could not find Amethyst launcher binary"
|
|
dpkg -L amethyst
|
|
exit 1
|
|
fi
|
|
echo "Launcher: $LAUNCHER"
|
|
|
|
# Launch under xvfb with a timeout safety net
|
|
xvfb-run --auto-servernum timeout 30 "$LAUNCHER" &
|
|
APP_PID=$!
|
|
echo "PID: $APP_PID"
|
|
|
|
# Wait 10s — if the process is still alive, the app launched successfully
|
|
sleep 10
|
|
|
|
if kill -0 "$APP_PID" 2>/dev/null; then
|
|
echo "PASS: Application launched and stayed alive for 10s"
|
|
kill "$APP_PID" || true
|
|
wait "$APP_PID" 2>/dev/null || true
|
|
else
|
|
wait "$APP_PID" 2>/dev/null
|
|
EXIT_CODE=$?
|
|
echo "FAIL: Application exited with code $EXIT_CODE within 10s"
|
|
exit 1
|
|
fi
|
|
|
|
- name: Upload .deb artifact (for manual testing)
|
|
if: always()
|
|
uses: actions/upload-artifact@v7
|
|
with:
|
|
# Artifact names must be unique across a run — disambiguate per arch.
|
|
name: Release DEB (smoke-tested, ${{ matrix.os }})
|
|
path: desktopApp/build/compose/binaries/main-release/deb/*.deb
|