The v0.7.0 release surfaced a real bug: parallel cargo invocations
all writing to target/ caused linuxdeploy to fail mid-AppImage bundle
("Error failed to bundle project failed to run linuxdeploy"). Cargo's
own target-dir locking doesn't fully serialize three concurrent
cargo-front-ends across CLI + Android-cross-compile + tauri-bundle.
Solo cargo tauri build succeeded immediately after deploy.sh aborted,
confirming the parallel invocation was the root cause.
Switching to serial builds. The extra wall time is small because
cargo's incremental cache deduplicates compilation of the shared
itsgoin-core crate across the three builds.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
102 lines
3.9 KiB
Bash
Executable file
102 lines
3.9 KiB
Bash
Executable file
#!/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} ==="
|
|
|
|
# Builds run SERIALLY — parallel cargo invocations write to the same
|
|
# target/ directory, which causes intermittent failures (linuxdeploy
|
|
# blowing up mid-AppImage was the v0.7.0 release symptom). The extra
|
|
# wall time vs. the parallel version is small because cargo's
|
|
# incremental cache deduplicates the shared core crate compilation.
|
|
|
|
echo "=== Building AppImage (includes GStreamer patch) ==="
|
|
./build-appimage.sh
|
|
|
|
echo "=== Building APK ==="
|
|
cargo tauri android build --apk
|
|
|
|
echo "=== Building CLI ==="
|
|
cargo build -p itsgoin-cli --release
|
|
|
|
# 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 + publishing release announcement ==="
|
|
# Kill running anchor, swap binary, post signed release announcement as a
|
|
# one-shot (anchor DB is free during the gap), then restart the anchor.
|
|
# The new announcement post propagates via the normal CDN on next sync.
|
|
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
|
|
~/bin/itsgoin ~/itsgoin-anchor-data \
|
|
--announce \
|
|
--ann-category release \
|
|
--ann-channel stable \
|
|
--ann-version ${VERSION} \
|
|
--ann-url https://itsgoin.com/download.html \
|
|
--ann-title 'ItsGoin v${VERSION} available' \
|
|
--ann-body 'See changelog at https://itsgoin.com/download.html' \
|
|
2>&1 | tail -5
|
|
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)."
|