Skip to content

Build the App Store binary where the SDK is one Apple accepts - #24

Merged
joshlin2201 merged 1 commit into
mainfrom
appstore-build-on-a-released-xcode
Aug 26, 2026
Merged

Build the App Store binary where the SDK is one Apple accepts#24
joshlin2201 merged 1 commit into
mainfrom
appstore-build-on-a-released-xcode

Conversation

@joshlin2201

Copy link
Copy Markdown
Owner

Build 16 was archived, signed, uploaded — and rejected:

ITMS-90301: This bundle is invalid — Apple is not currently accepting
applications built with this version of the OS.

Nothing about the archive was wrong. The machine that made it has exactly one
Xcode, a beta (26.6, 17F113), whose only macOS SDK is a beta SDK, and the SDK
is recorded in the binary. There is no flag that changes it. My mistake: I
built the store binary on a laptop without checking what SDK it would stamp,
having just verified everything else about that build in detail.

The fix

A workflow_dispatch job on macos-15, where GitHub ships only released
Xcodes, selecting the newest and printing it every run — the failure was
invisible until Apple emailed about it, so the version goes in the log whether
or not it works.

Three things it does that the obvious version would get wrong:

  • It checks out the dispatched ref, not the tag, and then proves the app
    source is byte-identical to the tag.
    Release tooling gets fixed after a
    release at least as often as before it: v0.18.0 is tagged one commit before
    the export learned to sign without an Xcode account, so building the tag runs
    the broken script. Docs and scripts may move between the tag and the build;
    App, Packages, project.yml and ItsPaint.xcodeproj may not.
  • The build number is an input. Apple refuses a build number it has already
    seen, and the tag that pins the marketing version cannot be moved or deleted,
    so without this a rejected upload costs a whole version number.
    ITSPAINT_BUILD_NUMBER overrides CURRENT_PROJECT_VERSION at archive time.
  • Both identities or nothing. The app is signed by one certificate and the
    pkg by the other; missing the installer one fails after the archive, which
    is the shape that reads like a build problem.

It uploads and stops. Attaching the build to a version and submitting stays an
App Store Connect API call, because a submission is a thing a person decides to
send.

New secrets: MACOS_APPSTORE_P12, MACOS_APPSTORE_PASSWORD,
MACOS_APPSTORE_PROFILE, ASC_KEY_ID, ASC_ISSUER_ID, ASC_PRIVATE_KEY.

🤖 Generated with Claude Code

Build 16 was rejected with ITMS-90301: Apple is not currently accepting
applications built with this version of the OS. The machine that built it has
one Xcode, a beta, whose only macOS SDK is a beta SDK, and the SDK is recorded
in the binary.

The store build moves to a macos-15 runner, which carries released Xcodes only.
It checks out the dispatched ref rather than the tag, because the tag's copy of
scripts/ is the copy that failed, and then refuses unless App, Packages,
project.yml and ItsPaint.xcodeproj are byte-identical to the tag. The build
number is an input, because Apple refuses a repeat and the tag cannot be moved
to bump it.
@joshlin2201
joshlin2201 merged commit 37279af into main Aug 26, 2026
3 checks passed
@joshlin2201
joshlin2201 deleted the appstore-build-on-a-released-xcode branch August 26, 2026 06:12
Sign up for free to 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.

1 participant