ci: pin iOS workload set + Xcode version for todoapp-avalonia/maui iOS builds - #530

Merged
adrianhall merged 4 commits into
CommunityToolkit:mainfrom
adrianhall:issues/529
Jul 10, 2026
Merged

ci: pin iOS workload set + Xcode version for todoapp-avalonia/maui iOS builds#530
adrianhall merged 4 commits into
CommunityToolkit:mainfrom
adrianhall:issues/529

Conversation

@adrianhall

Copy link
Copy Markdown
Collaborator

Summary

Fixes#529.

todoapp-avalonia / ios (and, latently, todoapp-maui / ios) call dotnet workload install ios / maui-ios unpinned, which 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 - not installed on either the macOS-15 or macOS-26 runner images currently backing the macos-latest label during its migration window (see actions/runner-images#14167, rollout through 2026-07-15), causing the

This version of .NET for iOS (26.5.10284) requires Xcode 26.5. The current version of Xcode is 16.4.

failure from #529. This also explains why the failure looked flaky: the same commit passed and failed todoapp-avalonia / ios ~26 minutes apart on main/a PR run of #528, purely because macos-latest landed on a different underlying image each time.

What changed

Both todoapp-avalonia / ios and todoapp-maui / ios jobs now:

  1. Pin runs-on to macos-15 (instead of macos-latest) so the Xcode version available on the runner is deterministic during the macos-latest migration window, rather than randomly landing on macOS-15 or macOS-26.
  2. Explicitly select Xcode 26.3 via sudo xcode-select -s /Applications/Xcode_26.3.app. Xcode 26.3 is already installed on the macos-15 image, just not the default (16.4).
  3. Pin the iOS workload install to workload set 10.0.107 via dotnet workload install ios/maui-ios --version 10.0.107, scoped only to that job's env/steps (not a repo-wide global.json). 10.0.107 is the last workload set before the iOS/MacCatalyst/macOS/tvOS manifest moved to the 26.4/26.5 pack line, resolving to Microsoft.iOS.Sdk.net10.0_26.2 (26.2.10233), which requires exactly Xcode 26.3 - matching step 2. It keeps other manifests (Android, MAUI) at their latest versions, so those jobs are unaffected.

Why not a per-project TargetPlatformVersion/ValidateXcodeVersion override, or a repo-root global.json?

  • A per-project MSBuild property fix would need to be applied individually to TodoApp.Avalonia.iOS.csproj, TodoApp.MAUI.csproj, and (once #506 is resolved) TodoApp.Uno.csproj - and wouldn't protect any future mobile sample from hitting the same issue.
  • A repo-root global.json pinning sdk.workloadVersion was tried first, but it forces everydotnet build/restore in the whole repo (via Microsoft.NET.Sdk.ImportWorkloads.props) to require that exact workload version to already be installed - even for projects with zero workload dependency. This broke todoapp-mvc, todoapp-blazor-wasm, datasync-server, etc. on a fresh runner (confirmed via a real run). dotnet workload install ... --version scoped to just the ios job's own steps avoids this entirely.
  • Checked back through every published workload set since 10.0.100 (2025-11-11): none currently declare an iOS _RecommendedXcodeVersion anywhere near 16.4 (they range from 26.0 through 26.5), so pinning the workload version alone isn't sufficient - the explicit xcode-select step is required too. This was confirmed by first testing the workload pin alone, which failed the same way against 26.2.10233 requiring Xcode 26.3.

Validation

Ran the full build-samples.yml via workflow_dispatch on this branch twice to confirm the fix is deterministic, not a flaky pass:

Both android jobs (unpinned, unaffected by the ios-job-scoped changes) passed in both runs, confirming no regression there.

todoapp-uno is intentionally left untouched - it's not wired into build-samples.yml yet (blocked by #506), and will need the same treatment when it's re-enabled.

Follow-up

Revisit both ios jobs once we deliberately upgrade to a newer, Xcode-26-compatible workload set (both the runs-on: macos-15 pin and the xcode-select step are called out inline as things to revisit then).

ahalland others added 4 commits July 10, 2026 09:54
…ch (CommunityToolkit#529)
todoapp-avalonia / ios and todoapp-maui / ios both call 'dotnet workload
install ios' / 'maui-ios' unpinned (loose-manifests mode), which 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 -
not installed on either macOS-15 or macOS-26 runner images currently
backing the macos-latest label during its migration window (see
actions/runner-images#14167), causing intermittent
'This version of .NET for iOS (26.5.10284) requires Xcode 26.5' build
failures.
- Add repo-root global.json pinning sdk.workloadVersion to 10.0.107,
the last workload set before the iOS/MacCatalyst/macOS/tvOS manifest
moved to the 26.4/26.5 pack line, while keeping the MAUI (10.0.20)
and Android (36.1.53) manifests at their latest versions. This
applies automatically to every 'dotnet workload install' call in CI
(including the currently-disabled todoapp-uno / ios-maccatalyst job,
once CommunityToolkit#506 is resolved and it's wired back in) with no per-job or
per-project edits needed.
- Pin the todoapp-avalonia / ios and todoapp-maui / ios jobs to
macos-15 (instead of macos-latest) as defense-in-depth so the Xcode
version these jobs build against is deterministic during the
migration window, rather than randomly landing on macos-15 or
macos-26.
…ommunityToolkit#529)
The repo-root global.json approach broke every other sample build
(todoapp-mvc, todoapp-blazor-wasm, datasync-server, etc.) on a fresh
runner with:
error MSB4242: SDK Resolver Failure: ... Workload version 10.0.107,
which was specified in .../global.json, was not found. Run
'dotnet workload restore' to install this workload version.
Microsoft.NET.Sdk.ImportWorkloads.props enforces the pinned workload
version for every 'dotnet build'/'restore' invocation whose cwd falls
under a global.json declaring sdk.workloadVersion - regardless of
whether that specific project has any workload dependency - and it's
not satisfied lazily; it must already be installed. Confirmed via a
real workflow_dispatch run (see
https://github.com/adrianhall/CommunityToolkit-Datasync/actions/runs/29081276609).
Replaced with 'dotnet workload install ios/maui-ios --version 10.0.107'
scoped to just the ios job's env/steps in each affected workflow. This
pins only that job's install (and the restore/build steps that follow
it on the same runner), leaving every other job - including the
android jobs in the same workflows - on unpinned/latest workload
resolution.
…mmunityToolkit#529)
Testing the --version 10.0.107 workload pin alone (previous commit) still
failed on macos-15:
error: This version of .NET for iOS (26.2.10233) requires Xcode 26.3.
The current version of Xcode is 16.4.
Confirmed via a real workflow_dispatch run
(https://github.com/adrianhall/CommunityToolkit-Datasync/actions/runs/29081474204)
that both todoapp-avalonia/ios and todoapp-maui/ios resolve to the SAME
newest-available pack within the pinned workload set (26.2.10233,
_RecommendedXcodeVersion=26.3 per Microsoft.iOS.Sdk.Versions.props),
not an older Xcode-16.4-compatible one - there is no currently-published
net10.0 iOS SDK pack (checked back to workload set 10.0.100, published
2025-11-11) whose _RecommendedXcodeVersion is anywhere close to 16.4, so
no workload-version pin alone can satisfy macos-15's default Xcode.
Per actions/runner-images' macos-15 Readme, Xcode 26.3 IS already
installed on the image (just not the default) at
/Applications/Xcode_26.3.app, alongside 26.0.1/26.1.1/26.2. Added a
'sudo xcode-select -s' step to explicitly select it, matching the
26.2.10233 pack's requirement, instead of installing anything extra.
@adrianhall
adrianhall merged commit 398792f into CommunityToolkit:mainJul 10, 2026
15 checks passed
@adrianhall
adrianhall deleted the issues/529 branch July 10, 2026 10:12
adrianhall added a commit that referenced this pull request Jul 11, 2026
… ios-maccatalyst build (#561)
* docs: add AGENTS.md guidance for testing samples via workflow_dispatch
Samples require platform SDKs/workloads not guaranteed to be available
locally. Document the proper validation approach: push the branch to
the local fork and trigger the Build Samples workflow via
workflow_dispatch, then poll for results. Note that a full run across
all samples takes approximately 6 minutes end-to-end, so agents can
set correct timing expectations when polling.
* ci: pin iOS/Mac Catalyst workload set + Xcode version for todoapp-uno ios-maccatalyst build
Fixes#559.
Applies the same fix as #530 (todoapp-avalonia/maui ios jobs) to
todoapp-uno's ios-maccatalyst job: dotnet workload install ios
maccatalyst was unpinned, resolving the newest Microsoft.iOS.Sdk
pack (26.5.10284, requiring Xcode 26.5) which isn't available on
macos-latest (currently Xcode 16.4). Pin runs-on to macos-15,
explicitly select the already-installed Xcode 26.3, and pin the
workload install to workload set 10.0.107 (resolves to
Microsoft.iOS.Sdk.net10.0_26.2.10233, which requires Xcode 26.3).
---------
Co-authored-by: ahall <ahall@cloudflare.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

CI: todoapp-avalonia / ios build fails - .NET for iOS 26.5 requires Xcode 26.5, macos-latest only has Xcode 16.4

1 participant

@adrianhall
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

ci: pin iOS workload set + Xcode version for todoapp-avalonia/maui iOS builds - #530

Merged
adrianhall merged 4 commits into
CommunityToolkit:mainfrom
adrianhall:issues/529
Jul 10, 2026
Merged

ci: pin iOS workload set + Xcode version for todoapp-avalonia/maui iOS builds#530
adrianhall merged 4 commits into
CommunityToolkit:mainfrom
adrianhall:issues/529

Conversation

@adrianhall

Copy link
Copy Markdown
Collaborator

Summary

Fixes#529.

todoapp-avalonia / ios (and, latently, todoapp-maui / ios) call dotnet workload install ios / maui-ios unpinned, which 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 - not installed on either the macOS-15 or macOS-26 runner images currently backing the macos-latest label during its migration window (see actions/runner-images#14167, rollout through 2026-07-15), causing the

This version of .NET for iOS (26.5.10284) requires Xcode 26.5. The current version of Xcode is 16.4.

failure from #529. This also explains why the failure looked flaky: the same commit passed and failed todoapp-avalonia / ios ~26 minutes apart on main/a PR run of #528, purely because macos-latest landed on a different underlying image each time.

What changed

Both todoapp-avalonia / ios and todoapp-maui / ios jobs now:

  1. Pin runs-on to macos-15 (instead of macos-latest) so the Xcode version available on the runner is deterministic during the macos-latest migration window, rather than randomly landing on macOS-15 or macOS-26.
  2. Explicitly select Xcode 26.3 via sudo xcode-select -s /Applications/Xcode_26.3.app. Xcode 26.3 is already installed on the macos-15 image, just not the default (16.4).
  3. Pin the iOS workload install to workload set 10.0.107 via dotnet workload install ios/maui-ios --version 10.0.107, scoped only to that job's env/steps (not a repo-wide global.json). 10.0.107 is the last workload set before the iOS/MacCatalyst/macOS/tvOS manifest moved to the 26.4/26.5 pack line, resolving to Microsoft.iOS.Sdk.net10.0_26.2 (26.2.10233), which requires exactly Xcode 26.3 - matching step 2. It keeps other manifests (Android, MAUI) at their latest versions, so those jobs are unaffected.

Why not a per-project TargetPlatformVersion/ValidateXcodeVersion override, or a repo-root global.json?

  • A per-project MSBuild property fix would need to be applied individually to TodoApp.Avalonia.iOS.csproj, TodoApp.MAUI.csproj, and (once #506 is resolved) TodoApp.Uno.csproj - and wouldn't protect any future mobile sample from hitting the same issue.
  • A repo-root global.json pinning sdk.workloadVersion was tried first, but it forces everydotnet build/restore in the whole repo (via Microsoft.NET.Sdk.ImportWorkloads.props) to require that exact workload version to already be installed - even for projects with zero workload dependency. This broke todoapp-mvc, todoapp-blazor-wasm, datasync-server, etc. on a fresh runner (confirmed via a real run). dotnet workload install ... --version scoped to just the ios job's own steps avoids this entirely.
  • Checked back through every published workload set since 10.0.100 (2025-11-11): none currently declare an iOS _RecommendedXcodeVersion anywhere near 16.4 (they range from 26.0 through 26.5), so pinning the workload version alone isn't sufficient - the explicit xcode-select step is required too. This was confirmed by first testing the workload pin alone, which failed the same way against 26.2.10233 requiring Xcode 26.3.

Validation

Ran the full build-samples.yml via workflow_dispatch on this branch twice to confirm the fix is deterministic, not a flaky pass:

Both android jobs (unpinned, unaffected by the ios-job-scoped changes) passed in both runs, confirming no regression there.

todoapp-uno is intentionally left untouched - it's not wired into build-samples.yml yet (blocked by #506), and will need the same treatment when it's re-enabled.

Follow-up

Revisit both ios jobs once we deliberately upgrade to a newer, Xcode-26-compatible workload set (both the runs-on: macos-15 pin and the xcode-select step are called out inline as things to revisit then).

ahalland others added 4 commits July 10, 2026 09:54
…ch (CommunityToolkit#529)
todoapp-avalonia / ios and todoapp-maui / ios both call 'dotnet workload
install ios' / 'maui-ios' unpinned (loose-manifests mode), which 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 -
not installed on either macOS-15 or macOS-26 runner images currently
backing the macos-latest label during its migration window (see
actions/runner-images#14167), causing intermittent
'This version of .NET for iOS (26.5.10284) requires Xcode 26.5' build
failures.
- Add repo-root global.json pinning sdk.workloadVersion to 10.0.107,
the last workload set before the iOS/MacCatalyst/macOS/tvOS manifest
moved to the 26.4/26.5 pack line, while keeping the MAUI (10.0.20)
and Android (36.1.53) manifests at their latest versions. This
applies automatically to every 'dotnet workload install' call in CI
(including the currently-disabled todoapp-uno / ios-maccatalyst job,
once CommunityToolkit#506 is resolved and it's wired back in) with no per-job or
per-project edits needed.
- Pin the todoapp-avalonia / ios and todoapp-maui / ios jobs to
macos-15 (instead of macos-latest) as defense-in-depth so the Xcode
version these jobs build against is deterministic during the
migration window, rather than randomly landing on macos-15 or
macos-26.
…ommunityToolkit#529)
The repo-root global.json approach broke every other sample build
(todoapp-mvc, todoapp-blazor-wasm, datasync-server, etc.) on a fresh
runner with:
error MSB4242: SDK Resolver Failure: ... Workload version 10.0.107,
which was specified in .../global.json, was not found. Run
'dotnet workload restore' to install this workload version.
Microsoft.NET.Sdk.ImportWorkloads.props enforces the pinned workload
version for every 'dotnet build'/'restore' invocation whose cwd falls
under a global.json declaring sdk.workloadVersion - regardless of
whether that specific project has any workload dependency - and it's
not satisfied lazily; it must already be installed. Confirmed via a
real workflow_dispatch run (see
https://github.com/adrianhall/CommunityToolkit-Datasync/actions/runs/29081276609).
Replaced with 'dotnet workload install ios/maui-ios --version 10.0.107'
scoped to just the ios job's env/steps in each affected workflow. This
pins only that job's install (and the restore/build steps that follow
it on the same runner), leaving every other job - including the
android jobs in the same workflows - on unpinned/latest workload
resolution.
…mmunityToolkit#529)
Testing the --version 10.0.107 workload pin alone (previous commit) still
failed on macos-15:
error: This version of .NET for iOS (26.2.10233) requires Xcode 26.3.
The current version of Xcode is 16.4.
Confirmed via a real workflow_dispatch run
(https://github.com/adrianhall/CommunityToolkit-Datasync/actions/runs/29081474204)
that both todoapp-avalonia/ios and todoapp-maui/ios resolve to the SAME
newest-available pack within the pinned workload set (26.2.10233,
_RecommendedXcodeVersion=26.3 per Microsoft.iOS.Sdk.Versions.props),
not an older Xcode-16.4-compatible one - there is no currently-published
net10.0 iOS SDK pack (checked back to workload set 10.0.100, published
2025-11-11) whose _RecommendedXcodeVersion is anywhere close to 16.4, so
no workload-version pin alone can satisfy macos-15's default Xcode.
Per actions/runner-images' macos-15 Readme, Xcode 26.3 IS already
installed on the image (just not the default) at
/Applications/Xcode_26.3.app, alongside 26.0.1/26.1.1/26.2. Added a
'sudo xcode-select -s' step to explicitly select it, matching the
26.2.10233 pack's requirement, instead of installing anything extra.
@adrianhall
adrianhall merged commit 398792f into CommunityToolkit:mainJul 10, 2026
15 checks passed
@adrianhall
adrianhall deleted the issues/529 branch July 10, 2026 10:12
adrianhall added a commit that referenced this pull request Jul 11, 2026
… ios-maccatalyst build (#561)
* docs: add AGENTS.md guidance for testing samples via workflow_dispatch
Samples require platform SDKs/workloads not guaranteed to be available
locally. Document the proper validation approach: push the branch to
the local fork and trigger the Build Samples workflow via
workflow_dispatch, then poll for results. Note that a full run across
all samples takes approximately 6 minutes end-to-end, so agents can
set correct timing expectations when polling.
* ci: pin iOS/Mac Catalyst workload set + Xcode version for todoapp-uno ios-maccatalyst build
Fixes#559.
Applies the same fix as #530 (todoapp-avalonia/maui ios jobs) to
todoapp-uno's ios-maccatalyst job: dotnet workload install ios
maccatalyst was unpinned, resolving the newest Microsoft.iOS.Sdk
pack (26.5.10284, requiring Xcode 26.5) which isn't available on
macos-latest (currently Xcode 16.4). Pin runs-on to macos-15,
explicitly select the already-installed Xcode 26.3, and pin the
workload install to workload set 10.0.107 (resolves to
Microsoft.iOS.Sdk.net10.0_26.2.10233, which requires Xcode 26.3).
---------
Co-authored-by: ahall <ahall@cloudflare.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

CI: todoapp-avalonia / ios build fails - .NET for iOS 26.5 requires Xcode 26.5, macos-latest only has Xcode 16.4

1 participant

@adrianhall
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ci: pin iOS workload set + Xcode version for todoapp-avalonia/maui iOS builds - #530

Merged
adrianhall merged 4 commits into
CommunityToolkit:mainfrom
adrianhall:issues/529
Jul 10, 2026
Merged

ci: pin iOS workload set + Xcode version for todoapp-avalonia/maui iOS builds#530
adrianhall merged 4 commits into
CommunityToolkit:mainfrom
adrianhall:issues/529

Conversation

@adrianhall

Copy link
Copy Markdown
Collaborator

Summary

Fixes#529.

todoapp-avalonia / ios (and, latently, todoapp-maui / ios) call dotnet workload install ios / maui-ios unpinned, which 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 - not installed on either the macOS-15 or macOS-26 runner images currently backing the macos-latest label during its migration window (see actions/runner-images#14167, rollout through 2026-07-15), causing the

This version of .NET for iOS (26.5.10284) requires Xcode 26.5. The current version of Xcode is 16.4.

failure from #529. This also explains why the failure looked flaky: the same commit passed and failed todoapp-avalonia / ios ~26 minutes apart on main/a PR run of #528, purely because macos-latest landed on a different underlying image each time.

What changed

Both todoapp-avalonia / ios and todoapp-maui / ios jobs now:

  1. Pin runs-on to macos-15 (instead of macos-latest) so the Xcode version available on the runner is deterministic during the macos-latest migration window, rather than randomly landing on macOS-15 or macOS-26.
  2. Explicitly select Xcode 26.3 via sudo xcode-select -s /Applications/Xcode_26.3.app. Xcode 26.3 is already installed on the macos-15 image, just not the default (16.4).
  3. Pin the iOS workload install to workload set 10.0.107 via dotnet workload install ios/maui-ios --version 10.0.107, scoped only to that job's env/steps (not a repo-wide global.json). 10.0.107 is the last workload set before the iOS/MacCatalyst/macOS/tvOS manifest moved to the 26.4/26.5 pack line, resolving to Microsoft.iOS.Sdk.net10.0_26.2 (26.2.10233), which requires exactly Xcode 26.3 - matching step 2. It keeps other manifests (Android, MAUI) at their latest versions, so those jobs are unaffected.

Why not a per-project TargetPlatformVersion/ValidateXcodeVersion override, or a repo-root global.json?

  • A per-project MSBuild property fix would need to be applied individually to TodoApp.Avalonia.iOS.csproj, TodoApp.MAUI.csproj, and (once #506 is resolved) TodoApp.Uno.csproj - and wouldn't protect any future mobile sample from hitting the same issue.
  • A repo-root global.json pinning sdk.workloadVersion was tried first, but it forces everydotnet build/restore in the whole repo (via Microsoft.NET.Sdk.ImportWorkloads.props) to require that exact workload version to already be installed - even for projects with zero workload dependency. This broke todoapp-mvc, todoapp-blazor-wasm, datasync-server, etc. on a fresh runner (confirmed via a real run). dotnet workload install ... --version scoped to just the ios job's own steps avoids this entirely.
  • Checked back through every published workload set since 10.0.100 (2025-11-11): none currently declare an iOS _RecommendedXcodeVersion anywhere near 16.4 (they range from 26.0 through 26.5), so pinning the workload version alone isn't sufficient - the explicit xcode-select step is required too. This was confirmed by first testing the workload pin alone, which failed the same way against 26.2.10233 requiring Xcode 26.3.

Validation

Ran the full build-samples.yml via workflow_dispatch on this branch twice to confirm the fix is deterministic, not a flaky pass:

Both android jobs (unpinned, unaffected by the ios-job-scoped changes) passed in both runs, confirming no regression there.

todoapp-uno is intentionally left untouched - it's not wired into build-samples.yml yet (blocked by #506), and will need the same treatment when it's re-enabled.

Follow-up

Revisit both ios jobs once we deliberately upgrade to a newer, Xcode-26-compatible workload set (both the runs-on: macos-15 pin and the xcode-select step are called out inline as things to revisit then).

ahalland others added 4 commits July 10, 2026 09:54
…ch (CommunityToolkit#529)
todoapp-avalonia / ios and todoapp-maui / ios both call 'dotnet workload
install ios' / 'maui-ios' unpinned (loose-manifests mode), which 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 -
not installed on either macOS-15 or macOS-26 runner images currently
backing the macos-latest label during its migration window (see
actions/runner-images#14167), causing intermittent
'This version of .NET for iOS (26.5.10284) requires Xcode 26.5' build
failures.
- Add repo-root global.json pinning sdk.workloadVersion to 10.0.107,
the last workload set before the iOS/MacCatalyst/macOS/tvOS manifest
moved to the 26.4/26.5 pack line, while keeping the MAUI (10.0.20)
and Android (36.1.53) manifests at their latest versions. This
applies automatically to every 'dotnet workload install' call in CI
(including the currently-disabled todoapp-uno / ios-maccatalyst job,
once CommunityToolkit#506 is resolved and it's wired back in) with no per-job or
per-project edits needed.
- Pin the todoapp-avalonia / ios and todoapp-maui / ios jobs to
macos-15 (instead of macos-latest) as defense-in-depth so the Xcode
version these jobs build against is deterministic during the
migration window, rather than randomly landing on macos-15 or
macos-26.
…ommunityToolkit#529)
The repo-root global.json approach broke every other sample build
(todoapp-mvc, todoapp-blazor-wasm, datasync-server, etc.) on a fresh
runner with:
error MSB4242: SDK Resolver Failure: ... Workload version 10.0.107,
which was specified in .../global.json, was not found. Run
'dotnet workload restore' to install this workload version.
Microsoft.NET.Sdk.ImportWorkloads.props enforces the pinned workload
version for every 'dotnet build'/'restore' invocation whose cwd falls
under a global.json declaring sdk.workloadVersion - regardless of
whether that specific project has any workload dependency - and it's
not satisfied lazily; it must already be installed. Confirmed via a
real workflow_dispatch run (see
https://github.com/adrianhall/CommunityToolkit-Datasync/actions/runs/29081276609).
Replaced with 'dotnet workload install ios/maui-ios --version 10.0.107'
scoped to just the ios job's env/steps in each affected workflow. This
pins only that job's install (and the restore/build steps that follow
it on the same runner), leaving every other job - including the
android jobs in the same workflows - on unpinned/latest workload
resolution.
…mmunityToolkit#529)
Testing the --version 10.0.107 workload pin alone (previous commit) still
failed on macos-15:
error: This version of .NET for iOS (26.2.10233) requires Xcode 26.3.
The current version of Xcode is 16.4.
Confirmed via a real workflow_dispatch run
(https://github.com/adrianhall/CommunityToolkit-Datasync/actions/runs/29081474204)
that both todoapp-avalonia/ios and todoapp-maui/ios resolve to the SAME
newest-available pack within the pinned workload set (26.2.10233,
_RecommendedXcodeVersion=26.3 per Microsoft.iOS.Sdk.Versions.props),
not an older Xcode-16.4-compatible one - there is no currently-published
net10.0 iOS SDK pack (checked back to workload set 10.0.100, published
2025-11-11) whose _RecommendedXcodeVersion is anywhere close to 16.4, so
no workload-version pin alone can satisfy macos-15's default Xcode.
Per actions/runner-images' macos-15 Readme, Xcode 26.3 IS already
installed on the image (just not the default) at
/Applications/Xcode_26.3.app, alongside 26.0.1/26.1.1/26.2. Added a
'sudo xcode-select -s' step to explicitly select it, matching the
26.2.10233 pack's requirement, instead of installing anything extra.
@adrianhall
adrianhall merged commit 398792f into CommunityToolkit:mainJul 10, 2026
15 checks passed
@adrianhall
adrianhall deleted the issues/529 branch July 10, 2026 10:12
adrianhall added a commit that referenced this pull request Jul 11, 2026
… ios-maccatalyst build (#561)
* docs: add AGENTS.md guidance for testing samples via workflow_dispatch
Samples require platform SDKs/workloads not guaranteed to be available
locally. Document the proper validation approach: push the branch to
the local fork and trigger the Build Samples workflow via
workflow_dispatch, then poll for results. Note that a full run across
all samples takes approximately 6 minutes end-to-end, so agents can
set correct timing expectations when polling.
* ci: pin iOS/Mac Catalyst workload set + Xcode version for todoapp-uno ios-maccatalyst build
Fixes#559.
Applies the same fix as #530 (todoapp-avalonia/maui ios jobs) to
todoapp-uno's ios-maccatalyst job: dotnet workload install ios
maccatalyst was unpinned, resolving the newest Microsoft.iOS.Sdk
pack (26.5.10284, requiring Xcode 26.5) which isn't available on
macos-latest (currently Xcode 16.4). Pin runs-on to macos-15,
explicitly select the already-installed Xcode 26.3, and pin the
workload install to workload set 10.0.107 (resolves to
Microsoft.iOS.Sdk.net10.0_26.2.10233, which requires Xcode 26.3).
---------
Co-authored-by: ahall <ahall@cloudflare.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

CI: todoapp-avalonia / ios build fails - .NET for iOS 26.5 requires Xcode 26.5, macos-latest only has Xcode 16.4

1 participant

@adrianhall
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ci: pin iOS workload set + Xcode version for todoapp-avalonia/maui iOS builds - #530

Merged
adrianhall merged 4 commits into
CommunityToolkit:mainfrom
adrianhall:issues/529
Jul 10, 2026
Merged

ci: pin iOS workload set + Xcode version for todoapp-avalonia/maui iOS builds#530
adrianhall merged 4 commits into
CommunityToolkit:mainfrom
adrianhall:issues/529

Conversation

@adrianhall

Copy link
Copy Markdown
Collaborator

Summary

Fixes#529.

todoapp-avalonia / ios (and, latently, todoapp-maui / ios) call dotnet workload install ios / maui-ios unpinned, which 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 - not installed on either the macOS-15 or macOS-26 runner images currently backing the macos-latest label during its migration window (see actions/runner-images#14167, rollout through 2026-07-15), causing the

This version of .NET for iOS (26.5.10284) requires Xcode 26.5. The current version of Xcode is 16.4.

failure from #529. This also explains why the failure looked flaky: the same commit passed and failed todoapp-avalonia / ios ~26 minutes apart on main/a PR run of #528, purely because macos-latest landed on a different underlying image each time.

What changed

Both todoapp-avalonia / ios and todoapp-maui / ios jobs now:

  1. Pin runs-on to macos-15 (instead of macos-latest) so the Xcode version available on the runner is deterministic during the macos-latest migration window, rather than randomly landing on macOS-15 or macOS-26.
  2. Explicitly select Xcode 26.3 via sudo xcode-select -s /Applications/Xcode_26.3.app. Xcode 26.3 is already installed on the macos-15 image, just not the default (16.4).
  3. Pin the iOS workload install to workload set 10.0.107 via dotnet workload install ios/maui-ios --version 10.0.107, scoped only to that job's env/steps (not a repo-wide global.json). 10.0.107 is the last workload set before the iOS/MacCatalyst/macOS/tvOS manifest moved to the 26.4/26.5 pack line, resolving to Microsoft.iOS.Sdk.net10.0_26.2 (26.2.10233), which requires exactly Xcode 26.3 - matching step 2. It keeps other manifests (Android, MAUI) at their latest versions, so those jobs are unaffected.

Why not a per-project TargetPlatformVersion/ValidateXcodeVersion override, or a repo-root global.json?

  • A per-project MSBuild property fix would need to be applied individually to TodoApp.Avalonia.iOS.csproj, TodoApp.MAUI.csproj, and (once #506 is resolved) TodoApp.Uno.csproj - and wouldn't protect any future mobile sample from hitting the same issue.
  • A repo-root global.json pinning sdk.workloadVersion was tried first, but it forces everydotnet build/restore in the whole repo (via Microsoft.NET.Sdk.ImportWorkloads.props) to require that exact workload version to already be installed - even for projects with zero workload dependency. This broke todoapp-mvc, todoapp-blazor-wasm, datasync-server, etc. on a fresh runner (confirmed via a real run). dotnet workload install ... --version scoped to just the ios job's own steps avoids this entirely.
  • Checked back through every published workload set since 10.0.100 (2025-11-11): none currently declare an iOS _RecommendedXcodeVersion anywhere near 16.4 (they range from 26.0 through 26.5), so pinning the workload version alone isn't sufficient - the explicit xcode-select step is required too. This was confirmed by first testing the workload pin alone, which failed the same way against 26.2.10233 requiring Xcode 26.3.

Validation

Ran the full build-samples.yml via workflow_dispatch on this branch twice to confirm the fix is deterministic, not a flaky pass:

Both android jobs (unpinned, unaffected by the ios-job-scoped changes) passed in both runs, confirming no regression there.

todoapp-uno is intentionally left untouched - it's not wired into build-samples.yml yet (blocked by #506), and will need the same treatment when it's re-enabled.

Follow-up

Revisit both ios jobs once we deliberately upgrade to a newer, Xcode-26-compatible workload set (both the runs-on: macos-15 pin and the xcode-select step are called out inline as things to revisit then).

ahalland others added 4 commits July 10, 2026 09:54
…ch (CommunityToolkit#529)
todoapp-avalonia / ios and todoapp-maui / ios both call 'dotnet workload
install ios' / 'maui-ios' unpinned (loose-manifests mode), which 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 -
not installed on either macOS-15 or macOS-26 runner images currently
backing the macos-latest label during its migration window (see
actions/runner-images#14167), causing intermittent
'This version of .NET for iOS (26.5.10284) requires Xcode 26.5' build
failures.
- Add repo-root global.json pinning sdk.workloadVersion to 10.0.107,
the last workload set before the iOS/MacCatalyst/macOS/tvOS manifest
moved to the 26.4/26.5 pack line, while keeping the MAUI (10.0.20)
and Android (36.1.53) manifests at their latest versions. This
applies automatically to every 'dotnet workload install' call in CI
(including the currently-disabled todoapp-uno / ios-maccatalyst job,
once CommunityToolkit#506 is resolved and it's wired back in) with no per-job or
per-project edits needed.
- Pin the todoapp-avalonia / ios and todoapp-maui / ios jobs to
macos-15 (instead of macos-latest) as defense-in-depth so the Xcode
version these jobs build against is deterministic during the
migration window, rather than randomly landing on macos-15 or
macos-26.
…ommunityToolkit#529)
The repo-root global.json approach broke every other sample build
(todoapp-mvc, todoapp-blazor-wasm, datasync-server, etc.) on a fresh
runner with:
error MSB4242: SDK Resolver Failure: ... Workload version 10.0.107,
which was specified in .../global.json, was not found. Run
'dotnet workload restore' to install this workload version.
Microsoft.NET.Sdk.ImportWorkloads.props enforces the pinned workload
version for every 'dotnet build'/'restore' invocation whose cwd falls
under a global.json declaring sdk.workloadVersion - regardless of
whether that specific project has any workload dependency - and it's
not satisfied lazily; it must already be installed. Confirmed via a
real workflow_dispatch run (see
https://github.com/adrianhall/CommunityToolkit-Datasync/actions/runs/29081276609).
Replaced with 'dotnet workload install ios/maui-ios --version 10.0.107'
scoped to just the ios job's env/steps in each affected workflow. This
pins only that job's install (and the restore/build steps that follow
it on the same runner), leaving every other job - including the
android jobs in the same workflows - on unpinned/latest workload
resolution.
…mmunityToolkit#529)
Testing the --version 10.0.107 workload pin alone (previous commit) still
failed on macos-15:
error: This version of .NET for iOS (26.2.10233) requires Xcode 26.3.
The current version of Xcode is 16.4.
Confirmed via a real workflow_dispatch run
(https://github.com/adrianhall/CommunityToolkit-Datasync/actions/runs/29081474204)
that both todoapp-avalonia/ios and todoapp-maui/ios resolve to the SAME
newest-available pack within the pinned workload set (26.2.10233,
_RecommendedXcodeVersion=26.3 per Microsoft.iOS.Sdk.Versions.props),
not an older Xcode-16.4-compatible one - there is no currently-published
net10.0 iOS SDK pack (checked back to workload set 10.0.100, published
2025-11-11) whose _RecommendedXcodeVersion is anywhere close to 16.4, so
no workload-version pin alone can satisfy macos-15's default Xcode.
Per actions/runner-images' macos-15 Readme, Xcode 26.3 IS already
installed on the image (just not the default) at
/Applications/Xcode_26.3.app, alongside 26.0.1/26.1.1/26.2. Added a
'sudo xcode-select -s' step to explicitly select it, matching the
26.2.10233 pack's requirement, instead of installing anything extra.
@adrianhall
adrianhall merged commit 398792f into CommunityToolkit:mainJul 10, 2026
15 checks passed
@adrianhall
adrianhall deleted the issues/529 branch July 10, 2026 10:12
adrianhall added a commit that referenced this pull request Jul 11, 2026
… ios-maccatalyst build (#561)
* docs: add AGENTS.md guidance for testing samples via workflow_dispatch
Samples require platform SDKs/workloads not guaranteed to be available
locally. Document the proper validation approach: push the branch to
the local fork and trigger the Build Samples workflow via
workflow_dispatch, then poll for results. Note that a full run across
all samples takes approximately 6 minutes end-to-end, so agents can
set correct timing expectations when polling.
* ci: pin iOS/Mac Catalyst workload set + Xcode version for todoapp-uno ios-maccatalyst build
Fixes#559.
Applies the same fix as #530 (todoapp-avalonia/maui ios jobs) to
todoapp-uno's ios-maccatalyst job: dotnet workload install ios
maccatalyst was unpinned, resolving the newest Microsoft.iOS.Sdk
pack (26.5.10284, requiring Xcode 26.5) which isn't available on
macos-latest (currently Xcode 16.4). Pin runs-on to macos-15,
explicitly select the already-installed Xcode 26.3, and pin the
workload install to workload set 10.0.107 (resolves to
Microsoft.iOS.Sdk.net10.0_26.2.10233, which requires Xcode 26.3).
---------
Co-authored-by: ahall <ahall@cloudflare.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

CI: todoapp-avalonia / ios build fails - .NET for iOS 26.5 requires Xcode 26.5, macos-latest only has Xcode 16.4

1 participant

@adrianhall
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

ci: pin iOS workload set + Xcode version for todoapp-avalonia/maui iOS builds - #530

Merged
adrianhall merged 4 commits into
CommunityToolkit:mainfrom
adrianhall:issues/529
Jul 10, 2026
Merged

ci: pin iOS workload set + Xcode version for todoapp-avalonia/maui iOS builds#530
adrianhall merged 4 commits into
CommunityToolkit:mainfrom
adrianhall:issues/529

Conversation

@adrianhall

Copy link
Copy Markdown
Collaborator

Summary

Fixes#529.

todoapp-avalonia / ios (and, latently, todoapp-maui / ios) call dotnet workload install ios / maui-ios unpinned, which 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 - not installed on either the macOS-15 or macOS-26 runner images currently backing the macos-latest label during its migration window (see actions/runner-images#14167, rollout through 2026-07-15), causing the

This version of .NET for iOS (26.5.10284) requires Xcode 26.5. The current version of Xcode is 16.4.

failure from #529. This also explains why the failure looked flaky: the same commit passed and failed todoapp-avalonia / ios ~26 minutes apart on main/a PR run of #528, purely because macos-latest landed on a different underlying image each time.

What changed

Both todoapp-avalonia / ios and todoapp-maui / ios jobs now:

  1. Pin runs-on to macos-15 (instead of macos-latest) so the Xcode version available on the runner is deterministic during the macos-latest migration window, rather than randomly landing on macOS-15 or macOS-26.
  2. Explicitly select Xcode 26.3 via sudo xcode-select -s /Applications/Xcode_26.3.app. Xcode 26.3 is already installed on the macos-15 image, just not the default (16.4).
  3. Pin the iOS workload install to workload set 10.0.107 via dotnet workload install ios/maui-ios --version 10.0.107, scoped only to that job's env/steps (not a repo-wide global.json). 10.0.107 is the last workload set before the iOS/MacCatalyst/macOS/tvOS manifest moved to the 26.4/26.5 pack line, resolving to Microsoft.iOS.Sdk.net10.0_26.2 (26.2.10233), which requires exactly Xcode 26.3 - matching step 2. It keeps other manifests (Android, MAUI) at their latest versions, so those jobs are unaffected.

Why not a per-project TargetPlatformVersion/ValidateXcodeVersion override, or a repo-root global.json?

  • A per-project MSBuild property fix would need to be applied individually to TodoApp.Avalonia.iOS.csproj, TodoApp.MAUI.csproj, and (once #506 is resolved) TodoApp.Uno.csproj - and wouldn't protect any future mobile sample from hitting the same issue.
  • A repo-root global.json pinning sdk.workloadVersion was tried first, but it forces everydotnet build/restore in the whole repo (via Microsoft.NET.Sdk.ImportWorkloads.props) to require that exact workload version to already be installed - even for projects with zero workload dependency. This broke todoapp-mvc, todoapp-blazor-wasm, datasync-server, etc. on a fresh runner (confirmed via a real run). dotnet workload install ... --version scoped to just the ios job's own steps avoids this entirely.
  • Checked back through every published workload set since 10.0.100 (2025-11-11): none currently declare an iOS _RecommendedXcodeVersion anywhere near 16.4 (they range from 26.0 through 26.5), so pinning the workload version alone isn't sufficient - the explicit xcode-select step is required too. This was confirmed by first testing the workload pin alone, which failed the same way against 26.2.10233 requiring Xcode 26.3.

Validation

Ran the full build-samples.yml via workflow_dispatch on this branch twice to confirm the fix is deterministic, not a flaky pass:

Both android jobs (unpinned, unaffected by the ios-job-scoped changes) passed in both runs, confirming no regression there.

todoapp-uno is intentionally left untouched - it's not wired into build-samples.yml yet (blocked by #506), and will need the same treatment when it's re-enabled.

Follow-up

Revisit both ios jobs once we deliberately upgrade to a newer, Xcode-26-compatible workload set (both the runs-on: macos-15 pin and the xcode-select step are called out inline as things to revisit then).

ahalland others added 4 commits July 10, 2026 09:54
…ch (CommunityToolkit#529)
todoapp-avalonia / ios and todoapp-maui / ios both call 'dotnet workload
install ios' / 'maui-ios' unpinned (loose-manifests mode), which 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 -
not installed on either macOS-15 or macOS-26 runner images currently
backing the macos-latest label during its migration window (see
actions/runner-images#14167), causing intermittent
'This version of .NET for iOS (26.5.10284) requires Xcode 26.5' build
failures.
- Add repo-root global.json pinning sdk.workloadVersion to 10.0.107,
the last workload set before the iOS/MacCatalyst/macOS/tvOS manifest
moved to the 26.4/26.5 pack line, while keeping the MAUI (10.0.20)
and Android (36.1.53) manifests at their latest versions. This
applies automatically to every 'dotnet workload install' call in CI
(including the currently-disabled todoapp-uno / ios-maccatalyst job,
once CommunityToolkit#506 is resolved and it's wired back in) with no per-job or
per-project edits needed.
- Pin the todoapp-avalonia / ios and todoapp-maui / ios jobs to
macos-15 (instead of macos-latest) as defense-in-depth so the Xcode
version these jobs build against is deterministic during the
migration window, rather than randomly landing on macos-15 or
macos-26.
…ommunityToolkit#529)
The repo-root global.json approach broke every other sample build
(todoapp-mvc, todoapp-blazor-wasm, datasync-server, etc.) on a fresh
runner with:
error MSB4242: SDK Resolver Failure: ... Workload version 10.0.107,
which was specified in .../global.json, was not found. Run
'dotnet workload restore' to install this workload version.
Microsoft.NET.Sdk.ImportWorkloads.props enforces the pinned workload
version for every 'dotnet build'/'restore' invocation whose cwd falls
under a global.json declaring sdk.workloadVersion - regardless of
whether that specific project has any workload dependency - and it's
not satisfied lazily; it must already be installed. Confirmed via a
real workflow_dispatch run (see
https://github.com/adrianhall/CommunityToolkit-Datasync/actions/runs/29081276609).
Replaced with 'dotnet workload install ios/maui-ios --version 10.0.107'
scoped to just the ios job's env/steps in each affected workflow. This
pins only that job's install (and the restore/build steps that follow
it on the same runner), leaving every other job - including the
android jobs in the same workflows - on unpinned/latest workload
resolution.
…mmunityToolkit#529)
Testing the --version 10.0.107 workload pin alone (previous commit) still
failed on macos-15:
error: This version of .NET for iOS (26.2.10233) requires Xcode 26.3.
The current version of Xcode is 16.4.
Confirmed via a real workflow_dispatch run
(https://github.com/adrianhall/CommunityToolkit-Datasync/actions/runs/29081474204)
that both todoapp-avalonia/ios and todoapp-maui/ios resolve to the SAME
newest-available pack within the pinned workload set (26.2.10233,
_RecommendedXcodeVersion=26.3 per Microsoft.iOS.Sdk.Versions.props),
not an older Xcode-16.4-compatible one - there is no currently-published
net10.0 iOS SDK pack (checked back to workload set 10.0.100, published
2025-11-11) whose _RecommendedXcodeVersion is anywhere close to 16.4, so
no workload-version pin alone can satisfy macos-15's default Xcode.
Per actions/runner-images' macos-15 Readme, Xcode 26.3 IS already
installed on the image (just not the default) at
/Applications/Xcode_26.3.app, alongside 26.0.1/26.1.1/26.2. Added a
'sudo xcode-select -s' step to explicitly select it, matching the
26.2.10233 pack's requirement, instead of installing anything extra.
@adrianhall
adrianhall merged commit 398792f into CommunityToolkit:mainJul 10, 2026
15 checks passed
@adrianhall
adrianhall deleted the issues/529 branch July 10, 2026 10:12
adrianhall added a commit that referenced this pull request Jul 11, 2026
… ios-maccatalyst build (#561)
* docs: add AGENTS.md guidance for testing samples via workflow_dispatch
Samples require platform SDKs/workloads not guaranteed to be available
locally. Document the proper validation approach: push the branch to
the local fork and trigger the Build Samples workflow via
workflow_dispatch, then poll for results. Note that a full run across
all samples takes approximately 6 minutes end-to-end, so agents can
set correct timing expectations when polling.
* ci: pin iOS/Mac Catalyst workload set + Xcode version for todoapp-uno ios-maccatalyst build
Fixes#559.
Applies the same fix as #530 (todoapp-avalonia/maui ios jobs) to
todoapp-uno's ios-maccatalyst job: dotnet workload install ios
maccatalyst was unpinned, resolving the newest Microsoft.iOS.Sdk
pack (26.5.10284, requiring Xcode 26.5) which isn't available on
macos-latest (currently Xcode 16.4). Pin runs-on to macos-15,
explicitly select the already-installed Xcode 26.3, and pin the
workload install to workload set 10.0.107 (resolves to
Microsoft.iOS.Sdk.net10.0_26.2.10233, which requires Xcode 26.3).
---------
Co-authored-by: ahall <ahall@cloudflare.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

CI: todoapp-avalonia / ios build fails - .NET for iOS 26.5 requires Xcode 26.5, macos-latest only has Xcode 16.4

1 participant

@adrianhall
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ci: pin iOS workload set + Xcode version for todoapp-avalonia/maui iOS builds - #530

Merged
adrianhall merged 4 commits into
CommunityToolkit:mainfrom
adrianhall:issues/529
Jul 10, 2026
Merged

ci: pin iOS workload set + Xcode version for todoapp-avalonia/maui iOS builds#530
adrianhall merged 4 commits into
CommunityToolkit:mainfrom
adrianhall:issues/529

Conversation

@adrianhall

Copy link
Copy Markdown
Collaborator

Summary

Fixes#529.

todoapp-avalonia / ios (and, latently, todoapp-maui / ios) call dotnet workload install ios / maui-ios unpinned, which 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 - not installed on either the macOS-15 or macOS-26 runner images currently backing the macos-latest label during its migration window (see actions/runner-images#14167, rollout through 2026-07-15), causing the

This version of .NET for iOS (26.5.10284) requires Xcode 26.5. The current version of Xcode is 16.4.

failure from #529. This also explains why the failure looked flaky: the same commit passed and failed todoapp-avalonia / ios ~26 minutes apart on main/a PR run of #528, purely because macos-latest landed on a different underlying image each time.

What changed

Both todoapp-avalonia / ios and todoapp-maui / ios jobs now:

  1. Pin runs-on to macos-15 (instead of macos-latest) so the Xcode version available on the runner is deterministic during the macos-latest migration window, rather than randomly landing on macOS-15 or macOS-26.
  2. Explicitly select Xcode 26.3 via sudo xcode-select -s /Applications/Xcode_26.3.app. Xcode 26.3 is already installed on the macos-15 image, just not the default (16.4).
  3. Pin the iOS workload install to workload set 10.0.107 via dotnet workload install ios/maui-ios --version 10.0.107, scoped only to that job's env/steps (not a repo-wide global.json). 10.0.107 is the last workload set before the iOS/MacCatalyst/macOS/tvOS manifest moved to the 26.4/26.5 pack line, resolving to Microsoft.iOS.Sdk.net10.0_26.2 (26.2.10233), which requires exactly Xcode 26.3 - matching step 2. It keeps other manifests (Android, MAUI) at their latest versions, so those jobs are unaffected.

Why not a per-project TargetPlatformVersion/ValidateXcodeVersion override, or a repo-root global.json?

  • A per-project MSBuild property fix would need to be applied individually to TodoApp.Avalonia.iOS.csproj, TodoApp.MAUI.csproj, and (once #506 is resolved) TodoApp.Uno.csproj - and wouldn't protect any future mobile sample from hitting the same issue.
  • A repo-root global.json pinning sdk.workloadVersion was tried first, but it forces everydotnet build/restore in the whole repo (via Microsoft.NET.Sdk.ImportWorkloads.props) to require that exact workload version to already be installed - even for projects with zero workload dependency. This broke todoapp-mvc, todoapp-blazor-wasm, datasync-server, etc. on a fresh runner (confirmed via a real run). dotnet workload install ... --version scoped to just the ios job's own steps avoids this entirely.
  • Checked back through every published workload set since 10.0.100 (2025-11-11): none currently declare an iOS _RecommendedXcodeVersion anywhere near 16.4 (they range from 26.0 through 26.5), so pinning the workload version alone isn't sufficient - the explicit xcode-select step is required too. This was confirmed by first testing the workload pin alone, which failed the same way against 26.2.10233 requiring Xcode 26.3.

Validation

Ran the full build-samples.yml via workflow_dispatch on this branch twice to confirm the fix is deterministic, not a flaky pass:

Both android jobs (unpinned, unaffected by the ios-job-scoped changes) passed in both runs, confirming no regression there.

todoapp-uno is intentionally left untouched - it's not wired into build-samples.yml yet (blocked by #506), and will need the same treatment when it's re-enabled.

Follow-up

Revisit both ios jobs once we deliberately upgrade to a newer, Xcode-26-compatible workload set (both the runs-on: macos-15 pin and the xcode-select step are called out inline as things to revisit then).

ahalland others added 4 commits July 10, 2026 09:54
…ch (CommunityToolkit#529)
todoapp-avalonia / ios and todoapp-maui / ios both call 'dotnet workload
install ios' / 'maui-ios' unpinned (loose-manifests mode), which 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 -
not installed on either macOS-15 or macOS-26 runner images currently
backing the macos-latest label during its migration window (see
actions/runner-images#14167), causing intermittent
'This version of .NET for iOS (26.5.10284) requires Xcode 26.5' build
failures.
- Add repo-root global.json pinning sdk.workloadVersion to 10.0.107,
the last workload set before the iOS/MacCatalyst/macOS/tvOS manifest
moved to the 26.4/26.5 pack line, while keeping the MAUI (10.0.20)
and Android (36.1.53) manifests at their latest versions. This
applies automatically to every 'dotnet workload install' call in CI
(including the currently-disabled todoapp-uno / ios-maccatalyst job,
once CommunityToolkit#506 is resolved and it's wired back in) with no per-job or
per-project edits needed.
- Pin the todoapp-avalonia / ios and todoapp-maui / ios jobs to
macos-15 (instead of macos-latest) as defense-in-depth so the Xcode
version these jobs build against is deterministic during the
migration window, rather than randomly landing on macos-15 or
macos-26.
…ommunityToolkit#529)
The repo-root global.json approach broke every other sample build
(todoapp-mvc, todoapp-blazor-wasm, datasync-server, etc.) on a fresh
runner with:
error MSB4242: SDK Resolver Failure: ... Workload version 10.0.107,
which was specified in .../global.json, was not found. Run
'dotnet workload restore' to install this workload version.
Microsoft.NET.Sdk.ImportWorkloads.props enforces the pinned workload
version for every 'dotnet build'/'restore' invocation whose cwd falls
under a global.json declaring sdk.workloadVersion - regardless of
whether that specific project has any workload dependency - and it's
not satisfied lazily; it must already be installed. Confirmed via a
real workflow_dispatch run (see
https://github.com/adrianhall/CommunityToolkit-Datasync/actions/runs/29081276609).
Replaced with 'dotnet workload install ios/maui-ios --version 10.0.107'
scoped to just the ios job's env/steps in each affected workflow. This
pins only that job's install (and the restore/build steps that follow
it on the same runner), leaving every other job - including the
android jobs in the same workflows - on unpinned/latest workload
resolution.
…mmunityToolkit#529)
Testing the --version 10.0.107 workload pin alone (previous commit) still
failed on macos-15:
error: This version of .NET for iOS (26.2.10233) requires Xcode 26.3.
The current version of Xcode is 16.4.
Confirmed via a real workflow_dispatch run
(https://github.com/adrianhall/CommunityToolkit-Datasync/actions/runs/29081474204)
that both todoapp-avalonia/ios and todoapp-maui/ios resolve to the SAME
newest-available pack within the pinned workload set (26.2.10233,
_RecommendedXcodeVersion=26.3 per Microsoft.iOS.Sdk.Versions.props),
not an older Xcode-16.4-compatible one - there is no currently-published
net10.0 iOS SDK pack (checked back to workload set 10.0.100, published
2025-11-11) whose _RecommendedXcodeVersion is anywhere close to 16.4, so
no workload-version pin alone can satisfy macos-15's default Xcode.
Per actions/runner-images' macos-15 Readme, Xcode 26.3 IS already
installed on the image (just not the default) at
/Applications/Xcode_26.3.app, alongside 26.0.1/26.1.1/26.2. Added a
'sudo xcode-select -s' step to explicitly select it, matching the
26.2.10233 pack's requirement, instead of installing anything extra.
@adrianhall
adrianhall merged commit 398792f into CommunityToolkit:mainJul 10, 2026
15 checks passed
@adrianhall
adrianhall deleted the issues/529 branch July 10, 2026 10:12
adrianhall added a commit that referenced this pull request Jul 11, 2026
… ios-maccatalyst build (#561)
* docs: add AGENTS.md guidance for testing samples via workflow_dispatch
Samples require platform SDKs/workloads not guaranteed to be available
locally. Document the proper validation approach: push the branch to
the local fork and trigger the Build Samples workflow via
workflow_dispatch, then poll for results. Note that a full run across
all samples takes approximately 6 minutes end-to-end, so agents can
set correct timing expectations when polling.
* ci: pin iOS/Mac Catalyst workload set + Xcode version for todoapp-uno ios-maccatalyst build
Fixes#559.
Applies the same fix as #530 (todoapp-avalonia/maui ios jobs) to
todoapp-uno's ios-maccatalyst job: dotnet workload install ios
maccatalyst was unpinned, resolving the newest Microsoft.iOS.Sdk
pack (26.5.10284, requiring Xcode 26.5) which isn't available on
macos-latest (currently Xcode 16.4). Pin runs-on to macos-15,
explicitly select the already-installed Xcode 26.3, and pin the
workload install to workload set 10.0.107 (resolves to
Microsoft.iOS.Sdk.net10.0_26.2.10233, which requires Xcode 26.3).
---------
Co-authored-by: ahall <ahall@cloudflare.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

CI: todoapp-avalonia / ios build fails - .NET for iOS 26.5 requires Xcode 26.5, macos-latest only has Xcode 16.4

1 participant

@adrianhall
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ci: pin iOS workload set + Xcode version for todoapp-avalonia/maui iOS builds - #530

Merged
adrianhall merged 4 commits into
CommunityToolkit:mainfrom
adrianhall:issues/529
Jul 10, 2026
Merged

ci: pin iOS workload set + Xcode version for todoapp-avalonia/maui iOS builds#530
adrianhall merged 4 commits into
CommunityToolkit:mainfrom
adrianhall:issues/529

Conversation

@adrianhall

Copy link
Copy Markdown
Collaborator

Summary

Fixes#529.

todoapp-avalonia / ios (and, latently, todoapp-maui / ios) call dotnet workload install ios / maui-ios unpinned, which 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 - not installed on either the macOS-15 or macOS-26 runner images currently backing the macos-latest label during its migration window (see actions/runner-images#14167, rollout through 2026-07-15), causing the

This version of .NET for iOS (26.5.10284) requires Xcode 26.5. The current version of Xcode is 16.4.

failure from #529. This also explains why the failure looked flaky: the same commit passed and failed todoapp-avalonia / ios ~26 minutes apart on main/a PR run of #528, purely because macos-latest landed on a different underlying image each time.

What changed

Both todoapp-avalonia / ios and todoapp-maui / ios jobs now:

  1. Pin runs-on to macos-15 (instead of macos-latest) so the Xcode version available on the runner is deterministic during the macos-latest migration window, rather than randomly landing on macOS-15 or macOS-26.
  2. Explicitly select Xcode 26.3 via sudo xcode-select -s /Applications/Xcode_26.3.app. Xcode 26.3 is already installed on the macos-15 image, just not the default (16.4).
  3. Pin the iOS workload install to workload set 10.0.107 via dotnet workload install ios/maui-ios --version 10.0.107, scoped only to that job's env/steps (not a repo-wide global.json). 10.0.107 is the last workload set before the iOS/MacCatalyst/macOS/tvOS manifest moved to the 26.4/26.5 pack line, resolving to Microsoft.iOS.Sdk.net10.0_26.2 (26.2.10233), which requires exactly Xcode 26.3 - matching step 2. It keeps other manifests (Android, MAUI) at their latest versions, so those jobs are unaffected.

Why not a per-project TargetPlatformVersion/ValidateXcodeVersion override, or a repo-root global.json?

  • A per-project MSBuild property fix would need to be applied individually to TodoApp.Avalonia.iOS.csproj, TodoApp.MAUI.csproj, and (once #506 is resolved) TodoApp.Uno.csproj - and wouldn't protect any future mobile sample from hitting the same issue.
  • A repo-root global.json pinning sdk.workloadVersion was tried first, but it forces everydotnet build/restore in the whole repo (via Microsoft.NET.Sdk.ImportWorkloads.props) to require that exact workload version to already be installed - even for projects with zero workload dependency. This broke todoapp-mvc, todoapp-blazor-wasm, datasync-server, etc. on a fresh runner (confirmed via a real run). dotnet workload install ... --version scoped to just the ios job's own steps avoids this entirely.
  • Checked back through every published workload set since 10.0.100 (2025-11-11): none currently declare an iOS _RecommendedXcodeVersion anywhere near 16.4 (they range from 26.0 through 26.5), so pinning the workload version alone isn't sufficient - the explicit xcode-select step is required too. This was confirmed by first testing the workload pin alone, which failed the same way against 26.2.10233 requiring Xcode 26.3.

Validation

Ran the full build-samples.yml via workflow_dispatch on this branch twice to confirm the fix is deterministic, not a flaky pass:

Both android jobs (unpinned, unaffected by the ios-job-scoped changes) passed in both runs, confirming no regression there.

todoapp-uno is intentionally left untouched - it's not wired into build-samples.yml yet (blocked by #506), and will need the same treatment when it's re-enabled.

Follow-up

Revisit both ios jobs once we deliberately upgrade to a newer, Xcode-26-compatible workload set (both the runs-on: macos-15 pin and the xcode-select step are called out inline as things to revisit then).

ahalland others added 4 commits July 10, 2026 09:54
…ch (CommunityToolkit#529)
todoapp-avalonia / ios and todoapp-maui / ios both call 'dotnet workload
install ios' / 'maui-ios' unpinned (loose-manifests mode), which 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 -
not installed on either macOS-15 or macOS-26 runner images currently
backing the macos-latest label during its migration window (see
actions/runner-images#14167), causing intermittent
'This version of .NET for iOS (26.5.10284) requires Xcode 26.5' build
failures.
- Add repo-root global.json pinning sdk.workloadVersion to 10.0.107,
the last workload set before the iOS/MacCatalyst/macOS/tvOS manifest
moved to the 26.4/26.5 pack line, while keeping the MAUI (10.0.20)
and Android (36.1.53) manifests at their latest versions. This
applies automatically to every 'dotnet workload install' call in CI
(including the currently-disabled todoapp-uno / ios-maccatalyst job,
once CommunityToolkit#506 is resolved and it's wired back in) with no per-job or
per-project edits needed.
- Pin the todoapp-avalonia / ios and todoapp-maui / ios jobs to
macos-15 (instead of macos-latest) as defense-in-depth so the Xcode
version these jobs build against is deterministic during the
migration window, rather than randomly landing on macos-15 or
macos-26.
…ommunityToolkit#529)
The repo-root global.json approach broke every other sample build
(todoapp-mvc, todoapp-blazor-wasm, datasync-server, etc.) on a fresh
runner with:
error MSB4242: SDK Resolver Failure: ... Workload version 10.0.107,
which was specified in .../global.json, was not found. Run
'dotnet workload restore' to install this workload version.
Microsoft.NET.Sdk.ImportWorkloads.props enforces the pinned workload
version for every 'dotnet build'/'restore' invocation whose cwd falls
under a global.json declaring sdk.workloadVersion - regardless of
whether that specific project has any workload dependency - and it's
not satisfied lazily; it must already be installed. Confirmed via a
real workflow_dispatch run (see
https://github.com/adrianhall/CommunityToolkit-Datasync/actions/runs/29081276609).
Replaced with 'dotnet workload install ios/maui-ios --version 10.0.107'
scoped to just the ios job's env/steps in each affected workflow. This
pins only that job's install (and the restore/build steps that follow
it on the same runner), leaving every other job - including the
android jobs in the same workflows - on unpinned/latest workload
resolution.
…mmunityToolkit#529)
Testing the --version 10.0.107 workload pin alone (previous commit) still
failed on macos-15:
error: This version of .NET for iOS (26.2.10233) requires Xcode 26.3.
The current version of Xcode is 16.4.
Confirmed via a real workflow_dispatch run
(https://github.com/adrianhall/CommunityToolkit-Datasync/actions/runs/29081474204)
that both todoapp-avalonia/ios and todoapp-maui/ios resolve to the SAME
newest-available pack within the pinned workload set (26.2.10233,
_RecommendedXcodeVersion=26.3 per Microsoft.iOS.Sdk.Versions.props),
not an older Xcode-16.4-compatible one - there is no currently-published
net10.0 iOS SDK pack (checked back to workload set 10.0.100, published
2025-11-11) whose _RecommendedXcodeVersion is anywhere close to 16.4, so
no workload-version pin alone can satisfy macos-15's default Xcode.
Per actions/runner-images' macos-15 Readme, Xcode 26.3 IS already
installed on the image (just not the default) at
/Applications/Xcode_26.3.app, alongside 26.0.1/26.1.1/26.2. Added a
'sudo xcode-select -s' step to explicitly select it, matching the
26.2.10233 pack's requirement, instead of installing anything extra.
@adrianhall
adrianhall merged commit 398792f into CommunityToolkit:mainJul 10, 2026
15 checks passed
@adrianhall
adrianhall deleted the issues/529 branch July 10, 2026 10:12
adrianhall added a commit that referenced this pull request Jul 11, 2026
… ios-maccatalyst build (#561)
* docs: add AGENTS.md guidance for testing samples via workflow_dispatch
Samples require platform SDKs/workloads not guaranteed to be available
locally. Document the proper validation approach: push the branch to
the local fork and trigger the Build Samples workflow via
workflow_dispatch, then poll for results. Note that a full run across
all samples takes approximately 6 minutes end-to-end, so agents can
set correct timing expectations when polling.
* ci: pin iOS/Mac Catalyst workload set + Xcode version for todoapp-uno ios-maccatalyst build
Fixes#559.
Applies the same fix as #530 (todoapp-avalonia/maui ios jobs) to
todoapp-uno's ios-maccatalyst job: dotnet workload install ios
maccatalyst was unpinned, resolving the newest Microsoft.iOS.Sdk
pack (26.5.10284, requiring Xcode 26.5) which isn't available on
macos-latest (currently Xcode 16.4). Pin runs-on to macos-15,
explicitly select the already-installed Xcode 26.3, and pin the
workload install to workload set 10.0.107 (resolves to
Microsoft.iOS.Sdk.net10.0_26.2.10233, which requires Xcode 26.3).
---------
Co-authored-by: ahall <ahall@cloudflare.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

CI: todoapp-avalonia / ios build fails - .NET for iOS 26.5 requires Xcode 26.5, macos-latest only has Xcode 16.4

1 participant

@adrianhall
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

ci: pin iOS workload set + Xcode version for todoapp-avalonia/maui iOS builds - #530

Merged
adrianhall merged 4 commits into
CommunityToolkit:mainfrom
adrianhall:issues/529
Jul 10, 2026
Merged

ci: pin iOS workload set + Xcode version for todoapp-avalonia/maui iOS builds#530
adrianhall merged 4 commits into
CommunityToolkit:mainfrom
adrianhall:issues/529

Conversation

@adrianhall

Copy link
Copy Markdown
Collaborator

Summary

Fixes#529.

todoapp-avalonia / ios (and, latently, todoapp-maui / ios) call dotnet workload install ios / maui-ios unpinned, which 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 - not installed on either the macOS-15 or macOS-26 runner images currently backing the macos-latest label during its migration window (see actions/runner-images#14167, rollout through 2026-07-15), causing the

This version of .NET for iOS (26.5.10284) requires Xcode 26.5. The current version of Xcode is 16.4.

failure from #529. This also explains why the failure looked flaky: the same commit passed and failed todoapp-avalonia / ios ~26 minutes apart on main/a PR run of #528, purely because macos-latest landed on a different underlying image each time.

What changed

Both todoapp-avalonia / ios and todoapp-maui / ios jobs now:

  1. Pin runs-on to macos-15 (instead of macos-latest) so the Xcode version available on the runner is deterministic during the macos-latest migration window, rather than randomly landing on macOS-15 or macOS-26.
  2. Explicitly select Xcode 26.3 via sudo xcode-select -s /Applications/Xcode_26.3.app. Xcode 26.3 is already installed on the macos-15 image, just not the default (16.4).
  3. Pin the iOS workload install to workload set 10.0.107 via dotnet workload install ios/maui-ios --version 10.0.107, scoped only to that job's env/steps (not a repo-wide global.json). 10.0.107 is the last workload set before the iOS/MacCatalyst/macOS/tvOS manifest moved to the 26.4/26.5 pack line, resolving to Microsoft.iOS.Sdk.net10.0_26.2 (26.2.10233), which requires exactly Xcode 26.3 - matching step 2. It keeps other manifests (Android, MAUI) at their latest versions, so those jobs are unaffected.

Why not a per-project TargetPlatformVersion/ValidateXcodeVersion override, or a repo-root global.json?

  • A per-project MSBuild property fix would need to be applied individually to TodoApp.Avalonia.iOS.csproj, TodoApp.MAUI.csproj, and (once #506 is resolved) TodoApp.Uno.csproj - and wouldn't protect any future mobile sample from hitting the same issue.
  • A repo-root global.json pinning sdk.workloadVersion was tried first, but it forces everydotnet build/restore in the whole repo (via Microsoft.NET.Sdk.ImportWorkloads.props) to require that exact workload version to already be installed - even for projects with zero workload dependency. This broke todoapp-mvc, todoapp-blazor-wasm, datasync-server, etc. on a fresh runner (confirmed via a real run). dotnet workload install ... --version scoped to just the ios job's own steps avoids this entirely.
  • Checked back through every published workload set since 10.0.100 (2025-11-11): none currently declare an iOS _RecommendedXcodeVersion anywhere near 16.4 (they range from 26.0 through 26.5), so pinning the workload version alone isn't sufficient - the explicit xcode-select step is required too. This was confirmed by first testing the workload pin alone, which failed the same way against 26.2.10233 requiring Xcode 26.3.

Validation

Ran the full build-samples.yml via workflow_dispatch on this branch twice to confirm the fix is deterministic, not a flaky pass:

Both android jobs (unpinned, unaffected by the ios-job-scoped changes) passed in both runs, confirming no regression there.

todoapp-uno is intentionally left untouched - it's not wired into build-samples.yml yet (blocked by #506), and will need the same treatment when it's re-enabled.

Follow-up

Revisit both ios jobs once we deliberately upgrade to a newer, Xcode-26-compatible workload set (both the runs-on: macos-15 pin and the xcode-select step are called out inline as things to revisit then).

ahalland others added 4 commits July 10, 2026 09:54
…ch (CommunityToolkit#529)
todoapp-avalonia / ios and todoapp-maui / ios both call 'dotnet workload
install ios' / 'maui-ios' unpinned (loose-manifests mode), which 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 -
not installed on either macOS-15 or macOS-26 runner images currently
backing the macos-latest label during its migration window (see
actions/runner-images#14167), causing intermittent
'This version of .NET for iOS (26.5.10284) requires Xcode 26.5' build
failures.
- Add repo-root global.json pinning sdk.workloadVersion to 10.0.107,
the last workload set before the iOS/MacCatalyst/macOS/tvOS manifest
moved to the 26.4/26.5 pack line, while keeping the MAUI (10.0.20)
and Android (36.1.53) manifests at their latest versions. This
applies automatically to every 'dotnet workload install' call in CI
(including the currently-disabled todoapp-uno / ios-maccatalyst job,
once CommunityToolkit#506 is resolved and it's wired back in) with no per-job or
per-project edits needed.
- Pin the todoapp-avalonia / ios and todoapp-maui / ios jobs to
macos-15 (instead of macos-latest) as defense-in-depth so the Xcode
version these jobs build against is deterministic during the
migration window, rather than randomly landing on macos-15 or
macos-26.
…ommunityToolkit#529)
The repo-root global.json approach broke every other sample build
(todoapp-mvc, todoapp-blazor-wasm, datasync-server, etc.) on a fresh
runner with:
error MSB4242: SDK Resolver Failure: ... Workload version 10.0.107,
which was specified in .../global.json, was not found. Run
'dotnet workload restore' to install this workload version.
Microsoft.NET.Sdk.ImportWorkloads.props enforces the pinned workload
version for every 'dotnet build'/'restore' invocation whose cwd falls
under a global.json declaring sdk.workloadVersion - regardless of
whether that specific project has any workload dependency - and it's
not satisfied lazily; it must already be installed. Confirmed via a
real workflow_dispatch run (see
https://github.com/adrianhall/CommunityToolkit-Datasync/actions/runs/29081276609).
Replaced with 'dotnet workload install ios/maui-ios --version 10.0.107'
scoped to just the ios job's env/steps in each affected workflow. This
pins only that job's install (and the restore/build steps that follow
it on the same runner), leaving every other job - including the
android jobs in the same workflows - on unpinned/latest workload
resolution.
…mmunityToolkit#529)
Testing the --version 10.0.107 workload pin alone (previous commit) still
failed on macos-15:
error: This version of .NET for iOS (26.2.10233) requires Xcode 26.3.
The current version of Xcode is 16.4.
Confirmed via a real workflow_dispatch run
(https://github.com/adrianhall/CommunityToolkit-Datasync/actions/runs/29081474204)
that both todoapp-avalonia/ios and todoapp-maui/ios resolve to the SAME
newest-available pack within the pinned workload set (26.2.10233,
_RecommendedXcodeVersion=26.3 per Microsoft.iOS.Sdk.Versions.props),
not an older Xcode-16.4-compatible one - there is no currently-published
net10.0 iOS SDK pack (checked back to workload set 10.0.100, published
2025-11-11) whose _RecommendedXcodeVersion is anywhere close to 16.4, so
no workload-version pin alone can satisfy macos-15's default Xcode.
Per actions/runner-images' macos-15 Readme, Xcode 26.3 IS already
installed on the image (just not the default) at
/Applications/Xcode_26.3.app, alongside 26.0.1/26.1.1/26.2. Added a
'sudo xcode-select -s' step to explicitly select it, matching the
26.2.10233 pack's requirement, instead of installing anything extra.
@adrianhall
adrianhall merged commit 398792f into CommunityToolkit:mainJul 10, 2026
15 checks passed
@adrianhall
adrianhall deleted the issues/529 branch July 10, 2026 10:12
adrianhall added a commit that referenced this pull request Jul 11, 2026
… ios-maccatalyst build (#561)
* docs: add AGENTS.md guidance for testing samples via workflow_dispatch
Samples require platform SDKs/workloads not guaranteed to be available
locally. Document the proper validation approach: push the branch to
the local fork and trigger the Build Samples workflow via
workflow_dispatch, then poll for results. Note that a full run across
all samples takes approximately 6 minutes end-to-end, so agents can
set correct timing expectations when polling.
* ci: pin iOS/Mac Catalyst workload set + Xcode version for todoapp-uno ios-maccatalyst build
Fixes#559.
Applies the same fix as #530 (todoapp-avalonia/maui ios jobs) to
todoapp-uno's ios-maccatalyst job: dotnet workload install ios
maccatalyst was unpinned, resolving the newest Microsoft.iOS.Sdk
pack (26.5.10284, requiring Xcode 26.5) which isn't available on
macos-latest (currently Xcode 16.4). Pin runs-on to macos-15,
explicitly select the already-installed Xcode 26.3, and pin the
workload install to workload set 10.0.107 (resolves to
Microsoft.iOS.Sdk.net10.0_26.2.10233, which requires Xcode 26.3).
---------
Co-authored-by: ahall <ahall@cloudflare.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

CI: todoapp-avalonia / ios build fails - .NET for iOS 26.5 requires Xcode 26.5, macos-latest only has Xcode 16.4

1 participant

@adrianhall