#!/bin/bash set -e # Load environment variables from .env file if [ -f .env ]; then export $(grep -v '^#' .env | xargs) fi # Configuration VERSION="0.1.1" # Should match MARKETING_VERSION in project BUILD_NUMBER="1" # Should match CURRENT_PROJECT_VERSION in project RELEASES_DIR="./releases" APPCAST_OUTPUT="${RELEASES_DIR}/appcast.xml" FEED_URL="https://freno.me/api/Gaze/appcast.xml" DMG_NAME="Gaze-${VERSION}.dmg" # Find Sparkle generate_appcast tool SPARKLE_BIN=$(find ~/Library/Developer/Xcode/DerivedData/Gaze-* -path "*/artifacts/sparkle/Sparkle/bin" -type d 2>/dev/null | head -1) if [ -z "$SPARKLE_BIN" ]; then echo "⚠️ Warning: Sparkle bin directory not found" echo "Appcast generation will be skipped" SPARKLE_BIN="" fi # Create releases directory mkdir -p "$RELEASES_DIR" # Remove old DMG if exists rm -f "$DMG_NAME" echo "Creating DMG..." create-dmg \ --volname "Gaze Installer" \ --eula "./LICENSE" \ --window-pos 200 120 \ --window-size 600 400 \ --icon-size 100 \ --background "./dmg_background.png" \ --icon "Gaze.app" 160 200 \ --app-drop-link 440 200 \ "$DMG_NAME" \ "./Gaze.app" # Copy DMG to releases directory echo "Copying DMG to releases directory..." cp "$DMG_NAME" "$RELEASES_DIR/" # Generate appcast if Sparkle tools are available if [ -n "$SPARKLE_BIN" ] && [ -d "$SPARKLE_BIN" ]; then echo "" echo "Generating appcast..." # Generate appcast with download URL prefix "$SPARKLE_BIN/generate_appcast" \ --download-url-prefix "https://freno.me/downloads/" \ "$RELEASES_DIR" # Verify appcast was generated if [ -f "$APPCAST_OUTPUT" ]; then echo "✅ Appcast generated successfully" echo "📋 Appcast location: $APPCAST_OUTPUT" # Show signature verification if grep -q "edSignature" "$APPCAST_OUTPUT"; then echo "✅ EdDSA signature verified in appcast" else echo "⚠️ Warning: No EdDSA signature found in appcast" fi else echo "❌ Failed to generate appcast" fi else echo "" echo "⚠️ Skipping appcast generation (Sparkle tools not found)" echo "To generate appcast manually, run:" echo " ./generate_appcast --download-url-prefix 'https://freno.me/downloads/' '$RELEASES_DIR'" fi # Upload to AWS S3 if environment variables are set if [ -n "$AWS_ACCESS_KEY_ID" ] && [ -n "$AWS_SECRET_ACCESS_KEY" ] && [ -n "$AWS_BUCKET_NAME" ] && [ -n "$AWS_REGION" ]; then echo "" echo "Uploading to S3 bucket: $AWS_BUCKET_NAME..." # Export AWS credentials for aws-cli export AWS_ACCESS_KEY_ID="$AWS_ACCESS_KEY_ID" export AWS_SECRET_ACCESS_KEY="$AWS_SECRET_ACCESS_KEY" export AWS_DEFAULT_REGION="$AWS_REGION" # Upload DMG to S3 aws s3 cp "$RELEASES_DIR/$DMG_NAME" "s3://$AWS_BUCKET_NAME/downloads/$DMG_NAME" --region "$AWS_REGION" # Upload appcast if it exists if [ -f "$APPCAST_OUTPUT" ]; then aws s3 cp "$APPCAST_OUTPUT" "s3://$AWS_BUCKET_NAME/api/Gaze/appcast.xml" --region "$AWS_REGION" echo "✅ Appcast uploaded to S3" fi echo "✅ Upload complete!" echo " DMG: s3://$AWS_BUCKET_NAME/downloads/$DMG_NAME" echo " Appcast: s3://$AWS_BUCKET_NAME/api/Gaze/appcast.xml" else echo "" echo "⚠️ Skipping S3 upload - AWS credentials not found in .env" fi echo "" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "Release artifacts created:" echo " 📦 DMG: $RELEASES_DIR/$DMG_NAME" if [ -f "$APPCAST_OUTPUT" ]; then echo " 📋 Appcast: $APPCAST_OUTPUT" fi echo "" echo "Next steps:" echo " 1. Upload DMG to: https://freno.me/downloads/$DMG_NAME" echo " 2. Upload appcast to: $FEED_URL" echo " 3. Verify appcast is accessible and valid" echo " 4. Test update from previous version" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"