#!/bin/bash # Full build + deploy: AppImage, APK, CLI, website, anchor # Usage: ./deploy.sh # Requires: cargo, cargo-tauri, Android SDK, sshpass set -e # Load credentials from .deploy-creds (not in git) if [ -f .deploy-creds ]; then source .deploy-creds else echo "ERROR: .deploy-creds not found. Create it with:" echo ' SSH_PASS="your-ssh-password"' echo ' KS_PASS="your-keystore-password"' exit 1 fi SSH_HOST="itsgoin@itsgoin.com" SSH_OPTS="-o StrictHostKeyChecking=no" KEYSTORE="itsgoin.keystore" KS_ALIAS="itsgoin" VERSION=$(grep '"version"' crates/tauri-app/tauri.conf.json | head -1 | sed 's/.*"\([0-9.]*\)".*/\1/') echo "=== Deploying v${VERSION} ===" # Build CLI echo "=== Building CLI ===" cargo build -p itsgoin-cli --release & CLI_PID=$! # Build APK echo "=== Building APK ===" cargo tauri android build --apk & APK_PID=$! # Build AppImage (includes GStreamer patch) echo "=== Building AppImage ===" ./build-appimage.sh wait $CLI_PID echo "=== CLI build complete ===" wait $APK_PID echo "=== APK build complete ===" # Sign APK echo "=== Signing APK ===" UNSIGNED="crates/tauri-app/gen/android/app/build/outputs/apk/universal/release/app-universal-release-unsigned.apk" ALIGNED="itsgoin-aligned.apk" SIGNED="itsgoin-${VERSION}.apk" ZIPALIGN=$(find ~/Android/Sdk/build-tools -name "zipalign" 2>/dev/null | sort -V | tail -1) APKSIGNER=$(find ~/Android/Sdk/build-tools -name "apksigner" 2>/dev/null | sort -V | tail -1) "$ZIPALIGN" -f 4 "$UNSIGNED" "$ALIGNED" "$APKSIGNER" sign --ks "$KEYSTORE" --ks-pass "pass:$KS_PASS" --ks-key-alias "$KS_ALIAS" --out "$SIGNED" "$ALIGNED" echo "Signed: $SIGNED" # Upload (sequential to avoid SSH rate limiting) echo "=== Uploading website ===" sshpass -p "$SSH_PASS" scp $SSH_OPTS website/*.html website/style.css "$SSH_HOST:~/public_html/" sleep 5 echo "=== Uploading AppImage ===" sshpass -p "$SSH_PASS" scp $SSH_OPTS "target/release/bundle/appimage/itsgoin_${VERSION}_amd64.AppImage" "$SSH_HOST:~/public_html/itsgoin_${VERSION}_amd64.AppImage" sleep 5 echo "=== Uploading APK ===" sshpass -p "$SSH_PASS" scp $SSH_OPTS "$SIGNED" "$SSH_HOST:~/public_html/" sleep 5 echo "=== Uploading CLI ===" sshpass -p "$SSH_PASS" scp $SSH_OPTS target/release/itsgoin "$SSH_HOST:~/public_html/itsgoin-cli-${VERSION}-linux-amd64" sleep 5 echo "=== Uploading anchor binary ===" sshpass -p "$SSH_PASS" scp $SSH_OPTS target/release/itsgoin "$SSH_HOST:~/bin/itsgoin.new" sleep 5 echo "=== Swapping anchor ===" sshpass -p "$SSH_PASS" ssh $SSH_OPTS "$SSH_HOST" 'kill $(cat ~/itsgoin-anchor.pid 2>/dev/null) 2>/dev/null; sleep 1; mv ~/bin/itsgoin.new ~/bin/itsgoin && chmod +x ~/bin/itsgoin && bash ~/bin/start-anchor.sh' sleep 2 echo "=== Verifying anchor ===" sshpass -p "$SSH_PASS" ssh $SSH_OPTS "$SSH_HOST" 'ps aux | grep "[i]tsgoin.*daemon"' echo "" echo "=== Deploy complete: v${VERSION} ===" echo "" echo "Windows installer: this script does NOT build the Windows .exe." echo "download.html carries a link to itsgoin-${VERSION}-windows-x64-setup.exe" echo "The Windows build host needs to produce that file and SCP it to:" echo " $SSH_HOST:~/public_html/itsgoin-${VERSION}-windows-x64-setup.exe" echo "Until they do, the Windows download link 404s (stable-target pattern)."