name: Build iOS App on: push: branches: - main workflow_dispatch: jobs: build: name: Build .ipa and publish source runs-on: macos env: # Per-app: change APP_NAME for each app repo. Used everywhere so the # perlis dir name and file names always match (no hardcoded drift). APP_NAME: GiteaPR # Point xcodebuild at full Xcode without sudo (sudo hangs in CI). # DEVELOPER_DIR overrides the active developer directory for all steps. DEVELOPER_DIR: /Applications/Xcode.app/Contents/Developer steps: - name: Checkout uses: actions/checkout@v4 - name: Select Xcode run: | xcodebuild -version - name: Build unsigned .ipa run: | # Build the app bundle (no signing — SideStore signs on-device) xcodebuild \ -project $APP_NAME.xcodeproj \ -scheme $APP_NAME \ -configuration Release \ -sdk iphoneos \ -destination 'generic/platform=iOS' \ -derivedDataPath build \ CODE_SIGNING_ALLOWED=NO \ CODE_SIGNING_REQUIRED=NO \ CODE_SIGN_IDENTITY="" \ build # Locate the .app bundle APP_PATH=$(find build/Build/Products -name "*.app" -type d | head -1) echo "App bundle: $APP_PATH" # Package into an .ipa (Payload/App.app structure) mkdir -p dist/Payload cp -R "$APP_PATH" dist/Payload/ cd dist zip -r ../$APP_NAME.ipa Payload cd .. ls -la $APP_NAME.ipa - name: Generate app metadata run: | # Read the version from the built app's Info.plist so it can never # drift from MARKETING_VERSION in the pbxproj. SideStore only shows an # update when the version changes, so a stale hardcoded version here # silently hides new builds. APP_PATH=$(find build/Build/Products -name "*.app" -type d | head -1) VERSION=$(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" "$APP_PATH/Info.plist") BUILD=$(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "$APP_PATH/Info.plist") SIZE=$(stat -f%z $APP_NAME.ipa) DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") echo "version=$VERSION build=$BUILD" # Per-app metadata file. The perlis aggregator folds this into the # root source.json at https://apps.bueso.eu/source.json. cat > $APP_NAME.json <