Skip to content

Add TestFlight upload command (iOS support phase 4)#57

Merged
matt-edmondson merged 1 commit into
mainfrom
claude/quirky-mayer-ZpROV
Jun 5, 2026
Merged

Add TestFlight upload command (iOS support phase 4)#57
matt-edmondson merged 1 commit into
mainfrom
claude/quirky-mayer-ZpROV

Conversation

@matt-edmondson

Copy link
Copy Markdown
Contributor

Summary

Implements the final phase of docs/ios-support-plan.md: pushing the signed .ipa to TestFlight via the App Store Connect API. Builds on phases 1–3 (detection/host gating, unsigned build, signed packaging).

What changed

  • IosService.UploadAsync (new) gates on IosSigningAvailable and a macOS host, no-ops cleanly otherwise (so the command is safe to call unconditionally from a consumer workflow). It locates the .ipa produced by ios package in the same workspace (an explicit --ipa, or by searching each detected head's bin), installs the App Store Connect API key (.p8) under ~/.appstoreconnect/private_keys, and runs xcrun altool --upload-app --type ios --apiKey … --apiIssuer … per archive.
  • Unreliable exit code handling. altool has returned 0 on an App Store Connect validation failure, so the captured output is also scanned for UPLOAD FAILED / Failed to upload package; either signal fails the step. The API key is never logged and the decoded .p8 is wiped after the run.
  • Configuration. New App Store Connect inputs (APP_STORE_CONNECT_KEY_BASE64, APP_STORE_CONNECT_KEY_ID, APP_STORE_CONNECT_ISSUER_ID) on BuildConfiguration, read in BuildConfigurationProvider. The iOS env reading was extracted into a helper to keep CreateFromEnvironmentAsync under the cyclomatic-complexity limit (CA1502).
  • CLI. New ios upload subcommand (--workspace, --configuration, --verbose, --project, --ipa) wired in Program.cs.
  • Tests. Signing-gate skip, altool command-string construction, failure-string detection, and .ipa location.
  • Docs. CLAUDE.md updated: command tree, ios upload description, env-var table, and the consumer CI workflow guidance.

Testing

Full suite green locally (345 tests, including the new upload tests).

Test run summary: Passed!  total: 345  failed: 0

The signing/upload path itself cannot be exercised without macOS, Apple signing material, and an App Store Connect account, matching the plan's testing note. The unit tests cover the host/signing gate, command construction, and failure detection; the real upload is verified on a macOS runner against a consumer repo.

https://claude.ai/code/session_013EuS2hr9kbcLWYbQPNy4UE


Generated by Claude Code

Implements the final phase of the iOS build support plan: pushing the
signed .ipa to TestFlight via the App Store Connect API.

- IosService.UploadAsync gates on IosSigningAvailable and a macOS host
  (no-ops cleanly otherwise), locates the .ipa produced by `ios package`
  (explicit --ipa, or by searching each detected head's bin), installs
  the App Store Connect API key (.p8) under ~/.appstoreconnect/private_keys,
  and runs `xcrun altool --upload-app` per archive.
- altool's exit code is unreliable, so the output is also scanned for the
  UPLOAD FAILED / Failed to upload package strings; either signal fails the
  step. The API key is never logged and the decoded .p8 is wiped after the run.
- New App Store Connect config inputs (APP_STORE_CONNECT_KEY_BASE64,
  _KEY_ID, _ISSUER_ID); iOS env reading extracted to a helper to keep
  CreateFromEnvironmentAsync under the cyclomatic-complexity limit.
- New `ios upload` CLI subcommand wired in Program.cs.
- Unit tests for the signing gate, altool command construction, failure-string
  detection, and .ipa location.
- CLAUDE.md updated: command tree, upload description, env-var table, CI guidance.

https://claude.ai/code/session_013EuS2hr9kbcLWYbQPNy4UE
@sonarqubecloud

sonarqubecloud Bot commented Jun 5, 2026

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
0.0% Coverage on New Code (required ≥ 80%)

See analysis details on SonarQube Cloud

@matt-edmondson matt-edmondson merged commit df64790 into main Jun 5, 2026
4 of 5 checks passed
@matt-edmondson matt-edmondson deleted the claude/quirky-mayer-ZpROV branch June 5, 2026 09:39
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.

2 participants