From 5ce3e45a8fc1925b051f31a620889d2856705584 Mon Sep 17 00:00:00 2001 From: Josh Auriemma Date: Sat, 3 Oct 2026 11:24:22 -0400 Subject: [PATCH] ci: launch the app in CI and before publishing a release v0.1.0 crashed at launch only when built in CI, where the macOS 26.5 SDK changes AppKit layout behavior; local SwiftPM builds record SDK 15.0 and ran fine. scripts/smoke-test.sh launches a binary and fails if it exits within 10 seconds. The build workflow runs it on the debug build for every PR, and the release workflow runs it on the signed app before notarizing, so a build that crashes at launch can't be published. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/build.yml | 4 ++++ .github/workflows/release.yml | 3 +++ scripts/smoke-test.sh | 21 +++++++++++++++++++++ 3 files changed, 28 insertions(+) create mode 100755 scripts/smoke-test.sh diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c6e08fd..20c44f3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,3 +21,7 @@ jobs: - uses: actions/checkout@v7 - run: swift --version - run: swift build + # CI links a newer SDK than local SwiftPM builds record, which can change AppKit behavior + # (v0.1.0 crashed at launch only when built here), so launch what CI built. + - name: Launch smoke test + run: ./scripts/smoke-test.sh "$(swift build --show-bin-path)/MacDirStat" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0e5d42e..306a884 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -45,6 +45,9 @@ jobs: - name: Build and sign run: UNIVERSAL=1 VERSION="${GITHUB_REF_NAME#v}" ./scripts/build-app.sh + - name: Launch smoke test + run: ./scripts/smoke-test.sh .build/MacDirStat.app/Contents/MacOS/MacDirStat + - name: Notarize env: NOTARY_API_KEY: ${{ secrets.NOTARY_API_KEY }} diff --git a/scripts/smoke-test.sh b/scripts/smoke-test.sh new file mode 100755 index 0000000..b50d368 --- /dev/null +++ b/scripts/smoke-test.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# Launches MacDirStat and fails if it exits within a few seconds, to catch crashes at launch. +# Usage: scripts/smoke-test.sh PATH_TO_BINARY [SECONDS] +set -uo pipefail + +BINARY="${1:?usage: $0 PATH_TO_BINARY [SECONDS]}" +WAIT_SECONDS="${2:-10}" + +"$BINARY" >/dev/null 2>&1 & +PID=$! +sleep "$WAIT_SECONDS" + +if kill -0 "$PID" 2>/dev/null; then + kill "$PID" + echo "MacDirStat was still running after ${WAIT_SECONDS}s" +else + STATUS=0 + wait "$PID" || STATUS=$? + echo "MacDirStat exited during launch with status $STATUS" >&2 + exit 1 +fi