openclaw/scripts/ios-release-upload.sh
Josh Avant 8c6fbf5f89
feat(ios): distribute daily TestFlight builds for external testing (#161460)
* feat(ios): distribute daily TestFlight builds for external testing

* fix(ios): reuse App Store builds for first TestFlight distribution

Recognize the App Store-selected build of the same recorded source when it is eligible for beta submission and has no beta notes. Freeze its identity and notes and stage it without another archive or upload. Verify the adopted build ID and preserve existing beta notes on recovery.

The CLI and registered Fastlane regression cases fail before the correction. The complete two-file suite passes 43 cases; the noted-store recovery guard also passes. Script and affected root-test types, scoped lint, formatting, and independent P0-P2 review pass.
2026-09-29 20:43:46 -05:00

53 lines
1.7 KiB
Bash
Executable file

#!/bin/bash
set -euo pipefail
usage() {
cat <<'EOF'
Usage:
scripts/ios-release-upload.sh [--destination app-store|testflight] [--version 2026.7.2] [--revision 1] [--build-number 3]
scripts/ios-release-upload.sh --stage-only --version 2026.7.2 --revision 1 --build-number 3
Generates App Store screenshots, updates release metadata, archives, and uploads
an App Store distribution build to App Store Connect. This does not submit the
build for App Review. The testflight destination skips App Store staging and
distributes to the configured external group, submitting for beta review as needed.
--stage-only recovers the saved destination without rebuilding or uploading.
EOF
}
BUILD_NUMBER=""
APP_STORE_REVISION=""
RELEASE_VERSION=""
RELEASE_DESTINATION=""
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
source "${ROOT_DIR}/scripts/lib/ios-fastlane.sh"
STAGE_ONLY=0
if [[ "${1:-}" == "--stage-only" ]]; then
STAGE_ONLY=1
shift
fi
parse_ios_release_args upload "$@"
FASTLANE_ARGS=(ios release_upload)
if [[ "${STAGE_ONLY}" == 1 ]]; then
FASTLANE_ARGS=(ios release_stage)
fi
if [[ -n "${RELEASE_DESTINATION}" ]]; then
FASTLANE_ARGS+=("destination:${RELEASE_DESTINATION}")
fi
if [[ -n "${RELEASE_VERSION}" ]]; then
FASTLANE_ARGS+=("release_version:${RELEASE_VERSION}")
fi
if [[ -n "${APP_STORE_REVISION}" ]]; then
FASTLANE_ARGS+=("app_store_revision:${APP_STORE_REVISION}")
fi
if [[ -n "${BUILD_NUMBER}" ]]; then
FASTLANE_ARGS+=("build_number:${BUILD_NUMBER}")
fi
(
cd "${ROOT_DIR}/apps/ios"
# App Store Connect screenshot reservations can fail with 500s under parallel deliver uploads.
DELIVER_NUMBER_OF_THREADS=1 FL_MAX_NUMBER_OF_THREADS=1 OPENCLAW_IOS_RELEASE_WRAPPER=1 run_ios_fastlane "${FASTLANE_ARGS[@]}"
)