krz/hutch

an ios client for sourcehut

clone: git clone https://gitbay.org/krz/hutch.git

33bc142df56011877a9c85118eb4df63fd9ca3aa

verified · cmc

author: Christian Cleberg <hello@cleberg.net> · 2026-07-16T00:33:30Z

ci: run the test plan on macOS

The builds.sr.ht job runs on Ubuntu and can only do secret scanning and
structure checks, so the 214 tests ran only when someone remembered to run
them in Xcode. That is why the suite had rotted to ten failures.

builds.sr.ht has no macOS image and its maintainer has ruled them out, so
xcodebuild cannot run there. Add a job on the GitHub mirror instead.

Pinned to macos-26 because macos-latest still points at macOS 15, which lacks
the iOS 26 SDK. The simulator is resolved at runtime rather than pinned by
name, since device names shift between runner images.
 .github/workflows/test.yml | 60 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 60 insertions(+)

diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
new file mode 100644
index 0000000..568ff39
--- /dev/null
+++ b/.github/workflows/test.yml
@@ -0,0 +1,60 @@
+name: Tests
+
+# builds.sr.ht is the canonical CI for this project, but it has no macOS images
+# and will not add them, so xcodebuild cannot run there. This job exists to run
+# the test plan on the GitHub mirror; see builds/swift-ci.yml for the rest.
+on:
+  push:
+    branches: [main]
+  pull_request:
+  workflow_dispatch:
+
+concurrency:
+  group: tests-${{ github.ref }}
+  cancel-in-progress: true
+
+jobs:
+  test:
+    name: xcodebuild test
+    # macos-latest still points at macOS 15, which lacks the iOS 26 SDK.
+    runs-on: macos-26
+
+    steps:
+      - uses: actions/checkout@v4
+
+      - name: Show toolchain
+        run: |
+          xcodebuild -version
+          swift --version
+
+      - name: Select simulator
+        id: sim
+        run: |
+          set -euo pipefail
+          udid=$(xcrun simctl list devices available --json \
+            | jq -r '[.devices[][] | select(.name | startswith("iPhone"))] | first | .udid')
+          if [ -z "$udid" ] || [ "$udid" = "null" ]; then
+            echo "No available iPhone simulator on this image" >&2
+            xcrun simctl list devices available >&2
+            exit 1
+          fi
+          echo "udid=$udid" >> "$GITHUB_OUTPUT"
+
+      - name: Test
+        run: |
+          set -o pipefail
+          xcodebuild test \
+            -project Hutch.xcodeproj \
+            -scheme Hutch \
+            -testPlan HutchTests \
+            -destination "id=${{ steps.sim.outputs.udid }}" \
+            -resultBundlePath TestResults.xcresult \
+            CODE_SIGNING_ALLOWED=NO
+
+      - name: Upload results
+        if: failure()
+        uses: actions/upload-artifact@v4
+        with:
+          name: test-results
+          path: TestResults.xcresult
+          retention-days: 7