11name : Pull request
22on : pull_request
33
4+ env :
5+ XCODE_VERSION : " 16.3"
6+
47jobs :
5- pull-request :
8+ prepare :
69 runs-on : macos-15
7-
10+ outputs :
11+ platforms : ${{ steps.platforms.outputs.platforms }}
12+ scheme : ${{ steps.scheme.outputs.scheme }}
813 steps :
914 - uses : actions/checkout@v4
15+ - name : Setup Xcode
16+ run : sudo xcode-select -s /Applications/Xcode_$XCODE_VERSION.app
1017
11- - name : Setup
18+ - name : Setup mise
1219 env :
1320 GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
1421 run : |
1522 curl https://mise.run | sh
1623 mise install
17-
18- - name : Lint
24+ - name : Run linters
1925 run : mise lint
2026
21- - name : Build
27+ - name : Extract platforms
28+ id : platforms
29+ run : |
30+ platforms=$(swift package dump-package | jq -r '[.platforms[].platformName] | unique | @json')
31+ echo "Platforms: $platforms"
32+ echo "platforms=$platforms" >> $GITHUB_OUTPUT
33+
34+ - name : Extract scheme
35+ id : scheme
36+ run : |
37+ repo=$(basename $GITHUB_REPOSITORY)
38+ schemes=$(xcodebuild -list)
39+ echo "$schemes"
40+
41+ if echo "$schemes" | grep -q "$repo-Package"; then
42+ scheme="$repo-Package"
43+ elif echo "$schemes" | grep -q "$repo"; then
44+ scheme="$repo"
45+ else
46+ echo "Unable to select a scheme"
47+ exit 1
48+ fi
49+
50+ echo "Selected scheme: $scheme"
51+ echo "scheme=$scheme" >> $GITHUB_OUTPUT
52+
53+ build-and-test :
54+ needs : prepare
55+ runs-on : macos-15
56+ strategy :
57+ fail-fast : false
58+ matrix :
59+ platform : ${{ fromJSON(needs.prepare.outputs.platforms) }}
60+ steps :
61+ - uses : actions/checkout@v4
62+ - name : Setup Xcode
63+ run : sudo xcode-select -s /Applications/Xcode_$XCODE_VERSION.app
64+
65+ - name : Map destinations
66+ if : ${{ matrix.platform != 'macos' }}
67+ id : destination
68+ run : |
69+ case "${{ matrix.platform }}" in
70+ ios)
71+ destination="platform=iOS Simulator,name=iPhone 16 Pro Max,OS=latest"
72+ ;;
73+ maccatalyst)
74+ destination="platform=macOS,variant=Mac Catalyst"
75+ ;;
76+ tvos)
77+ destination="platform=tvOS Simulator,name=Apple TV 4K (3rd generation),OS=latest"
78+ ;;
79+ visionos)
80+ destination="platform=visionOS Simulator,name=Apple Vision Pro,OS=latest"
81+ ;;
82+ watchos)
83+ destination="platform=watchOS Simulator,name=Apple Watch Series 10 (46mm),OS=latest"
84+ ;;
85+ *)
86+ echo "Unknown platform: ${{ matrix.platform }}"
87+ exit 1
88+ ;;
89+ esac
90+ echo "destination=$destination" >> $GITHUB_OUTPUT
91+
92+ - name : Build (SPM)
93+ if : ${{ matrix.platform == 'macos' }}
2294 run : swift build
95+ - name : Build (Xcode)
96+ if : ${{ matrix.platform != 'macos' }}
97+ run : |
98+ set -o pipefail
99+ xcodebuild build \
100+ -scheme ${{ needs.prepare.outputs.scheme }} \
101+ -destination "${{ steps.destination.outputs.destination }}" | \
102+ xcbeautify --renderer github-actions
23103
24- - name : Test
25- run : swift test
104+ - name : Test (SPM)
105+ if : ${{ matrix.platform == 'macos' }}
106+ run : |
107+ set -o pipefail
108+ swift test | xcbeautify --renderer github-actions
109+ - name : Test (Xcode)
110+ if : ${{ matrix.platform != 'macos' }}
111+ run : |
112+ set -o pipefail
113+ xcodebuild test \
114+ -scheme ${{ needs.prepare.outputs.scheme }} \
115+ -destination "${{ steps.destination.outputs.destination }}" | \
116+ xcbeautify --renderer github-actions
0 commit comments