1+ name : CI
2+
3+ on :
4+ push :
5+ branches : [ main ]
6+ pull_request :
7+ branches : [ main ]
8+ workflow_dispatch :
9+
10+ env :
11+ DEVELOPER_DIR : /Applications/Xcode_16.0.app/Contents/Developer
12+
13+ jobs :
14+ lint :
15+ name : SwiftLint
16+ runs-on : macos-15
17+
18+ steps :
19+ - name : Checkout code
20+ uses : actions/checkout@v4
21+
22+ - name : Install SwiftLint
23+ run : brew install swiftlint
24+
25+ - name : Run SwiftLint
26+ run : |
27+ cd Recap
28+ swiftlint --strict --reporter github-actions-logging
29+
30+ build :
31+ name : Build
32+ runs-on : macos-15
33+
34+ steps :
35+ - name : Checkout code
36+ uses : actions/checkout@v4
37+
38+ - name : Setup Xcode
39+ uses : maxim-lobanov/setup-xcode@v1
40+ with :
41+ xcode-version : ' 16.0'
42+
43+ - name : Cache Swift Package Manager
44+ uses : actions/cache@v4
45+ with :
46+ path : |
47+ ~/Library/Developer/Xcode/DerivedData
48+ .build
49+ key : ${{ runner.os }}-spm-${{ hashFiles('**/Package.resolved') }}
50+ restore-keys : |
51+ ${{ runner.os }}-spm-
52+
53+ - name : Resolve Dependencies
54+ run : |
55+ cd Recap
56+ swift package resolve
57+
58+ - name : Build Debug
59+ run : |
60+ cd Recap
61+ swift build -c debug
62+
63+ - name : Build Release
64+ run : |
65+ cd Recap
66+ swift build -c release
67+
68+ test :
69+ name : Test
70+ runs-on : macos-15
71+ needs : build
72+
73+ steps :
74+ - name : Checkout code
75+ uses : actions/checkout@v4
76+
77+ - name : Setup Xcode
78+ uses : maxim-lobanov/setup-xcode@v1
79+ with :
80+ xcode-version : ' 16.0'
81+
82+ - name : Cache Swift Package Manager
83+ uses : actions/cache@v4
84+ with :
85+ path : |
86+ ~/Library/Developer/Xcode/DerivedData
87+ .build
88+ key : ${{ runner.os }}-spm-${{ hashFiles('**/Package.resolved') }}
89+ restore-keys : |
90+ ${{ runner.os }}-spm-
91+
92+ - name : Run Tests with Coverage
93+ run : |
94+ cd Recap
95+ swift test --enable-code-coverage --parallel
96+
97+ - name : Generate Test Report
98+ run : |
99+ cd Recap
100+ swift test --parallel --xunit-output=test-results.xml || true
101+
102+ - name : Generate Coverage Report
103+ run : |
104+ cd Recap
105+ xcrun llvm-cov export \
106+ .build/debug/RecapPackageTests.xctest/Contents/MacOS/RecapPackageTests \
107+ -instr-profile .build/debug/codecov/default.profdata \
108+ -format=lcov \
109+ -ignore-filename-regex=".build|Tests|Mocks" \
110+ > coverage.lcov || true
111+
112+ - name : Upload Test Results
113+ uses : actions/upload-artifact@v4
114+ if : always()
115+ with :
116+ name : test-results
117+ path : test-results.xml
118+
119+ - name : Upload Coverage Reports
120+ uses : codecov/codecov-action@v5
121+ with :
122+ file : ./coverage.lcov
123+ flags : unittests
124+ name : recap-coverage
125+ fail_ci_if_error : false
126+
127+ - name : Publish Test Report
128+ uses : mikepenz/action-junit-report@v4
129+ if : always()
130+ with :
131+ report_paths : ' test-results.xml'
132+ check_name : ' Test Results'
133+ fail_on_failure : true
134+
135+ check-generated-mocks :
136+ name : Check Generated Mocks
137+ runs-on : macos-15
138+
139+ steps :
140+ - name : Checkout code
141+ uses : actions/checkout@v4
142+
143+ - name : Setup Xcode
144+ uses : maxim-lobanov/setup-xcode@v1
145+ with :
146+ xcode-version : ' 16.0'
147+
148+ - name : Build to Generate Mocks
149+ run : |
150+ cd Recap
151+ swift build
152+
153+ - name : Check for Uncommitted Mock Changes
154+ run : |
155+ if [[ -n $(git status --porcelain) ]]; then
156+ echo "Generated mocks are not committed. Please build locally and commit the generated mock files."
157+ git status --porcelain
158+ exit 1
159+ fi
0 commit comments