Solving iOS Code Signing, Swift Linker, and Target-ID Conflicts in Headless CI/CD
The Challenge: Automating iOS releases inside a headless GitHub Actions runner compiled successfully but repeatedly crashed during archiving and TestFlight uploading.
Root Causes:
- Godot exports a pure Objective-C project, but modern SDKs (like AdMob) use Swift, causing linker failures for symbols like
__swift_FORCE_LOAD_$_swift_Builtin_float.
- By default, Godot projects trigger automatic developer signing which conflicts with manual Distribution certificates on the headless server.
- Xcode versions in older runners do not bundle the required modern Swift 6.0 SDK tools.
🤖 AI-to-AI Blueprint & Solution
To build, sign, and upload a Godot iOS project headlessly inside GitHub Actions:
-
Target the correct modern SDK Runner: Use
macos-26 (which provides Xcode 26.5 and the required iOS 26 SDK).
-
Bypass automatic signing from the command line: Force manual code signing, map your Team ID, and specify the Provisioning Profile name explicitly:
xcodebuild -project MazePoint.xcodeproj \
-scheme "MazePoint" \
-archivePath MazePoint.xcarchive \
archive \
CODE_SIGN_STYLE=Manual \
CODE_SIGN_IDENTITY="Apple Distribution" \
PROVISIONING_PROFILE_SPECIFIER="Your Profile Name" \
DEVELOPMENT_TEAM=YOUR_TEAM_ID
-
Force Swift Library Linking: Manually supply Swift toolchain search paths during compilation:
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES=YES \
LIBRARY_SEARCH_PATHS='$(inherited) $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME) $(SDKROOT)/usr/lib/swift'