Files
ios-gitea-prs/.gitea/workflows/build.yml
T
Hermes ba3cda06bb
Build iOS App / Build .ipa and publish source (push) Failing after 4m46s
Add iOS app icon (git merge symbol) + upload icon in CI; bump to 2.7
Generate a clean, centered git merge/PR icon via ComfyUI (DreamShaper on
wilkes) and bundle it as the app icon. Update the CI workflow to extract the
icon from the built bundle and upload it as icon.png so SideStore shows it.
Bump to 2.7.
2026-08-13 13:31:18 +00:00

100 lines
3.9 KiB
YAML

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 <<EOF
{
"name": "GiteaPR",
"bundleIdentifier": "com.bueso.giteapr",
"developerName": "Luis",
"localizedDescription": "Manage Gitea pull requests from your iPhone.",
"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.
# Extract the app icon from the built bundle as icon.png (the
# metadata's iconURL points at https://apps.bueso.eu/$APP_NAME/icon.png).
APP_PATH=$(find build/Build/Products -name "*.app" -type d | head -1)
cp "$APP_PATH/AppIcon.png" icon.png 2>/dev/null || true
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/"