Skip to content

Commit 4471407

Browse files
authored
Merge branch 'main' into 1557-fix-collectiobview
2 parents 9c50ac0 + fbfd456 commit 4471407

File tree

101 files changed

+4098
-1661
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

101 files changed

+4098
-1661
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
**/CommunityToolkit.*

.github/workflows/benchmarks.yml

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
name: Benchmarks
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
tags:
8+
- '*'
9+
paths-ignore:
10+
- README.md
11+
pull_request:
12+
branches:
13+
- '*'
14+
15+
env:
16+
LATEST_NET_VERSION: '9.0.x'
17+
PathToCommunityToolkitAnalyzersBenchmarkCsproj: 'src/CommunityToolkit.Maui.Analyzers.Benchmarks/CommunityToolkit.Maui.Analyzers.Benchmarks.csproj'
18+
19+
jobs:
20+
run_benchmarks:
21+
name: Run Benchmarks
22+
runs-on: ${{ matrix.os }}
23+
strategy:
24+
matrix:
25+
os: [windows-latest, macos-15]
26+
27+
steps:
28+
- name: Checkout code
29+
uses: actions/checkout@main
30+
31+
- uses: maxim-lobanov/setup-xcode@v1
32+
if: runner.os == 'macOS'
33+
with:
34+
xcode-version: latest-stable
35+
36+
- name: Install Latest Version of .NET, v${{ env.LATEST_NET_VERSION }}
37+
uses: actions/setup-dotnet@v4
38+
with:
39+
dotnet-version: ${{ env.LATEST_NET_VERSION }}
40+
dotnet-quality: 'ga'
41+
42+
- name: Install .NET MAUI Workload
43+
run: |
44+
dotnet workload install maui
45+
dotnet workload update
46+
47+
- name: Install Tizen Workload
48+
run: |
49+
Invoke-WebRequest 'https://raw.githubusercontent.com/Samsung/Tizen.NET/main/workload/scripts/workload-install.ps1' -OutFile 'workload-install.ps1'
50+
.\workload-install.ps1
51+
shell: pwsh
52+
53+
- name: Display dotnet info
54+
run: dotnet --info
55+
56+
- name: Run Benchmarks
57+
run: dotnet run --project ${{ env.PathToCommunityToolkitAnalyzersBenchmarkCsproj }} -c Release -- -a ${{ runner.temp }}
58+
59+
- name: Publish Benchmarks
60+
if: runner.os == 'Windows'
61+
uses: actions/upload-artifact@v4
62+
with:
63+
name: Benchmarks
64+
path: |
65+
${{ runner.temp }}/**/*.md

.github/workflows/dotnet-build.yml

Lines changed: 320 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,320 @@
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

Comments
 (0)