name: Build VoidLink IPA on: push: branches: - Integration 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: VoidLink # 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: Checkout submodules run: git submodule update --init --recursive - name: Select Xcode run: xcodebuild -version - name: Build unsigned .ipa run: | # Build the app (no signing — SideStore signs on-device). # VoidLink's scheme is auto-generated from the VoidLink target. # Release config → bundle id com.voidlink.tf.iOS (Debug uses # com.voidlink.tf.debug10.iOS), so the .ipa matches the metadata. xcodebuild \ -scheme VoidLink \ -sdk iphoneos \ -configuration Release \ archive \ -archivePath $PWD/build/VoidLink.xcarchive \ CODE_SIGN_IDENTITY="" \ CODE_SIGNING_REQUIRED="NO" \ CODE_SIGN_ENTITLEMENTS="" \ CODE_SIGNING_ALLOWED="NO" # Package the .app bundle into an .ipa (Payload/App.app structure) mkdir -p build/IPA/Payload cp -R build/VoidLink.xcarchive/Products/Applications/VoidLink.app build/IPA/Payload/VoidLink.app cd build/IPA zip -r ../../$APP_NAME.ipa Payload cd ../.. ls -la $APP_NAME.ipa - name: Generate app metadata run: | # Read the version from the built app so it always matches the .ipa # (no hardcoded drift). CFBundleShortVersionString = MARKETING_VERSION. VERSION=$(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" \ build/VoidLink.xcarchive/Products/Applications/VoidLink.app/Info.plist) SIZE=$(stat -f%z $APP_NAME.ipa) DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") # 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 <