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