1+ name : Build
2+
3+ on :
4+ push :
5+ branches :
6+ - main
7+ tags :
8+ - ' *'
9+ paths-ignore :
10+ - README.md
11+ pull_request :
12+ branches :
13+ - main
14+ paths-ignore :
15+ - README.md
16+
17+ env :
18+ CurrentSemanticVersionBase : ' 99.0.0'
19+ PreviewNumber : ${{ github.run_number }}
20+ CurrentSemanticVersion : ' 99.0.0-preview${{ github.run_number }}'
21+ NugetPackageVersion : ' 99.0.0-preview${{ github.run_number }}'
22+ NugetPackageVersionCamera : ' 99.0.0-preview${{ github.run_number }}'
23+ NugetPackageVersionMediaElement : ' 99.0.0-preview${{ github.run_number }}'
24+ NugetPackageVersionMaps : ' 99.0.0-preview${{ github.run_number }}'
25+ TOOLKIT_NET_VERSION : ' 9.0.102'
26+ LATEST_NET_VERSION : ' 9.0.x'
27+ PathToLibrarySolution : ' src/CommunityToolkit.Maui.sln'
28+ PathToSamplesSolution : ' samples/CommunityToolkit.Maui.Sample.sln'
29+ PathToCommunityToolkitCsproj : ' src/CommunityToolkit.Maui/CommunityToolkit.Maui.csproj'
30+ PathToCommunityToolkitCoreCsproj : ' src/CommunityToolkit.Maui.Core/CommunityToolkit.Maui.Core.csproj'
31+ PathToCommunityToolkitCameraCsproj : ' src/CommunityToolkit.Maui.Camera/CommunityToolkit.Maui.Camera.csproj'
32+ PathToCommunityToolkitMediaElementCsproj : ' src/CommunityToolkit.Maui.MediaElement/CommunityToolkit.Maui.MediaElement.csproj'
33+ PathToCommunityToolkitMapsCsproj : ' src/CommunityToolkit.Maui.Maps/CommunityToolkit.Maui.Maps.csproj'
34+ PathToCommunityToolkitSampleCsproj : ' samples/CommunityToolkit.Maui.Sample/CommunityToolkit.Maui.Sample.csproj'
35+ PathToCommunityToolkitUnitTestCsproj : ' src/CommunityToolkit.Maui.UnitTests/CommunityToolkit.Maui.UnitTests.csproj'
36+ PathToCommunityToolkitAnalyzersCsproj : ' src/CommunityToolkit.Maui.Analyzers/CommunityToolkit.Maui.Analyzers.csproj'
37+ PathToCommunityToolkitCameraAnalyzersCsproj : ' src/CommunityToolkit.Maui.Camera.Analyzers/CommunityToolkit.Maui.Camera.Analyzers.csproj'
38+ PathToCommunityToolkitMediaElementAnalyzersCsproj : ' src/CommunityToolkit.Maui.MediaElement.Analyzers/CommunityToolkit.Maui.MediaElement.Analyzers.csproj'
39+ PathToCommunityToolkitSourceGeneratorsCsproj : ' src/CommunityToolkit.Maui.SourceGenerators/CommunityToolkit.Maui.SourceGenerators.csproj'
40+ PathToCommunityToolkitSourceGeneratorsInternalCsproj : ' src/CommunityToolkit.Maui.SourceGenerators.Internal/CommunityToolkit.Maui.SourceGenerators.Internal.csproj'
41+ PathToCommunityToolkitAnalyzersCodeFixCsproj : ' src/CommunityToolkit.Maui.Analyzers.CodeFixes/CommunityToolkit.Maui.Analyzers.CodeFixes.csproj'
42+ PathToCommunityToolkitCameraAnalyzersCodeFixCsproj : ' src/CommunityToolkit.Maui.Camera.Analyzers.CodeFixes/CommunityToolkit.Maui.Camera.Analyzers.CodeFixes.csproj'
43+ PathToCommunityToolkitMediaElementAnalyzersCodeFixCsproj : ' src/CommunityToolkit.Maui.MediaElement.Analyzers.CodeFixes/CommunityToolkit.Maui.MediaElement.Analyzers.CodeFixes.csproj'
44+ PathToCommunityToolkitAnalyzersUnitTestCsproj : ' src/CommunityToolkit.Maui.Analyzers.UnitTests/CommunityToolkit.Maui.Analyzers.UnitTests.csproj'
45+ PathToCommunityToolkitAnalyzersBenchmarkCsproj : ' src/CommunityToolkit.Maui.Analyzers.Benchmarks/CommunityToolkit.Maui.Analyzers.Benchmarks.csproj'
46+ CommunityToolkitSampleApp_Xcode_Version : ' 16.2'
47+ CommunityToolkitLibrary_Xcode_Version : ' 16.2'
48+
49+ jobs :
50+ build_sample :
51+ name : Build Sample App using Latest .NET SDK
52+ runs-on : ${{ matrix.os }}
53+ strategy :
54+ matrix :
55+ os : [windows-latest, macos-15]
56+ steps :
57+ - name : Checkout code
58+ uses : actions/checkout@main
59+
60+ - name : Set Xcode version
61+ if : runner.os == 'macOS'
62+ run : |
63+ echo Installed Xcode Versions:
64+ ls -al /Applications | grep Xcode
65+ sudo xcode-select --switch /Applications/Xcode_${{ env.CommunityToolkitSampleApp_Xcode_Version }}.app/Contents/Developer
66+
67+ - name : Install Latest .NET SDK, v${{ env.LATEST_NET_VERSION }}
68+ uses : actions/setup-dotnet@v4
69+ with :
70+ dotnet-version : ${{ env.LATEST_NET_VERSION }}
71+ dotnet-quality : ' ga'
72+
73+ - name : Install .NET MAUI Workload
74+ run : |
75+ dotnet workload install maui
76+ dotnet workload update
77+
78+ - name : Install Tizen Workload
79+ run : |
80+ Invoke-WebRequest 'https://raw.githubusercontent.com/Samsung/Tizen.NET/main/workload/scripts/workload-install.ps1' -OutFile 'workload-install.ps1'
81+ .\workload-install.ps1
82+ shell : pwsh
83+
84+ - name : Display dotnet info
85+ run : dotnet --info
86+
87+ - name : Build Community Toolkit Sample
88+ run : dotnet build -c Release ${{ env.PathToCommunityToolkitSampleCsproj }}
89+
90+ build_library :
91+ name : Build Library
92+ runs-on : ${{ matrix.os }}
93+ env :
94+ VSTEST_TESTHOST_SHUTDOWN_TIMEOUT : 1100 # Fixes "The active test run was aborted. Reason: Test host process crashed"
95+ strategy :
96+ matrix :
97+ os : [windows-latest, macos-15]
98+ steps :
99+ - name : Checkout code
100+ uses : actions/checkout@main
101+
102+ - name : Set NuGet Version to Tag Number
103+ if : startsWith(github.ref, 'refs/tags/') && !endsWith(github.ref, '-mediaelement')
104+ run : echo "NugetPackageVersion=${{ github.ref }}" >> $GITHUB_ENV
105+
106+ - name : Set NuGet Version to Tag Number for Camera
107+ if : startsWith(github.ref, 'refs/tags/') && endsWith(github.ref, '-camera')
108+ run : echo "NugetPackageVersionCamera=${{ github.ref }}" >> $GITHUB_ENV
109+
110+ - name : Set NuGet Version to Tag Number for MediaElement
111+ if : startsWith(github.ref, 'refs/tags/') && endsWith(github.ref, '-mediaelement')
112+ run : echo "NugetPackageVersionMediaElement=${{ github.ref }}" >> $GITHUB_ENV
113+
114+ - name : Set NuGet Version to Tag Number for Maps
115+ if : startsWith(github.ref, 'refs/tags/') && endsWith(github.ref, '-maps')
116+ run : echo "NugetPackageVersionMaps=${{ github.ref }}" >> $GITHUB_ENV
117+
118+ - name : Set NuGet Version to PR Version
119+ if : ${{ github.event_name == 'pull_request' }}
120+ run : |
121+ echo "NugetPackageVersion=${{ env.CurrentSemanticVersionBase }}-build-${{ github.event.pull_request.number }}.${{ github.run_number }}+${{ github.sha }}"
122+ echo "NugetPackageVersionMediaElement=${{ env.CurrentSemanticVersionBase }}-build-${{ github.event.pull_request.number }}.${{ github.run_number }}+${{ github.sha }}"
123+ echo "NugetPackageVersionMaps=${{ env.CurrentSemanticVersionBase }}-build-${{ github.event.pull_request.number }}.${{ github.run_number }}+${{ github.sha }}"
124+ shell : bash
125+
126+ - name : Set Xcode version
127+ if : runner.os == 'macOS'
128+ run : |
129+ echo Installed Xcode Versions:
130+ ls -al /Applications | grep Xcode
131+ sudo xcode-select --switch /Applications/Xcode_${{ env.CommunityToolkitLibrary_Xcode_Version }}.app/Contents/Developer
132+
133+ - name : Install .NET SDK v${{ env.TOOLKIT_NET_VERSION }}
134+ uses : actions/setup-dotnet@v4
135+ with :
136+ dotnet-version : ${{ env.TOOLKIT_NET_VERSION }}
137+ dotnet-quality : ' ga'
138+
139+ - name : Install .NET MAUI Workload
140+ run : |
141+ dotnet workload install maui
142+ dotnet workload update
143+
144+ - name : Install Tizen Workload
145+ run : |
146+ Invoke-WebRequest 'https://raw.githubusercontent.com/Samsung/Tizen.NET/main/workload/scripts/workload-install.ps1' -OutFile 'workload-install.ps1'
147+ .\workload-install.ps1
148+ shell : pwsh
149+
150+ - name : Display dotnet info
151+ run : dotnet --info
152+
153+ - name : ' Build CommunityToolkit.Maui.Analyzers'
154+ run : dotnet build ${{ env.PathToCommunityToolkitAnalyzersCsproj }} -c Release
155+
156+ - name : ' Build CommunityToolkit.Maui.Analyzers.CodeFixes'
157+ run : dotnet build ${{ env.PathToCommunityToolkitAnalyzersCodeFixCsproj }} -c Release
158+
159+ - name : ' Build CommunityToolkit.Maui.Camera.Analyzers'
160+ run : dotnet build ${{ env.PathToCommunityToolkitCameraAnalyzersCsproj }} -c Release
161+
162+ - name : ' Build CommunityToolkit.Maui.Camera.Analyzers.CodeFixes'
163+ run : dotnet build ${{ env.PathToCommunityToolkitCameraAnalyzersCodeFixCsproj }} -c Release
164+
165+ - name : ' Build CommunityToolkit.Maui.MediaElement.Analyzers'
166+ run : dotnet build ${{ env.PathToCommunityToolkitMediaElementAnalyzersCsproj }} -c Release
167+
168+ - name : ' Build CommunityToolkit.Maui.MediaElement.Analyzers.CodeFixes'
169+ run : dotnet build ${{ env.PathToCommunityToolkitMediaElementAnalyzersCodeFixCsproj }} -c Release
170+
171+ - name : ' Build CommunityToolkit.Maui.SourceGenerators'
172+ run : dotnet build ${{ env.PathToCommunityToolkitSourceGeneratorsCsproj }} -c Release
173+
174+ - name : ' Build CommunityToolkit.SourceGenerators.Internal'
175+ run : dotnet build ${{ env.PathToCommunityToolkitSourceGeneratorsInternalCsproj }} -c Release
176+
177+ - name : ' Build CommunityToolkit.Maui.Camera'
178+ run : dotnet build ${{ env.PathToCommunityToolkitCameraCsproj }} -c Release -p:PackageVersion=${{ env.NugetPackageVersionCamera }} -p:Version=${{ env.NugetPackageVersion }}
179+
180+ - name : ' Build CommunityToolkit.Maui.MediaElement'
181+ run : dotnet build ${{ env.PathToCommunityToolkitMediaElementCsproj }} -c Release -p:PackageVersion=${{ env.NugetPackageVersionMediaElement }} -p:Version=${{ env.NugetPackageVersion }}
182+
183+ - name : ' Build CommunityToolkit.Maui.Maps'
184+ run : dotnet build ${{ env.PathToCommunityToolkitMapsCsproj }} -c Release -p:PackageVersion=${{ env.NugetPackageVersionMaps }} -p:Version=${{ env.NugetPackageVersion }}
185+
186+ - name : ' Build CommunityToolkit.Maui.Core'
187+ run : dotnet build ${{ env.PathToCommunityToolkitCoreCsproj }} -c Release -p:PackageVersion=${{ env.NugetPackageVersion }} -p:Version=${{ env.NugetPackageVersion }}
188+
189+ - name : ' Build CommunityToolkit.Maui'
190+ run : dotnet build ${{ env.PathToLibrarySolution }} -c Release -p:PackageVersion=${{ env.NugetPackageVersion }} -p:Version=${{ env.NugetPackageVersion }}
191+
192+ - name : Run All Unit Tests
193+ run : dotnet test -c Release ${{ env.PathToLibrarySolution }} --settings ".runsettings" --collect "XPlat code coverage" --logger trx --results-directory ${{ runner.temp }}
194+
195+ - name : Publish Test Results
196+ if : runner.os == 'Windows'
197+ uses : actions/upload-artifact@v4
198+ with :
199+ name : Test Results
200+ path : |
201+ ${{ runner.temp }}/**/*.trx
202+
203+ - name : Pack CommunityToolkit.Maui.Core NuGet
204+ run : dotnet pack -c Release ${{ env.PathToCommunityToolkitCoreCsproj }} -p:PackageVersion=${{ env.NugetPackageVersion }}
205+
206+ - name : Pack CommunityToolkit.Maui NuGet
207+ run : dotnet pack -c Release ${{ env.PathToCommunityToolkitCsproj }} -p:PackageVersion=${{ env.NugetPackageVersion }}
208+
209+ - name : Pack CommunityToolkit.Maui.Camera NuGet
210+ run : dotnet pack -c Release ${{ env.PathToCommunityToolkitCameraCsproj }} -p:PackageVersion=${{ env.NugetPackageVersionCamera }}
211+
212+ - name : Pack CommunityToolkit.Maui.MediaElement NuGet
213+ run : dotnet pack -c Release ${{ env.PathToCommunityToolkitMediaElementCsproj }} -p:PackageVersion=${{ env.NugetPackageVersionMediaElement }}
214+
215+ - name : Pack CommunityToolkit.Maui.Maps NuGet
216+ run : dotnet pack -c Release ${{ env.PathToCommunityToolkitMapsCsproj }} -p:PackageVersion=${{ env.NugetPackageVersionMaps }}
217+
218+ - name : Copy NuGet Packages to Staging Directory
219+ if : runner.os == 'Windows' && !startsWith(github.ref, 'refs/tags/')
220+ run : |
221+ mkdir -p ${{ github.workspace }}/nuget
222+ Get-ChildItem -Path "./src" -Recurse | Where-Object { $_.Extension -match "nupkg" } | Copy-Item -Destination "${{ github.workspace }}/nuget"
223+ shell : pwsh
224+
225+ - name : Upload Package List
226+ uses : actions/upload-artifact@v4
227+ if : runner.os == 'Windows'
228+ with :
229+ name : nuget-list
230+ if-no-files-found : error
231+ path : |
232+ ${{ github.workspace }}/.github/workflows/SignClientFileList.txt
233+
234+ - name : Publish Packages
235+ if : runner.os == 'Windows'
236+ uses : actions/upload-artifact@v4
237+ with :
238+ name : packages
239+ path : ${{ github.workspace }}/nuget/
240+
241+ sign :
242+ needs : [build_library]
243+ if : ${{ github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/rel/') }}
244+ runs-on : windows-latest
245+ permissions :
246+ id-token : write # Required for requesting the JWT
247+
248+ steps :
249+ - name : Install .NET SDK v${{ env.TOOLKIT_NET_VERSION }}
250+ uses : actions/setup-dotnet@v4
251+ with :
252+ dotnet-version : ${{ env.TOOLKIT_NET_VERSION }}
253+ dotnet-quality : ' ga'
254+
255+ - name : Download NuGet List
256+ uses : actions/download-artifact@v4
257+ with :
258+ name : nuget-list
259+ path : ./
260+
261+ - name : Download Package List
262+ uses : actions/download-artifact@v4
263+ with :
264+ name : packages
265+ path : ./packages
266+
267+ - name : Install Signing Tool
268+ run : dotnet tool install --tool-path ./tools sign --version 0.9.1-beta.23356.1
269+
270+ - name : Sign Packages
271+ run : >
272+ ./tools/sign code azure-key-vault
273+ **/*.nupkg
274+ --base-directory "${{ github.workspace }}/packages"
275+ --file-list "${{ github.workspace }}/SignClientFileList.txt"
276+ --timestamp-url "http://timestamp.digicert.com"
277+ --publisher-name ".NET Foundation"
278+ --description "Community Toolkit MAUI"
279+ --description-url "https://github.com/CommunityToolkit/Maui"
280+ --azure-key-vault-url "${{ secrets.SIGN_KEY_VAULT_URL }}"
281+ --azure-key-vault-client-id ${{ secrets.SIGN_CLIENT_ID }}
282+ --azure-key-vault-client-secret "${{ secrets.SIGN_CLIENT_SECRET }}"
283+ --azure-key-vault-tenant-id ${{ secrets.SIGN_TENANT_ID }}
284+ --azure-key-vault-certificate "${{ secrets.SIGN_CERTIFICATE }}"
285+ --verbosity Information
286+
287+ - name : Publish Packages
288+ uses : actions/upload-artifact@v4
289+ with :
290+ name : signed-packages
291+ if-no-files-found : error
292+ path : |
293+ ${{ github.workspace }}/packages/**/*.nupkg
294+
295+ release :
296+ if : ${{ startsWith(github.ref, 'refs/heads/rel/') }}
297+ needs : [sign]
298+ environment : nuget-release-gate # This gates this job until manually approved
299+ runs-on : ubuntu-latest
300+
301+ steps :
302+ - name : Install .NET SDK
303+ uses : actions/setup-dotnet@v4
304+ with :
305+ dotnet-version : ${{ env.TOOLKIT_NET_VERSION }}
306+ dotnet-quality : ' ga'
307+
308+ - name : Download signed packages for ${{ matrix.platform }}
309+ uses : actions/download-artifact@v4
310+ with :
311+ name : signed-packages
312+ path : ./packages
313+
314+ - name : Push to NuGet.org
315+ run : >
316+ dotnet nuget push
317+ **/*.nupkg
318+ --source https://api.nuget.org/v3/index.json
319+ --api-key ${{ secrets.NUGET_PACKAGE_PUSH_TOKEN }}
320+ --skip-duplicate
0 commit comments