Build VoidLink IPA / Build .ipa and publish source (push) Successful in 4m3s
The built app reports CFBundleShortVersionString 0.0.1 (MARKETING_VERSION), but metadata hardcoded 1.0, so SideStore rejected the version mismatch. Now read the version from the built app's Info.plist so it always matches.
92 lines
3.6 KiB
YAML
92 lines
3.6 KiB
YAML
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 <<EOF
|
|
{
|
|
"name": "VoidLink",
|
|
"bundleIdentifier": "com.voidlink.tf.iOS",
|
|
"developerName": "Luis",
|
|
"localizedDescription": "VoidLink (Moonlight fork) - stream from your PC. Built via Gitea Actions.",
|
|
"iconURL": "https://apps.bueso.eu/$APP_NAME/icon.png",
|
|
"downloadURL": "https://apps.bueso.eu/$APP_NAME/$APP_NAME.ipa",
|
|
"version": "$VERSION",
|
|
"versionDate": "$DATE",
|
|
"size": $SIZE,
|
|
"permissions": []
|
|
}
|
|
EOF
|
|
cat $APP_NAME.json
|
|
|
|
- name: Upload to source host (perlis)
|
|
run: |
|
|
# Upload .ipa + per-app metadata + icon to perlis via SSH.
|
|
# PERLIS_SSH_HOST is the Tailscale MagicDNS name (perlis.bueso.loc),
|
|
# reachable from the iMac runner over the Tailscale mesh.
|
|
ssh -o StrictHostKeyChecking=no \
|
|
"${{ secrets.PERLIS_SSH_USER }}@${{ secrets.PERLIS_SSH_HOST }}" \
|
|
"mkdir -p /mnt/appdata/ios-apps/$APP_NAME"
|
|
scp -o StrictHostKeyChecking=no \
|
|
$APP_NAME.ipa $APP_NAME.json icon.png \
|
|
"${{ secrets.PERLIS_SSH_USER }}@${{ secrets.PERLIS_SSH_HOST }}:/mnt/appdata/ios-apps/$APP_NAME/"
|