workflows: ios-release: name: SilverApple iOS Release instance_type: mac_mini_m2 max_build_duration: 30 triggering: events: - tag tag_patterns: - pattern: 'v*' include: true environment: xcode: latest groups: - SLABS vars: BUNDLE_ID: uk.silverlabs.silverapple GITEA_REPO: SilverLABS/SilverApple GITEA_API: https://git.silverlabs.uk/api/v1 scripts: - name: Generate Xcode project script: | brew install xcodegen xcodegen generate --spec project.yml - name: Build (unsigned) script: | xcodebuild archive \ -project SilverApple.xcodeproj \ -scheme SilverApple \ -destination "generic/platform=iOS" \ -configuration Release \ -archivePath "$CM_BUILD_DIR/SilverApple.xcarchive" \ CODE_SIGNING_ALLOWED=NO \ CODE_SIGNING_REQUIRED=NO \ CODE_SIGN_IDENTITY="" \ PROVISIONING_PROFILE="" - name: Package IPA script: | cd "$CM_BUILD_DIR" APP=$(find SilverApple.xcarchive/Products -name "*.app" -type d | head -1) if [ -z "$APP" ]; then echo "ERROR: No .app found in xcarchive. Contents:" find SilverApple.xcarchive -type d | head -30 exit 1 fi echo "Packaging: $APP" mkdir -p Payload cp -r "$APP" Payload/ zip -r SilverApple.ipa Payload/ rm -rf Payload echo "IPA size: $(du -sh SilverApple.ipa | cut -f1)" - name: Publish to Gitea script: | set -exo pipefail [ -n "$GITEA_TOKEN" ] || { echo "ERROR: GITEA_TOKEN is not set in Codemagic env vars"; exit 1; } echo "TAG=$CM_TAG BUILD_DIR=$CM_BUILD_DIR" echo "GITEA_API=$GITEA_API TOKEN_SET=yes" TAG="${CM_TAG:-$(git tag --points-at HEAD | head -1)}" [ -n "$TAG" ] || { echo "ERROR: could not determine tag"; exit 1; } VERSION="${TAG#v}" IPA="$CM_BUILD_DIR/SilverApple.ipa" # Verify IPA exists ls -lh "$IPA" SHA256=$(shasum -a 256 "$IPA" | awk '{print $1}') SIZE=$(wc -c < "$IPA" | tr -d ' ') DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") DOWNLOAD_URL="https://git.silverlabs.uk/$GITEA_REPO/releases/download/$TAG/SilverApple.ipa" # Update altstore-source.json jq --arg version "$VERSION" \ --arg date "$DATE" \ --arg url "$DOWNLOAD_URL" \ --arg sha "$SHA256" \ --argjson size "$SIZE" \ '.apps[0].downloadURL = $url | .apps[0].versions = [{"version": $version, "buildVersion": $version, "date": $date, "localizedDescription": "See release notes.", "downloadURL": $url, "sha256": $sha, "size": $size}] + .apps[0].versions' \ altstore-source.json > altstore-source.tmp.json mv altstore-source.tmp.json altstore-source.json # Get current file SHA from Gitea API FILE_SHA=$(curl -s \ -H "Authorization: token $GITEA_TOKEN" \ "$GITEA_API/repos/$GITEA_REPO/contents/altstore-source.json" \ | jq -r '.sha') echo "FILE_SHA=$FILE_SHA" # Update altstore-source.json via Gitea contents API CONTENT=$(base64 -i altstore-source.json | tr -d '\n') curl -s -X PUT "$GITEA_API/repos/$GITEA_REPO/contents/altstore-source.json" \ -H "Authorization: token $GITEA_TOKEN" \ -H "Content-Type: application/json" \ -d "{\"message\":\"chore(altstore): update source for $TAG\",\"content\":\"$CONTENT\",\"sha\":\"$FILE_SHA\",\"branch\":\"main\"}" \ | jq -r '.commit.sha // "FAILED"' # Create Gitea release RELEASE_ID=$(curl -s -X POST "$GITEA_API/repos/$GITEA_REPO/releases" \ -H "Authorization: token $GITEA_TOKEN" \ -H "Content-Type: application/json" \ -d "{\"tag_name\":\"$TAG\",\"name\":\"SilverApple $TAG\",\"body\":\"AltStore / SideStore release.\",\"draft\":false,\"prerelease\":false}" \ | jq -r '.id') echo "RELEASE_ID=$RELEASE_ID" # Upload IPA curl -s -X POST "$GITEA_API/repos/$GITEA_REPO/releases/$RELEASE_ID/assets" \ -H "Authorization: token $GITEA_TOKEN" \ -F "attachment=@$IPA;type=application/octet-stream" \ | jq -r '.name // "UPLOAD_FAILED"' echo "Done: $TAG → $DOWNLOAD_URL" artifacts: - $CM_BUILD_DIR/SilverApple.ipa