From a33374c1e43af2bfd00f8d2985067618fff5dbbd Mon Sep 17 00:00:00 2001 From: ahall Date: Fri, 13 Nov 2026 11:03:11 +0000 Subject: [PATCH 1/4] ci: drop workload set pin and use default Xcode for iOS/Mac Catalyst sample builds Remove the WorkloadSetVersion 10.0.107 pin and the Select Xcode step from the MAUI, Avalonia and Uno macOS jobs so they build against the newest iOS SDK pack and the macos-26 image's default Xcode. Update the explanatory comments accordingly. Closes #627 --- .../build-samples-todoapp-avalonia.yml | 40 +++++-------------- .../workflows/build-samples-todoapp-maui.yml | 40 +++++-------------- .../workflows/build-samples-todoapp-uno.yml | 39 +++++------------- 3 files changed, 27 insertions(+), 92 deletions(-) diff --git a/.github/workflows/build-samples-todoapp-avalonia.yml b/.github/workflows/build-samples-todoapp-avalonia.yml index c9a5c07..a11dd47 100644 --- a/.github/workflows/build-samples-todoapp-avalonia.yml +++ b/.github/workflows/build-samples-todoapp-avalonia.yml @@ -90,48 +90,26 @@ jobs: # underneath us when the macos-latest label moves. macos-26 replaced the previous # (older) macOS image because macOS arm64 jobs on that image repeatedly failed to acquire # a runner due to capacity constraints (see - # https://github.com/CommunityToolkit/Datasync/issues/622). macos-26's default Xcode - # (26.6) is newer than what the pinned iOS SDK pack requires (see - # WorkloadSetVersion below), so this job explicitly selects an older Xcode that is - # already installed on the image (see the "Select Xcode" step) to match. See - # https://github.com/CommunityToolkit/Datasync/issues/529. Revisit this whole job - # once we deliberately drop the workload set pin and move to a newer Xcode. + # https://github.com/CommunityToolkit/Datasync/issues/622). + # + # This job deliberately uses the image's default Xcode (no `xcode-select` step) and + # installs the newest published workload set (no `--version` pin), so the iOS SDK pack + # and Xcode move forward together as the runner image is updated. See + # https://github.com/CommunityToolkit/Datasync/issues/627. Because nothing is pinned, + # builds are less reproducible: if a new workload set or image Xcode breaks this job, + # investigate the failure rather than assuming a flaky runner. runs-on: macos-26 - env: - # `dotnet workload install ios` alone always resolves the newest published - # Microsoft.iOS.Sdk.net10.0_* pack. As of workload set 10.0.108, that's 26.5.10284, - # which requires Xcode 26.5 (installed on macos-26, but not the Xcode this job selects). - # Pinning to 10.0.107 (the last set before the iOS/MacCatalyst/macOS/tvOS manifest moved - # to the 26.4/26.5 pack line; see workload-set history for package id - # Microsoft.NET.Workloads.10.0.100 on nuget.org) resolves 26.2.10233 instead, which - # requires Xcode 26.3 - installed (non-default) on macos-26 as of image 20261026.0455.2 - # (see the "Select Xcode" step below). This also keeps other manifests (e.g. Android) at - # their latest versions. `--version` pins only this job's `dotnet workload install` - # invocation and the `restore`/`build` steps that follow it in the same runner - it's - # intentionally not a repo-wide global.json pin, which would force every `dotnet` - # invocation in the whole repo (including samples with no workload dependency at all) - # to require this exact workload version to already be installed, breaking them on a - # fresh runner. - WorkloadSetVersion: '10.0.107' - RequiredXcodeVersion: '26.3' steps: - name: Checkout Repository uses: actions/checkout@v7 - - name: Select Xcode ${{ env.RequiredXcodeVersion }} - # macos-26 defaults to Xcode 26.6, which doesn't match what the pinned iOS - # workload (see WorkloadSetVersion above) requires. Xcode 26.3 is already installed - # on the image, just not selected by default - so switch to it explicitly rather - # than installing anything extra. - run: sudo xcode-select -s /Applications/Xcode_${{ env.RequiredXcodeVersion }}.app - - name: Setup .NET uses: actions/setup-dotnet@v6 with: dotnet-version: ${{ env.DOTNET_VERSION }} - name: Install iOS workload - run: dotnet workload install ios --version ${{ env.WorkloadSetVersion }} + run: dotnet workload install ios - name: Restore iOS project run: dotnet restore ${{ env.iOSProjectFile }} diff --git a/.github/workflows/build-samples-todoapp-maui.yml b/.github/workflows/build-samples-todoapp-maui.yml index 8b79b90..8674459 100644 --- a/.github/workflows/build-samples-todoapp-maui.yml +++ b/.github/workflows/build-samples-todoapp-maui.yml @@ -61,48 +61,26 @@ jobs: # underneath us when the macos-latest label moves. macos-26 replaced the previous # (older) macOS image because macOS arm64 jobs on that image repeatedly failed to acquire # a runner due to capacity constraints (see - # https://github.com/CommunityToolkit/Datasync/issues/622). macos-26's default Xcode - # (26.6) is newer than what the pinned iOS SDK pack requires (see - # WorkloadSetVersion below), so this job explicitly selects an older Xcode that is - # already installed on the image (see the "Select Xcode" step) to match. See - # https://github.com/CommunityToolkit/Datasync/issues/529. Revisit this whole job - # once we deliberately drop the workload set pin and move to a newer Xcode. + # https://github.com/CommunityToolkit/Datasync/issues/622). + # + # This job deliberately uses the image's default Xcode (no `xcode-select` step) and + # installs the newest published workload set (no `--version` pin), so the iOS SDK pack + # and Xcode move forward together as the runner image is updated. See + # https://github.com/CommunityToolkit/Datasync/issues/627. Because nothing is pinned, + # builds are less reproducible: if a new workload set or image Xcode breaks this job, + # investigate the failure rather than assuming a flaky runner. runs-on: macos-26 - env: - # `dotnet workload install maui-ios` alone always resolves the newest published - # Microsoft.iOS.Sdk.net10.0_* pack. As of workload set 10.0.108, that's 26.5.10284, - # which requires Xcode 26.5 (installed on macos-26, but not the Xcode this job selects). - # Pinning to 10.0.107 (the last set before the iOS/MacCatalyst/macOS/tvOS manifest moved - # to the 26.4/26.5 pack line; see workload-set history for package id - # Microsoft.NET.Workloads.10.0.100 on nuget.org) resolves 26.2.10233 instead, which - # requires Xcode 26.3 - installed (non-default) on macos-26 as of image 20261026.0455.2 - # (see the "Select Xcode" step below). This also keeps other manifests (e.g. MAUI, - # Android) at their latest versions. `--version` pins only this job's - # `dotnet workload install` invocation and the `restore`/`build` steps that follow it in - # the same runner - it's intentionally not a repo-wide global.json pin, which would - # force every `dotnet` invocation in the whole repo (including samples with no workload - # dependency at all) to require this exact workload version to already be installed, - # breaking them on a fresh runner. - WorkloadSetVersion: '10.0.107' - RequiredXcodeVersion: '26.3' steps: - name: Checkout Repository uses: actions/checkout@v7 - - name: Select Xcode ${{ env.RequiredXcodeVersion }} - # macos-26 defaults to Xcode 26.6, which doesn't match what the pinned iOS - # workload (see WorkloadSetVersion above) requires. Xcode 26.3 is already installed - # on the image, just not selected by default - so switch to it explicitly rather - # than installing anything extra. - run: sudo xcode-select -s /Applications/Xcode_${{ env.RequiredXcodeVersion }}.app - - name: Setup .NET uses: actions/setup-dotnet@v6 with: dotnet-version: ${{ env.DOTNET_VERSION }} - name: Install MAUI iOS workload - run: dotnet workload install maui-ios --version ${{ env.WorkloadSetVersion }} + run: dotnet workload install maui-ios - name: Restore MAUI project (iOS TFM only) run: dotnet restore ${{ env.MauiProjectFile }} -p:TargetFramework=${{ env.iOSTargetFramework }} diff --git a/.github/workflows/build-samples-todoapp-uno.yml b/.github/workflows/build-samples-todoapp-uno.yml index 24cbd79..6e88782 100644 --- a/.github/workflows/build-samples-todoapp-uno.yml +++ b/.github/workflows/build-samples-todoapp-uno.yml @@ -62,47 +62,26 @@ jobs: # underneath us when the macos-latest label moves. macos-26 replaced the previous # (older) macOS image because macOS arm64 jobs on that image repeatedly failed to acquire # a runner due to capacity constraints (see - # https://github.com/CommunityToolkit/Datasync/issues/622). macos-26's default Xcode - # (26.6) is newer than what the pinned iOS SDK pack requires (see - # WorkloadSetVersion below), so this job explicitly selects an older Xcode that is - # already installed on the image (see the "Select Xcode" step) to match. See - # https://github.com/CommunityToolkit/Datasync/issues/529 and #559. Revisit this whole job - # once we deliberately drop the workload set pin and move to a newer Xcode. + # https://github.com/CommunityToolkit/Datasync/issues/622). + # + # This job deliberately uses the image's default Xcode (no `xcode-select` step) and + # installs the newest published workload set (no `--version` pin), so the iOS SDK pack + # and Xcode move forward together as the runner image is updated. See + # https://github.com/CommunityToolkit/Datasync/issues/627. Because nothing is pinned, + # builds are less reproducible: if a new workload set or image Xcode breaks this job, + # investigate the failure rather than assuming a flaky runner. runs-on: macos-26 - env: - # `dotnet workload install ios maccatalyst` alone always resolves the newest published - # Microsoft.iOS.Sdk.net10.0_* pack. As of workload set 10.0.108, that's 26.5.10284, - # which requires Xcode 26.5 (installed on macos-26, but not the Xcode this job selects). - # Pinning to 10.0.107 (the last set before the iOS/MacCatalyst/macOS/tvOS manifest moved - # to the 26.4/26.5 pack line; see workload-set history for package id - # Microsoft.NET.Workloads.10.0.100 on nuget.org) resolves 26.2.10233 instead, which - # requires Xcode 26.3 - installed (non-default) on macos-26 as of image 20261026.0455.2 - # (see the "Select Xcode" step below). `--version` pins only this job's - # `dotnet workload install` invocation and the `restore`/`build` steps that follow it in - # the same runner - it's intentionally not a repo-wide global.json pin, which would - # force every `dotnet` invocation in the whole repo (including samples with no workload - # dependency at all) to require this exact workload version to already be installed, - # breaking them on a fresh runner. - WorkloadSetVersion: '10.0.107' - RequiredXcodeVersion: '26.3' steps: - name: Checkout Repository uses: actions/checkout@v7 - - name: Select Xcode ${{ env.RequiredXcodeVersion }} - # macos-26 defaults to Xcode 26.6, which doesn't match what the pinned iOS/Mac - # Catalyst workload (see WorkloadSetVersion above) requires. Xcode 26.3 is already - # installed on the image, just not selected by default - so switch to it explicitly - # rather than installing anything extra. - run: sudo xcode-select -s /Applications/Xcode_${{ env.RequiredXcodeVersion }}.app - - name: Setup .NET uses: actions/setup-dotnet@v6 with: dotnet-version: ${{ env.DOTNET_VERSION }} - name: Install iOS and Mac Catalyst workloads - run: dotnet workload install ios maccatalyst --version ${{ env.WorkloadSetVersion }} + run: dotnet workload install ios maccatalyst - name: Restore Uno project (iOS TFM only) run: dotnet restore ${{ env.UnoProjectFile }} -p:TargetFramework=${{ env.iOSTargetFramework }} From e6678427de527095173ab890a493af14e86b46ed Mon Sep 17 00:00:00 2001 From: ahall Date: Fri, 13 Nov 2026 11:08:45 +0000 Subject: [PATCH 2/4] ci: pin iOS sample workload set to 10.0.112 with Xcode 26.5 An unpinned workload set now resolves 10.0.115, whose iOS SDK pack (27.2) requires Xcode 27.2, which is not on macos-26. Pin to 10.0.112, the newest set on the 26.5 pack line, and select the matching Xcode 26.5. --- .../build-samples-todoapp-avalonia.yml | 34 +++++++++++++++---- .../workflows/build-samples-todoapp-maui.yml | 34 +++++++++++++++---- .../workflows/build-samples-todoapp-uno.yml | 34 +++++++++++++++---- 3 files changed, 81 insertions(+), 21 deletions(-) diff --git a/.github/workflows/build-samples-todoapp-avalonia.yml b/.github/workflows/build-samples-todoapp-avalonia.yml index a11dd47..ea23e9a 100644 --- a/.github/workflows/build-samples-todoapp-avalonia.yml +++ b/.github/workflows/build-samples-todoapp-avalonia.yml @@ -92,24 +92,44 @@ jobs: # a runner due to capacity constraints (see # https://github.com/CommunityToolkit/Datasync/issues/622). # - # This job deliberately uses the image's default Xcode (no `xcode-select` step) and - # installs the newest published workload set (no `--version` pin), so the iOS SDK pack - # and Xcode move forward together as the runner image is updated. See - # https://github.com/CommunityToolkit/Datasync/issues/627. Because nothing is pinned, - # builds are less reproducible: if a new workload set or image Xcode breaks this job, - # investigate the failure rather than assuming a flaky runner. + # The workload set and Xcode are pinned together (see WorkloadSetVersion and + # RequiredXcodeVersion below). See https://github.com/CommunityToolkit/Datasync/issues/627. runs-on: macos-26 + env: + # `dotnet workload install ios` with no `--version` resolves the newest published + # workload set, which can move to an iOS SDK pack that needs an Xcode that isn't on the + # runner image yet. As of workload set 10.0.115 that's Microsoft.iOS.Sdk.net10.0_27.2, which + # requires Xcode 27.2 (macos-26 only has Xcode 26.x), and the build fails with + # "This version of .NET for iOS requires Xcode 27.2". Workload set 10.0.112 is the newest + # set on the 26.5 pack line (Microsoft.iOS.Sdk.net10.0_26.5, 26.5.10318), which requires + # Xcode 26.5 - installed (non-default) on macos-26 (see the "Select Xcode" step below). + # Sets 10.0.113 and later move to the 27.x pack line. `--version` pins only this job's + # `dotnet workload install` invocation and the `restore`/`build` steps that follow it in + # the same runner - it's intentionally not a repo-wide global.json pin, which would + # force every `dotnet` invocation in the whole repo (including samples with no workload + # dependency at all) to require this exact workload version to already be installed, + # breaking them on a fresh runner. Move to the 27.x pack line together with Xcode 27 once + # it is available on a standard runner image. + WorkloadSetVersion: '10.0.112' + RequiredXcodeVersion: '26.5' steps: - name: Checkout Repository uses: actions/checkout@v7 + - name: Select Xcode ${{ env.RequiredXcodeVersion }} + # macos-26 defaults to Xcode 26.6, which isn't the Xcode the pinned iOS workload (see + # WorkloadSetVersion above) is built for. Xcode 26.5 is already installed on the image, + # just not selected by default - so switch to it explicitly rather than installing + # anything extra. + run: sudo xcode-select -s /Applications/Xcode_${{ env.RequiredXcodeVersion }}.app + - name: Setup .NET uses: actions/setup-dotnet@v6 with: dotnet-version: ${{ env.DOTNET_VERSION }} - name: Install iOS workload - run: dotnet workload install ios + run: dotnet workload install ios --version ${{ env.WorkloadSetVersion }} - name: Restore iOS project run: dotnet restore ${{ env.iOSProjectFile }} diff --git a/.github/workflows/build-samples-todoapp-maui.yml b/.github/workflows/build-samples-todoapp-maui.yml index 8674459..5774e63 100644 --- a/.github/workflows/build-samples-todoapp-maui.yml +++ b/.github/workflows/build-samples-todoapp-maui.yml @@ -63,24 +63,44 @@ jobs: # a runner due to capacity constraints (see # https://github.com/CommunityToolkit/Datasync/issues/622). # - # This job deliberately uses the image's default Xcode (no `xcode-select` step) and - # installs the newest published workload set (no `--version` pin), so the iOS SDK pack - # and Xcode move forward together as the runner image is updated. See - # https://github.com/CommunityToolkit/Datasync/issues/627. Because nothing is pinned, - # builds are less reproducible: if a new workload set or image Xcode breaks this job, - # investigate the failure rather than assuming a flaky runner. + # The workload set and Xcode are pinned together (see WorkloadSetVersion and + # RequiredXcodeVersion below). See https://github.com/CommunityToolkit/Datasync/issues/627. runs-on: macos-26 + env: + # `dotnet workload install maui-ios` with no `--version` resolves the newest published + # workload set, which can move to an iOS SDK pack that needs an Xcode that isn't on the + # runner image yet. As of workload set 10.0.115 that's Microsoft.iOS.Sdk.net10.0_27.2, which + # requires Xcode 27.2 (macos-26 only has Xcode 26.x), and the build fails with + # "This version of .NET for iOS requires Xcode 27.2". Workload set 10.0.112 is the newest + # set on the 26.5 pack line (Microsoft.iOS.Sdk.net10.0_26.5, 26.5.10318), which requires + # Xcode 26.5 - installed (non-default) on macos-26 (see the "Select Xcode" step below). + # Sets 10.0.113 and later move to the 27.x pack line. `--version` pins only this job's + # `dotnet workload install` invocation and the `restore`/`build` steps that follow it in + # the same runner - it's intentionally not a repo-wide global.json pin, which would + # force every `dotnet` invocation in the whole repo (including samples with no workload + # dependency at all) to require this exact workload version to already be installed, + # breaking them on a fresh runner. Move to the 27.x pack line together with Xcode 27 once + # it is available on a standard runner image. + WorkloadSetVersion: '10.0.112' + RequiredXcodeVersion: '26.5' steps: - name: Checkout Repository uses: actions/checkout@v7 + - name: Select Xcode ${{ env.RequiredXcodeVersion }} + # macos-26 defaults to Xcode 26.6, which isn't the Xcode the pinned iOS workload (see + # WorkloadSetVersion above) is built for. Xcode 26.5 is already installed on the image, + # just not selected by default - so switch to it explicitly rather than installing + # anything extra. + run: sudo xcode-select -s /Applications/Xcode_${{ env.RequiredXcodeVersion }}.app + - name: Setup .NET uses: actions/setup-dotnet@v6 with: dotnet-version: ${{ env.DOTNET_VERSION }} - name: Install MAUI iOS workload - run: dotnet workload install maui-ios + run: dotnet workload install maui-ios --version ${{ env.WorkloadSetVersion }} - name: Restore MAUI project (iOS TFM only) run: dotnet restore ${{ env.MauiProjectFile }} -p:TargetFramework=${{ env.iOSTargetFramework }} diff --git a/.github/workflows/build-samples-todoapp-uno.yml b/.github/workflows/build-samples-todoapp-uno.yml index 6e88782..688df99 100644 --- a/.github/workflows/build-samples-todoapp-uno.yml +++ b/.github/workflows/build-samples-todoapp-uno.yml @@ -64,24 +64,44 @@ jobs: # a runner due to capacity constraints (see # https://github.com/CommunityToolkit/Datasync/issues/622). # - # This job deliberately uses the image's default Xcode (no `xcode-select` step) and - # installs the newest published workload set (no `--version` pin), so the iOS SDK pack - # and Xcode move forward together as the runner image is updated. See - # https://github.com/CommunityToolkit/Datasync/issues/627. Because nothing is pinned, - # builds are less reproducible: if a new workload set or image Xcode breaks this job, - # investigate the failure rather than assuming a flaky runner. + # The workload set and Xcode are pinned together (see WorkloadSetVersion and + # RequiredXcodeVersion below). See https://github.com/CommunityToolkit/Datasync/issues/627. runs-on: macos-26 + env: + # `dotnet workload install ios maccatalyst` with no `--version` resolves the newest published + # workload set, which can move to an iOS SDK pack that needs an Xcode that isn't on the + # runner image yet. As of workload set 10.0.115 that's Microsoft.iOS.Sdk.net10.0_27.2, which + # requires Xcode 27.2 (macos-26 only has Xcode 26.x), and the build fails with + # "This version of .NET for iOS requires Xcode 27.2". Workload set 10.0.112 is the newest + # set on the 26.5 pack line (Microsoft.iOS.Sdk.net10.0_26.5, 26.5.10318), which requires + # Xcode 26.5 - installed (non-default) on macos-26 (see the "Select Xcode" step below). + # Sets 10.0.113 and later move to the 27.x pack line. `--version` pins only this job's + # `dotnet workload install` invocation and the `restore`/`build` steps that follow it in + # the same runner - it's intentionally not a repo-wide global.json pin, which would + # force every `dotnet` invocation in the whole repo (including samples with no workload + # dependency at all) to require this exact workload version to already be installed, + # breaking them on a fresh runner. Move to the 27.x pack line together with Xcode 27 once + # it is available on a standard runner image. + WorkloadSetVersion: '10.0.112' + RequiredXcodeVersion: '26.5' steps: - name: Checkout Repository uses: actions/checkout@v7 + - name: Select Xcode ${{ env.RequiredXcodeVersion }} + # macos-26 defaults to Xcode 26.6, which isn't the Xcode the pinned iOS workload (see + # WorkloadSetVersion above) is built for. Xcode 26.5 is already installed on the image, + # just not selected by default - so switch to it explicitly rather than installing + # anything extra. + run: sudo xcode-select -s /Applications/Xcode_${{ env.RequiredXcodeVersion }}.app + - name: Setup .NET uses: actions/setup-dotnet@v6 with: dotnet-version: ${{ env.DOTNET_VERSION }} - name: Install iOS and Mac Catalyst workloads - run: dotnet workload install ios maccatalyst + run: dotnet workload install ios maccatalyst --version ${{ env.WorkloadSetVersion }} - name: Restore Uno project (iOS TFM only) run: dotnet restore ${{ env.UnoProjectFile }} -p:TargetFramework=${{ env.iOSTargetFramework }} From 1c2edb548241d6d26db7c2309436bd5c7f38eeb7 Mon Sep 17 00:00:00 2001 From: ahall Date: Fri, 13 Nov 2026 11:11:00 +0000 Subject: [PATCH 3/4] ci: select Xcode 26.6 for the 10.0.112 iOS workload set iOS SDK pack 26.5.10318 (workload set 10.0.112) requires Xcode 26.6, not 26.5. Select 26.6 explicitly and update the comments. --- .../workflows/build-samples-todoapp-avalonia.yml | 14 +++++++------- .github/workflows/build-samples-todoapp-maui.yml | 14 +++++++------- .github/workflows/build-samples-todoapp-uno.yml | 14 +++++++------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/.github/workflows/build-samples-todoapp-avalonia.yml b/.github/workflows/build-samples-todoapp-avalonia.yml index ea23e9a..f349da5 100644 --- a/.github/workflows/build-samples-todoapp-avalonia.yml +++ b/.github/workflows/build-samples-todoapp-avalonia.yml @@ -101,8 +101,9 @@ jobs: # runner image yet. As of workload set 10.0.115 that's Microsoft.iOS.Sdk.net10.0_27.2, which # requires Xcode 27.2 (macos-26 only has Xcode 26.x), and the build fails with # "This version of .NET for iOS requires Xcode 27.2". Workload set 10.0.112 is the newest - # set on the 26.5 pack line (Microsoft.iOS.Sdk.net10.0_26.5, 26.5.10318), which requires - # Xcode 26.5 - installed (non-default) on macos-26 (see the "Select Xcode" step below). + # set on the 26.x pack line (Microsoft.iOS.Sdk.net10.0_26.5, 26.5.10318), which requires + # Xcode 26.6 - the macos-26 default today, selected explicitly (see the "Select Xcode" step + # below) so a future change of the image default does not silently break the pairing. # Sets 10.0.113 and later move to the 27.x pack line. `--version` pins only this job's # `dotnet workload install` invocation and the `restore`/`build` steps that follow it in # the same runner - it's intentionally not a repo-wide global.json pin, which would @@ -111,16 +112,15 @@ jobs: # breaking them on a fresh runner. Move to the 27.x pack line together with Xcode 27 once # it is available on a standard runner image. WorkloadSetVersion: '10.0.112' - RequiredXcodeVersion: '26.5' + RequiredXcodeVersion: '26.6' steps: - name: Checkout Repository uses: actions/checkout@v7 - name: Select Xcode ${{ env.RequiredXcodeVersion }} - # macos-26 defaults to Xcode 26.6, which isn't the Xcode the pinned iOS workload (see - # WorkloadSetVersion above) is built for. Xcode 26.5 is already installed on the image, - # just not selected by default - so switch to it explicitly rather than installing - # anything extra. + # Pin the Xcode the pinned iOS workload (see WorkloadSetVersion above) requires, rather + # than relying on the image default. Xcode 26.6 is already installed on the image, so + # this just makes the selection explicit instead of installing anything extra. run: sudo xcode-select -s /Applications/Xcode_${{ env.RequiredXcodeVersion }}.app - name: Setup .NET diff --git a/.github/workflows/build-samples-todoapp-maui.yml b/.github/workflows/build-samples-todoapp-maui.yml index 5774e63..d940752 100644 --- a/.github/workflows/build-samples-todoapp-maui.yml +++ b/.github/workflows/build-samples-todoapp-maui.yml @@ -72,8 +72,9 @@ jobs: # runner image yet. As of workload set 10.0.115 that's Microsoft.iOS.Sdk.net10.0_27.2, which # requires Xcode 27.2 (macos-26 only has Xcode 26.x), and the build fails with # "This version of .NET for iOS requires Xcode 27.2". Workload set 10.0.112 is the newest - # set on the 26.5 pack line (Microsoft.iOS.Sdk.net10.0_26.5, 26.5.10318), which requires - # Xcode 26.5 - installed (non-default) on macos-26 (see the "Select Xcode" step below). + # set on the 26.x pack line (Microsoft.iOS.Sdk.net10.0_26.5, 26.5.10318), which requires + # Xcode 26.6 - the macos-26 default today, selected explicitly (see the "Select Xcode" step + # below) so a future change of the image default does not silently break the pairing. # Sets 10.0.113 and later move to the 27.x pack line. `--version` pins only this job's # `dotnet workload install` invocation and the `restore`/`build` steps that follow it in # the same runner - it's intentionally not a repo-wide global.json pin, which would @@ -82,16 +83,15 @@ jobs: # breaking them on a fresh runner. Move to the 27.x pack line together with Xcode 27 once # it is available on a standard runner image. WorkloadSetVersion: '10.0.112' - RequiredXcodeVersion: '26.5' + RequiredXcodeVersion: '26.6' steps: - name: Checkout Repository uses: actions/checkout@v7 - name: Select Xcode ${{ env.RequiredXcodeVersion }} - # macos-26 defaults to Xcode 26.6, which isn't the Xcode the pinned iOS workload (see - # WorkloadSetVersion above) is built for. Xcode 26.5 is already installed on the image, - # just not selected by default - so switch to it explicitly rather than installing - # anything extra. + # Pin the Xcode the pinned iOS workload (see WorkloadSetVersion above) requires, rather + # than relying on the image default. Xcode 26.6 is already installed on the image, so + # this just makes the selection explicit instead of installing anything extra. run: sudo xcode-select -s /Applications/Xcode_${{ env.RequiredXcodeVersion }}.app - name: Setup .NET diff --git a/.github/workflows/build-samples-todoapp-uno.yml b/.github/workflows/build-samples-todoapp-uno.yml index 688df99..690965f 100644 --- a/.github/workflows/build-samples-todoapp-uno.yml +++ b/.github/workflows/build-samples-todoapp-uno.yml @@ -73,8 +73,9 @@ jobs: # runner image yet. As of workload set 10.0.115 that's Microsoft.iOS.Sdk.net10.0_27.2, which # requires Xcode 27.2 (macos-26 only has Xcode 26.x), and the build fails with # "This version of .NET for iOS requires Xcode 27.2". Workload set 10.0.112 is the newest - # set on the 26.5 pack line (Microsoft.iOS.Sdk.net10.0_26.5, 26.5.10318), which requires - # Xcode 26.5 - installed (non-default) on macos-26 (see the "Select Xcode" step below). + # set on the 26.x pack line (Microsoft.iOS.Sdk.net10.0_26.5, 26.5.10318), which requires + # Xcode 26.6 - the macos-26 default today, selected explicitly (see the "Select Xcode" step + # below) so a future change of the image default does not silently break the pairing. # Sets 10.0.113 and later move to the 27.x pack line. `--version` pins only this job's # `dotnet workload install` invocation and the `restore`/`build` steps that follow it in # the same runner - it's intentionally not a repo-wide global.json pin, which would @@ -83,16 +84,15 @@ jobs: # breaking them on a fresh runner. Move to the 27.x pack line together with Xcode 27 once # it is available on a standard runner image. WorkloadSetVersion: '10.0.112' - RequiredXcodeVersion: '26.5' + RequiredXcodeVersion: '26.6' steps: - name: Checkout Repository uses: actions/checkout@v7 - name: Select Xcode ${{ env.RequiredXcodeVersion }} - # macos-26 defaults to Xcode 26.6, which isn't the Xcode the pinned iOS workload (see - # WorkloadSetVersion above) is built for. Xcode 26.5 is already installed on the image, - # just not selected by default - so switch to it explicitly rather than installing - # anything extra. + # Pin the Xcode the pinned iOS workload (see WorkloadSetVersion above) requires, rather + # than relying on the image default. Xcode 26.6 is already installed on the image, so + # this just makes the selection explicit instead of installing anything extra. run: sudo xcode-select -s /Applications/Xcode_${{ env.RequiredXcodeVersion }}.app - name: Setup .NET From 2f42b35a3f67abd7aed14097ea473d2808b63029 Mon Sep 17 00:00:00 2001 From: ahall Date: Fri, 13 Nov 2026 11:23:25 +0000 Subject: [PATCH 4/4] ci: pin .NET SDK to 10.0 for the Uno browserwasm sample build The ubuntu-26.04 image 20261111.196 added .NET SDK 11.0.100, so the dotnet muxer selected it and 'dotnet workload install wasm-tools' installed the .NET 11 workload set. Uno.Wasm.Bootstrap then failed the net10.0-browserwasm build with UNOWA0001. Pin the SDK to 10.0 via global.json for this job only. --- .github/workflows/build-samples-todoapp-uno.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/workflows/build-samples-todoapp-uno.yml b/.github/workflows/build-samples-todoapp-uno.yml index 690965f..8d31561 100644 --- a/.github/workflows/build-samples-todoapp-uno.yml +++ b/.github/workflows/build-samples-todoapp-uno.yml @@ -156,6 +156,20 @@ jobs: with: dotnet-version: ${{ env.DOTNET_VERSION }} + - name: Pin .NET SDK to 10.0 + # The ubuntu-26.04 image (20261111.196 and later) ships .NET SDK 11.0.100 alongside the + # 10.0.x SDKs, and the `dotnet` muxer picks the highest installed SDK. That made + # `dotnet workload install wasm-tools` install the .NET 11 workload set, which doesn't + # satisfy the net10.0-browserwasm head (Uno.Wasm.Bootstrap failed with UNOWA0001: + # "wasm-tools workload could not be located"). Pin the SDK to the 10.0 band that + # setup-dotnet installed. This edits only the runner's throwaway checkout of the root + # global.json (it keeps the existing test runner settings), and only for this job. + run: | + jq '. + {sdk: {version: "10.0.100", rollForward: "latestFeature", allowPrerelease: false}}' global.json > global.json.tmp + mv global.json.tmp global.json + cat global.json + dotnet --version + - name: Install WebAssembly build tools workload run: dotnet workload install wasm-tools