Skip to content

feat(mobile): full TestFlight CI on mobile-v* tag push (NAN-700)#336

Open
yagudaev wants to merge 3 commits into
mainfrom
feat/mobile-ci-tag-push-testflight
Open

feat(mobile): full TestFlight CI on mobile-v* tag push (NAN-700)#336
yagudaev wants to merge 3 commits into
mainfrom
feat/mobile-ci-tag-push-testflight

Conversation

@yagudaev

@yagudaev yagudaev commented May 1, 2026

Copy link
Copy Markdown
Owner

Summary

  • Rewrites the scaffold .github/workflows/release-mobile.yml with a full xcodebuild pipeline on macos-14, mirroring release-desktop.yml
  • Adds workflow_dispatch inputs: tag (required), variant (staging|production, default staging), submit (boolean, default true — set false for dry-run)
  • Build step always runs; submit step is gated on inputs.submit != 'false' (tag-push defaults to submit=true)
  • Fixes mobile/eas.json staging ascApiKeyPath from hardcoded absolute local path to ~/ so EAS CLI resolves it correctly on CI runners

⚠ BLOCKER: iOS Distribution cert secret missing

The DEVELOPER_ID_CERT_P12 secret in the repo contains the macOS "Developer ID Application" certificate — used for macOS DMG notarization via electron-builder. This is a DIFFERENT cert than what iOS App Store distribution requires.

iOS App Store distribution (method: app-store-connect in ExportOptions.plist) needs an "Apple Distribution" cert (also called "iPhone Distribution"). xcodebuild with CODE_SIGN_STYLE=Automatic will look for this cert in the keychain at archive time. Without it, the archive step fails.

Action required before the first real build:

  1. Open Keychain Access on your Mac
  2. Find the cert named "Apple Distribution: ..." (or "iPhone Distribution: ...")
  3. Right-click → Export → choose .p12 format → set a password
  4. Run: base64 -i cert.p12 | pbcopy
  5. Go to Settings → Secrets → Actions in the GitHub repo
  6. Add two new secrets:
    • IOS_DIST_CERT_P12 — the base64 string from step 4
    • IOS_DIST_CERT_PASSWORD — the password from step 3

The workflow will fail at the "Import iOS Distribution certificate" step with a clear error until these are added. It will NOT silently produce an ad-hoc-signed IPA.

How to test before relying on this

  1. Merge this PR.
  2. Add IOS_DIST_CERT_P12 + IOS_DIST_CERT_PASSWORD secrets (see BLOCKER above).
  3. Go to https://github.com/yagudaev/voiceclaw/actions/workflows/release-mobile.yml
  4. Click "Run workflow"
  5. Inputs:
    • tag: mobile-v1.2.0 (latest existing — re-uses existing version, won't bump)
    • variant: staging
    • submit: false ← KEY — skips upload to TestFlight, just verifies build path
  6. Click "Run workflow"
  7. Wait ~20 min for build to complete. Download the IPA artifact from the run page.
  8. If build succeeded: re-run with submit: true to do a full end-to-end test. Note: TestFlight will reject as duplicate build number — that's OK, it proves the submit auth + path works without polluting TestFlight with a real release.
  9. After both pass: next real mobile-v* tag push (created by release-please) will hands-off ship to TestFlight.

Other fixes in this PR

mobile/eas.json staging profile path fix — the ascApiKeyPath was "/Users/michaelyagudaev/.appstore/..." (absolute local path). Changed to "~/.appstore/...". Without this fix, EAS CLI on the runner couldn't find the API key and would fall back to interactive Apple ID login, breaking CI. Local flow is unaffected since ~ resolves to the same place.

Secrets summary

Secret Status Used for
APPLE_API_KEY_P8 ✅ exists Write .p8 for altool validate + eas submit
APPLE_API_KEY_ID ✅ exists Key ID for both
APPLE_API_ISSUER ✅ exists Issuer UUID for both
IOS_DIST_CERT_P12 MISSING — add before first run iOS Distribution cert import
IOS_DIST_CERT_PASSWORD MISSING — add before first run Cert import password
EXPO_TOKEN ✅ exists eas submit authentication

Test plan

  • Add IOS_DIST_CERT_P12 + IOS_DIST_CERT_PASSWORD secrets to repo
  • workflow_dispatch with submit: false → IPA artifact downloads, build log present
  • workflow_dispatch with submit: true → EAS submit runs, TestFlight processes build
  • Local yarn release:ios:staging still works unchanged

🤖 Generated with Claude Code

yagudaev and others added 2 commits April 30, 2026 18:19
Empty desktop releases were appearing on the GitHub Releases page
with no DMG asset for ~15 min after each tag push. Cause: release-
please publishes the GitHub release synchronously with the tag,
then the release-desktop workflow takes 14-17 min to build, sign,
notarize, and upload the DMG. During that window the release
existed publicly with only Source code zip/tar.gz, looking broken.

Two-line fix:
- release-please-config.json: set draft: true on the desktop
  package so release-please creates the release as draft initially
- release-desktop.yml: after the DMG upload step succeeds, flip
  the release from draft to published with gh release edit --draft=false --latest

Mobile package keeps draft: false (default) since it doesn't have
a CI asset upload — TestFlight is its own delivery channel.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Rewrites the scaffold release-mobile.yml with a full xcodebuild pipeline
on macos-14: writes ASC API key, imports iOS Distribution cert, runs
build-ios.sh, submits via eas submit. Adds workflow_dispatch inputs for
tag, variant (staging|production), and submit (boolean dry-run gate).
Also fixes eas.json staging ascApiKeyPath from absolute local path to ~/
so EAS CLI can resolve it on CI runners.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@vercel

vercel Bot commented May 1, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
voiceclaw Ready Ready Preview, Comment May 1, 2026 2:03am

Request Review

Earlier draft of the mobile CI workflow expected new secrets named
IOS_DIST_CERT_P12 + IOS_DIST_CERT_PASSWORD on the assumption that
DEVELOPER_ID_CERT_P12 was strictly the macOS Developer ID
Application cert. Repo only has DEVELOPER_ID_CERT_P12 — its actual
contents may be a multi-identity export including the iOS Apple
Distribution cert, in which case xcodebuild signs cleanly.

If the .p12 turns out to contain only the macOS cert, the
verification step at the end of the import (security find-identity
grep "Apple Distribution|iPhone Distribution") will fail loudly
with a clear message — no silent breakage.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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