Repository navigation
ci: build Apple lanes with Xcode 27.1 - #1266
Draft
AnthonyRonning wants to merge 4 commits into
Draft
AnthonyRonning wants to merge 4 commits into
AnthonyRonning wants to merge 4 commits into
Conversation
This was referenced Oct 25, 2026
GitHub's xcode-27 image keeps Xcode 27.1 (27A9275) at /Applications/Xcode_27.1_Release_Candidate.app, and its default is 27.0. Also consider Xcode_<version>_*.app after the exact names; selection still requires the pinned build and still skips beta installs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Xcode 27.1 (27A9275) brings the iOS 27.1 SDK and iPhone Duo support, and App Store Connect requires the iOS 27 SDK from April 2027. - apple-toolchain.json pins 27.1 / 27A9275 for the selector, the Nix shell and the cache keys. - Builders move to blacksmith-6vcpu-macos-27 and GitHub-hosted jobs to xcode-27; the macos-26 images have no Xcode 27. Signing stays on GitHub-hosted runners. - Agent CI's macOS jobs select the pinned Xcode instead of the runner default (27.0 on the xcode-27 image); the workflow lint now rejects macos-14 and macos-26 labels. - The iOS ONNX Runtime build targets iOS 16.0 like the app: Xcode 27 only builds for deployment targets 15.0 and later. Its hash pins move to 27A9275 from a local Xcode 27.1 build, and the dead 17F42 defaults go. - Docs: runner labels and the pin; the StoreKit harness commands no longer select the removed Xcode 26.6. Drops the stale project.pbxproj.backup, which still targeted iOS 13. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- actionlint: allow the blacksmith-6vcpu-macos-27 and xcode-27 labels, which the pinned actionlint predates. - test-canonical-macho: Xcode 27's ld sorts local absolute symbols, so both fixtures came out in the same order. Swap the entries to recreate the input-order variant older linkers emitted. - Agent shell: link Rust with Xcode's clang as well. nixpkgs' ld64 cannot read the macOS 27 SDK's .tbd stubs (they list arm64e.x1), so build scripts failed to link (_strerror_r undefined). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
AnthonyRonning
force-pushed
the
ci/xcode-27.1
branch
2 times, most recently
from
October 25, 2026 01:21
69c8143 to
8cd7644
Compare
- Research and Agent: stop stripping build scripts and proc-macros in
release builds. rustc strips Apple outputs with rust-objcopy, which
doesn't pad __LINKEDIT entries, so chained-fixup images (deployment
target 12+) can end up with a 4-byte-aligned string table. macOS 27's
dyld refuses such dylibs once they're linked against the macOS 27 SDK,
so rustc could not load zerofrom-derive ("can't find crate").
Executables aren't checked, so shipped binaries keep their current
strip settings.
- Agent desktop build: build the macOS binary on GitHub's xcode-27
image. gpui compiles Metal shaders, and Blacksmith's macOS 27 image has
no Metal Toolchain for Xcode 27.1 and cannot download it (the
MobileAsset catalog fetch fails on every attempt).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
AnthonyRonning
force-pushed
the
ci/xcode-27.1
branch
from
October 25, 2026 01:50
8cd7644 to
386571d
Compare
Contributor
Author
|
Heads-up for whoever picks this up: the Agent's macOS builds don't need to move to GitHub's Evidence from the experiment in #1308 (draft, based on this branch, not for merge), run 40415895366:
Suggested shape when this rebases:
The workflow is Not urgent: CI is being rewritten in a single PR first, and this PR should rebase after that lands. |
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
Move every Apple lane to Xcode 27.1 (27A9275), the release that adds the iOS 27.1 SDK and iPhone Duo support. App Store Connect requires the iOS 27 SDK from April 2027. Top of the stack: it needs PR #1264 (Tauri 2.12) and PR #1265 (UIScene adoption), because iOS 27 SDK builds abort at launch without scenes.
What
scripts/ci/apple-toolchain.jsonpins Xcode 27.1 / 27A9275. This flows intoselect-xcode.py, the root Nix shell and the cache keys.blacksmith-6vcpu-macos-26→blacksmith-6vcpu-macos-27for builders.macos-26→xcode-27for verifiers, signing, TestFlight and Agent CI. GitHub's macos-26 image has no Xcode 27.select-xcode.pyalso considers suffixed installs such asXcode_27.1_Release_Candidate.app. That is where GitHub's xcode-27 image keeps 27A9275 today, and where its default is still 27.0. Selection still requires the exact pinned build and still skips betas. Tests cover both cases.agent-cidesktop/provider, store performance) now select the pinned Xcode too, instead of the runner default.macos-14/macos-26labels. The actionlint config listsblacksmith-6vcpu-macos-27andxcode-27, which the pinned actionlint doesn't know yet..tbdstubs (they list the newarm64e.x1architecture), so every Rust build script failed to link with_strerror_rundefined.test-canonical-macho.py: Xcode 27's ld sorts local absolute symbols, so the two fixtures came out identical. The test now swaps the entries to recreate the unsorted variant older linkers emitted, and still checks that the canonical hash strips them.Cargo.toml: release builds no longer strip build scripts and proc-macros ([profile.release.build-override] strip = false). The macOS release builds failed withcan't find crate for zerofrom_derive, because dyld refused to load the proc-macro ("mis-aligned LINKEDIT string pool").rust-objcopy, which doesn't pad__LINKEDITentries. For images with chained fixups (deployment target 12+, so the desktop builds' 13.4 and the Agent's 15.0), that can leave the string table only 4-byte aligned.sdk 26.5load fine, which is why this never showed up on Xcode 26.5.stripkeeps the table aligned.__LINKEDITentries. Drop the setting once the pinned Rust ships an objcopy with it.xcode-27image instead of Blacksmith, as it did before PR #1119. gpui compiles Metal shaders, and Blacksmith's macOS 27 image has no Metal Toolchain for Xcode 27.1.xcodebuild -downloadComponent MetalToolchainfails there on every attempt ("Failed fetching catalog"), while GitHub's image ships the component.Validation
xcode-27, and the Agent's macOS release build onxcode-27. Onebuild-macosattempt failed because a Blacksmith VM had not mounted its Xcode 27.1 volume; the rerun passed.python3 -m unittest discover -s scripts/ci: 569 pass. This includes the new selector cases, and the signing-boundary test now expects GitHub-hostedxcode-27.workflowsflake check (actionlint plus the workflow tests) passes.test-canonical-macho.pypasses under Xcode 26.5 and 27.1.cargo build --workspace --all-targets --lockedpasses in the Agent dev shell, including gpui's Metal shaders and every build-script link.scripts/test_git_metadata.pypasses (9 tests).cargo build --release --target aarch64-apple-darwinwith the desktop script's environment (deployment target 13.4) passes. Without thebuild-overridechange it fails exactly as CI did. The shippedmapleexecutable is still stripped.stripbut not afterrust-objcopy. The same dylib loads when stampedsdk 26.5and is refused when re-stampedsdk 27.0. Stripped executables with the misaligned table still run.e4d28818…, simulator library0b670a0f…, xcframework93cbb699…. The manifest hash and tree hash agree.verify_ios_onnxruntime_manifestpasses with the new pins.DTSDKName iphonesimulator27.1,LC_BUILD_VERSION sdk 27.1. The release link is the proof for the public@_cdeclentry points in PR #1265.Heads-up
macos-26runners there.sudo xcode-select -s /Applications/Xcode_27.1.app).tauri ios buildrunsxcodebuildwith a replaced environment, so it ignoresDEVELOPER_DIR. CI already switches globally.macos-27image needs the Metal Toolchain for Xcode 27.1 (27A266a) preinstalled, or access to Apple's MobileAsset catalog.xcodebuild -downloadComponent MetalToolchainwith 27.1 selected. The component is installed per Xcode version, so the one installed for 26.5 doesn't count.🤖 Generated with Claude Code