From c43757c88472cb2a8aec24206b737d4e63ddd0f3 Mon Sep 17 00:00:00 2001 From: Jon Beniston Date: Thu, 20 Aug 2026 10:11:21 +0100 Subject: [PATCH] Add smoke test to install and run SDRangel on Mac to check installers are built ok --- .github/workflows/mac.yml | 116 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) diff --git a/.github/workflows/mac.yml b/.github/workflows/mac.yml index b2c6f3809..76a495b82 100644 --- a/.github/workflows/mac.yml +++ b/.github/workflows/mac.yml @@ -160,3 +160,119 @@ jobs: uses: softprops/action-gh-release@v2 with: files: ${{ github.workspace }}/build/${{ steps.get_filename.outputs.filename }}.dmg + + smoke_test_mac: + name: Smoke test macOS ${{ matrix.arch }} + needs: + - build_mac_x64 + - build_mac_arm64 + + strategy: + fail-fast: false + matrix: + include: + - arch: x64 + runner: macos-15-intel + artifact_pattern: sdrangel-*-macx64.dmg + - arch: arm64 + runner: macos-14 + artifact_pattern: sdrangel-*-macarm64.dmg + + runs-on: ${{ matrix.runner }} + + steps: + - name: Download installer + uses: actions/download-artifact@v5 + with: + pattern: ${{ matrix.artifact_pattern }} + path: ${{ runner.temp }}/installer + merge-multiple: true + + - name: Install and launch SDRangel + shell: bash + run: | + set -Eeuo pipefail + + DMG="$(find "$RUNNER_TEMP/installer" -type f -name '*.dmg' -print -quit)" + test -n "$DMG" + + MOUNT="$RUNNER_TEMP/sdrangel-mount" + INSTALLED_APP="$RUNNER_TEMP/Applications/SDRangel.app" + LOG="$RUNNER_TEMP/sdrangel-smoke.log" + RESPONSE="$RUNNER_TEMP/sdrangel-response.json" + PID="" + + cleanup() { + if [[ -n "$PID" ]] && kill -0 "$PID" 2>/dev/null; then + kill "$PID" 2>/dev/null || true + wait "$PID" 2>/dev/null || true + fi + if mount | grep -Fq "$MOUNT"; then + hdiutil detach "$MOUNT" -force || true + fi + } + trap cleanup EXIT + + hdiutil verify "$DMG" + mkdir -p "$MOUNT" "$(dirname "$INSTALLED_APP")" + hdiutil attach "$DMG" -readonly -nobrowse -mountpoint "$MOUNT" + + SOURCE_APP="$(find "$MOUNT" -maxdepth 2 -type d -name 'SDRangel.app' -print -quit)" + test -n "$SOURCE_APP" + + ditto "$SOURCE_APP" "$INSTALLED_APP" + hdiutil detach "$MOUNT" + + PLIST="$INSTALLED_APP/Contents/Info.plist" + plutil -lint "$PLIST" + + EXECUTABLE_NAME="$(/usr/libexec/PlistBuddy \ + -c 'Print :CFBundleExecutable' "$PLIST")" + EXECUTABLE="$INSTALLED_APP/Contents/MacOS/$EXECUTABLE_NAME" + + test -x "$EXECUTABLE" + file "$EXECUTABLE" + + mkdir -p "$RUNNER_TEMP/sdrangel-home" + HOME="$RUNNER_TEMP/sdrangel-home" \ + "$EXECUTABLE" \ + --scratch \ + --api-address 127.0.0.1 \ + --api-port 18091 \ + >"$LOG" 2>&1 & + PID=$! + + ready=false + for attempt in {1..60}; do + if ! kill -0 "$PID" 2>/dev/null; then + echo "SDRangel exited during startup" + cat "$LOG" + exit 1 + fi + + if curl --fail --silent --show-error \ + http://127.0.0.1:18091/sdrangel \ + >"$RESPONSE"; then + ready=true + break + fi + + sleep 1 + done + + if [[ "$ready" != true ]]; then + echo "SDRangel Web API did not become ready" + cat "$LOG" + exit 1 + fi + + grep -Eq '"appname"[[:space:]]*:[[:space:]]*"SDRangel"' "$RESPONSE" + echo "SDRangel installed and started successfully" + + - name: Upload startup log on failure + if: failure() + uses: actions/upload-artifact@v4 + with: + name: mac-${{ matrix.arch }}-startup-log + path: ${{ runner.temp }}/sdrangel-smoke.log + if-no-files-found: ignore